5 votos

Buscar palabras clave en párrafos de texto (en Excel)

Edición: Todas las respuestas funcionan muy bien, pero para un gran conjunto de datos el enfoque de la macro funcionó mejor. Pruebe todos ellos y ver lo que funciona mejor para usted.

Estoy intentando resolver este problema en Excel por cuestiones de rendimiento (lo he hecho en R pero es lento). Básicamente, necesito comparar cada palabra clave (de una lista de palabras clave) con el texto (esencialmente párrafos) en una columna.  Aquí hay una ilustración:

Los datos anteriores están en la fuente de esta pregunta en forma de texto, aptos para copiar y pegar.

He estado buscando algunas funciones de texto (como FIND y SEARCH, pero sólo devuelven posiciones), así que no estoy seguro de si esto se puede hacer en Excel.

0 votos

En serio, ¿quieres la salida para A6 en E5 (porque la salida para A5 es "ninguno")?

1 votos

@G-Man sí, lo siento si no quedó claro.

0 votos

Tengo una solución de fórmula pura utilizando TEXTJOIN pero sin eliminar los resultados vacíos, lo que significa que E5 vacío y la salida para A6 en E6. Más tarde, puedes eliminar manualmente (o mediante un simple script) esos resultados vacíos. Dime si te interesa.

3voto

A.S.H Puntos 300

Descargo de responsabilidad:

Es difícil estimar el rendimiento de la siguiente "fórmula de matriz" en un conjunto enorme de palabras clave. Funciona en un conjunto de datos razonable y da resultados "correctos".

El Fórmula de la matriz para E2 (Entonces la columna E de autorelleno) es:

E2:
=TEXTJOIN(", ",TRUE,REPT(C$2:C$99999,ISNUMBER(SEARCH(C$2:C$99999,A2))))

CTRLSHIFTENTER

Como dije, fue probado en un conjunto "razonablemente grande", digamos unos pocos miles, Así que lo publiqué como una solución general para situaciones similares, pero tengo dudas para su enorme conjunto de 700k (!).

Además, probablemente sea recomendable no guardar las fórmulas, sino sólo utilizarlas para el cálculo, luego fijar los valores y finalmente eliminar las celdas vacías. HTH

1 votos

Gracias por la respuesta. Entiendo lo que intentas hacer pero no me funciona. Esto es lo que obtengo: error

1 votos

@Hoju por la figura adjunta veo que no lo has introducido como fórmula de la matriz . Para introducirlo como tal, edite la celda E2 y a continuación pulse Ctrl+Shift+Enter . Después, copie/pegue la celda en la columna. Cuando la celda tiene una fórmula de matriz, la barra de fórmulas la muestra encerrada con {...}

0 votos

Tampoco pudo conseguir que esto funcionara.

2voto

Scott Puntos 10303

Asumiré que su pantalla muestra la salida para A6 en E5 (porque la salida para A5 es "ninguno") es un error, y realmente quieres la salida para A6 en E6 .

Me parece poco natural tener las palabras clave en una columna.  La salida para A_i_ está en E_i_ , y el valor en  C_i_ no tiene realmente nada que ver con las otras cosas de Row i .  Es más bien una m × n situación, en la que tienes m celdas (párrafos) de texto para buscar, y n palabras clave para buscar.  Pues bien, tenemos formas de solucionarlo.

Mi solución utiliza n +1 columnas de ayuda.  Desde n aquí es 5, eso significa 6 columnas de ayuda, que podrían ser Columnas F a través de K .  (Como es habitual con las columnas de ayuda, puede ponerlas donde quiera - puede ponerlas en Columnas AA a través de AF si quieres - y puedes ocultarlos).

La primera ( F ) se deja en blanco.  Introduzca

=OFFSET($C$1, COLUMN()-COLUMN($F:$F), 0)

en la célula G1 y arrastrar/rellenar hacia la derecha, para K1 .  Esto utiliza el número de columna actual (relativo al inicio del bloque de columnas de ayuda) como índice en la columna C las palabras clave, replicando así las palabras clave de la fila 1 (celdas G1 a través de K1 ).

A continuación, introduzca

=F2 & IF(ISNUMBER(SEARCH(G$1, $A2)), ", " & G$1, "")

en la célula G2 .  Arrastrar/rellenar a la derecha, a la celda K2 , y luego hacia abajo para cubrir el m filas que tienen datos en la columna A .  Esto busca el párrafo en la Columna A de la fila actual para la i que se encuentra en la fila 1 de la columna actual.  Si la encuentra (es decir, si SEARCH(…) devuelve un número; es decir, si ISNUMBER(SEARCH(…)) es verdadero), genera la palabra clave, precedida por una coma y un espacio.  Si no encuentra la palabra clave el IF(…) evalúa a una cadena nula.  (Si desea una comparación que distinga entre mayúsculas y minúsculas, sustituya SEARCH con FIND .)  Entonces, de cualquier manera el resultado se concatena con el valor de la celda de la izquierda.  Esto da como resultado, en la columna K , una lista separada por comas de las palabras clave que están presentes en el párrafo de la columna A de la fila actual.

A continuación, introduzca

=IF(K2="", "", RIGHT(K2, LEN(K2)-2))

en E2 y arrastrar/rellenar hacia abajo para cubrir las filas que tienen datos en la Columna A .  Esto dice que si el valor de la columna K es null, entonces se evalúa a null, de lo contrario, elimine el , desde el principio del valor en la columna K .

Aquí hay una imagen del resultado que obtuve para sus datos de entrada:

spreadsheet
(Haga clic para ampliar la imagen).

Nota en la celda E6 (la salida para A6 ) que mi solución enumera las palabras clave coincidentes en el orden en que aparecen en la columna C , mientras que su ilustración los enumera en el orden en que aparecen en la celda A6 .  Si eso es un problema, edita tu pregunta para decirlo y veré si puedo arreglarlo.

0 votos

Muchas gracias por la edición y por la respuesta. Tu enfoque funciona muy bien. El problema es que tengo 700k keywods (y cada vez más texto (por eso R es un dolor de cabeza) así que, ¿hay alguna manera de hacer esto sin usar una columna para cada palabra clave? En R, tomé la lista de palabras clave y la concatené con un operador OR en una sola célula y luego lo comparan con cada texto . Busqué esto en Excel y encontré que TEXTJOIN hace la concatenación fácilmente, pero no sé sobre el resto. PD: Sobre tu última pregunta, utilizando el orden de C no es un problema.

0 votos

Acabo de encontrar sobre Especificaciones de Excel así que concatena el palabras clave así en una sola célula no es una opción. ¿Tal vez tenga que buscar en las macros? Debería ser un simple bucle.

2voto

Gary's Student Puntos 4373

Prueba esta breve macro:

Sub KeyWord()
    Dim Na As Long, Nc As Long, ary, s As String
    Dim r As Range, a, i As Long, outpt As String

    Na = Cells(Rows.Count, "A").End(xlUp).Row
    Nc = Cells(Rows.Count, "C").End(xlUp).Row

    ReDim ary(1 To Nc)
    i = 1
    For Each r In Range("C1:C" & Nc)
        ary(i) = r.Text
        i = i + 1
    Next r

    For i = 1 To Na
        s = Cells(i, "A").Value
        outpt = ""
        For Each a In ary
            If InStr(1, s, a) > 0 Then
                outpt = outpt & "," & a
            End If
        Next a
        If outpt = "" Then
        Else
            Cells(i, "E").Value = Mid(outpt, 2)
        End If
    Next i

End Sub

por ejemplo:

enter image description here

EDIT#1:

Nuestro pequeño truco para capturar sólo las palabras completas es rodear cada palabra clave con espacios y cada frase con espacios.

Esto significa que [espacio] el [espacio] no coincidirá con teatro !:

Sub KeyWord_II_TheSequel()
    Dim Na As Long, Nc As Long, ary, s As String
    Dim r As Range, a, i As Long, outpt As String

    Na = Cells(Rows.Count, "A").End(xlUp).Row
    Nc = Cells(Rows.Count, "C").End(xlUp).Row

    ReDim ary(1 To Nc)
    i = 1
    For Each r In Range("C1:C" & Nc)
        ary(i) = r.Text
        ary(i) = " " & ary(i) & " "
        i = i + 1
    Next r

    For i = 1 To Na
        s = Cells(i, "A").Value
        s = " " & s & " "
        outpt = ""
        For Each a In ary
            If InStr(1, s, a) > 0 Then
                outpt = outpt & "," & a
            End If
        Next a
        If outpt = "" Then
        Else
            Cells(i, "E").Value = Mid(outpt, 2)
        End If
    Next i

End Sub

1 votos

Gracias por su macro. Tarda unos 30s por cada 100 filas en A con mi PC, ¡no está mal! :) Una pregunta, ¿sería posible extraer palabras y no cadenas? Es decir, si tuviera juncos en la columna A hacer NO coinciden con basura en la columna C . Así que en lugar de InStr(1, s, a) > 0 tendría que ser algo más.

0 votos

@Hoju no lo entiendo.

1 votos

En su ejemplo, si tiene or all como palabra clave en la columna C , daría una coincidencia para E$13 porque la macro busca una subcadena. ¿Sería posible buscar palabras en lugar de subcadenas? Así, sólo daría una coincidencia for all pero no or all .

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X