Búsqueda de palabras clave de varias columnas con varias palabras clave

Un usuario Pregunto ✅

kscwp20

Hola

Lo siento de antemano por la pregunta bastante larga y por el uso de la terminología (o la falta de ella)! He visto las publicaciones similares en relación con las palabras clave y son útiles pero ligeramente apagados, principalmente debido al elemento múltiple de mi consulta.

Estoy tratando de realizar una búsqueda de palabras clave (idealmente eligiendo entre fuzzy, contiene y coincidencias de búsqueda idénticas) en la que hay listas varias (actualmente 😎 de palabras clave que contienen palabras o frases relacionadas con el tema de cada lista, por ejemplo, La lista de colores tiene rojo, azul, verde; Lista de formas tiene cuadrado, círculo, amarillo, etc. Algunas listas, sin embargo, contienen las mismas palabras, por ejemplo. la Lista de Frutas tiene naranja que también aparece en la Lista de Colores.

Usando cada una de las listas, estoy intentando buscar un conjunto de datos grandes y específicamente algunas columnas (actualmente 2) para las que quiero buscar en cada registro para ver si contiene las palabras de cada lista.

La solución actual que estoy usando implica la creación de estas listas y, a continuación, el uso del siguiente código M para buscar las dos columnas en el conjunto de datos, principalmente mediante la característica Invocar función personalizada («ICF»). Nota – ‘MyKeywords’ en el idioma siguiente se sustituye por el nombre de la lista correspondiente.

• (Cadena)>
Dejar
comprobar si los valores de MyKeywords está en String
MatchFound – List.Transform (List.Buffer («MyKeywords»), cada Text.Contains (String, _, Comparer.OrdinalIgnoreCase)),
posición del índice de la coincidencia encontrada
Posición: List.PositionOf (MatchFound, true),
devolver null si Posición es negativa
Devolver á if Position <0, then null else? "MyKeywords" -Position-
En
devolución

La salida de esto es, una continuación, una columna donde la palabra clave encontrada relacionada con la función se genera en cada registro o un ERROR si no se encuentra ninguna palabra. Lo que esto se acumula en 8 funciones diferentes que se utilizan en las 2 columnas separadas que dan un total de 16 pasos ICF en mi consulta. Actualmente, para un conjunto de datos ficticio de 20 filas, el tiempo necesario para procesar está bien, sin embargo, para un caso de uso final de aproximadamente 12k filas me preocupa que no será tan rápido.

Además, estoy tratando de contar también cuántas veces aparece una palabra clave (en todas las listas) para que se puedan contar y totalizar, incluso si un registro contiene dos palabras clave de una lista. Actualmente, si un registro contiene palabras clave de listas diferentes, se muestra como un «hit», ya que dará como resultado una coincidencia en la columna de salida de lista correspondiente. Sin embargo, no puedo saber si el registro contiene dos o más palabras clave de una lista (como se mencionó anteriormente) o si en ocasiones más raras, el registro contiene varias palabras clave de varias listas.

El contexto para comprender qué palabras clave de qué lista se encuentran junto con el número de veces que se encuentra cada palabra de la lista es que se aplica un sistema de puntuación / ponderación a cada uno de los registros, dependiendo de la lista de la que procede cada palabra clave y del número de palabras clave que se encuentran en el registro.

He experimentado con el uso de las funciones IF TEXTCONTAINS and SEARCH, pero estar unos días en PowerBI – mi experiencia no me lleva demasiado lejos.

Idealmente, no necesitaría crear listas y puede seleccionar una columna en una tabla equivalente a las listas y luego usar esa columna para realizar una función de tipo VLOOKUP / INDEX MATCH en las columnas múltiples – que reducirá los pasos de mi consulta para empezar!

Cualquier ayuda o punteros sería realmente muy útil – gracias!

En respuesta a kscwp20

Hola @ kscwp20,

1.Vaya al editor de consultas> seleccione «Tabla de palabras clave»> seleccione todas las columnas> columnas de unpivot:

Anotación 2020-04-16 181832.png

2. Cree una tabla ColumnHead:

Anotación 2020-04-16 182014.png

3.Crear 3 medidas como se indica a continuación:

KeywordColor = 
var  pn = SELECTEDVALUE('Table'[Project Name (PN)])
var pt = SELECTEDVALUE('Table'[Project Type (PT)])
return CONCATENATEX(FILTER(DISTINCT('Keywords table'[Value]),CONTAINSSTRING(pn,[Value]) || CONTAINSSTRING(pt,[Value])),[Value],",")
Count = 
var  pn = SELECTEDVALUE('Table'[Project Name (PN)])
var pt = SELECTEDVALUE('Table'[Project Type (PT)])
return COUNTROWS(FILTER(DISTINCT('Keywords table'[Value]),CONTAINSSTRING(pn,[Value]) || CONTAINSSTRING(pt,[Value])))

Measure 2 = 

    SWITCH (
        SELECTEDVALUE ( 'CoulmnHeader'[Value] ),
        "keyword", [KeywordColor],
        "count", ""& [Count]
    )

Finalmente verás:

Anotación 2020-04-16 182216.png

Para el archivo .pbix relacionado, haga clic aquí.

Saludos
Kelly
¿Respondí a tu pregunta? ¡Marca mi puesto como solución!

Greg_Deckler

Los datos de muestra y la salida esperada resultados fantásticos. Por favor, consulte este post sobre cómo obtener su pregunta respondida rápidamente: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

Estoy seguro de que ayudaría a @ImkeF y @edhans oa alguien como ellos a respond a su pregunta.

kscwp20

En respuesta a Greg_Deckler

Lo siento Greg – gracias por el consejo.

He detallado a continuación los datos de muestra (unas pocas filas) y mi metodología actual y la salida esperada / ideal.

Feliz de aclarar más si es necesario.

Gracias

Datos de muestra:

Conjunto de datos – Columnas para mirar a través de
Registro No. Nombre del proyecto (PN) Tipo de proyecto (PT)
1 Serpiente del Desierto Servicios Rojos
2 Disparos verdes Perro de sabueso
3 Tigre Púrpura Ciencias Forenses del Oso y el Atún
4 Vaca Santa Apple rápida
Listas de palabras clave: cada lista contiene palabras clave
Color Frutas Animales Pescado
Rojo manzana Serpiente Atún
Azul Plátano León Tiburón
Verde Naranja Tigre Caballa
Naranja Uva Oso Sardina
Púrpura Limón Perro Delfín

Salida de corriente:

Color – PN Color – PT Frutas – PN Frutas – PT Animales – PN Animales – PT Pescado – PN Pescado – PT
Nulo Rojo Nulo Nulo Serpiente Nulo Nulo Nulo
Verde Nulo Nulo Nulo Perro Nulo Nulo Nulo
Púrpura Nulo Nulo Nulo Tigre Oso Nulo Atún
Nulo Nulo Nulo manzana Vaca Nulo Nulo Nulo

Para obtener el recuento, desbloqueo el conjunto de datos para crear el «Atributo» como el título de la lista de palabras clave y «Valor» como palabra clave.

A continuación, agrupe las filas por nombre de proyecto / tipo de proyecto y contando el número de filas (es decir, número de palabras clave).

Salida ideal / esperada:

Palabras clave Contar
Color Frutas Animales Pescado Color Frutas Animales Pescado Recuento total
Rojo Serpiente 1 1 2
Verde Perro 1 1 2
Púrpura Tigre, Oso Atún 1 2 1 4
manzana Vaca 1 1 2

En respuesta a kscwp20

Hola @ kscwp20,

1.Vaya al editor de consultas> seleccione «Tabla de palabras clave»> seleccione todas las columnas> columnas de unpivot:

Anotación 2020-04-16 181832.png

2. Cree una tabla ColumnHead:

Anotación 2020-04-16 182014.png

3.Crear 3 medidas como se indica a continuación:

KeywordColor = 
var  pn = SELECTEDVALUE('Table'[Project Name (PN)])
var pt = SELECTEDVALUE('Table'[Project Type (PT)])
return CONCATENATEX(FILTER(DISTINCT('Keywords table'[Value]),CONTAINSSTRING(pn,[Value]) || CONTAINSSTRING(pt,[Value])),[Value],",")
Count = 
var  pn = SELECTEDVALUE('Table'[Project Name (PN)])
var pt = SELECTEDVALUE('Table'[Project Type (PT)])
return COUNTROWS(FILTER(DISTINCT('Keywords table'[Value]),CONTAINSSTRING(pn,[Value]) || CONTAINSSTRING(pt,[Value])))

Measure 2 = 

    SWITCH (
        SELECTEDVALUE ( 'CoulmnHeader'[Value] ),
        "keyword", [KeywordColor],
        "count", ""& [Count]
    )

Finalmente verás:

Anotación 2020-04-16 182216.png

Para el archivo .pbix relacionado, haga clic aquí.

Saludos
Kelly
¿Respondí a tu pregunta? ¡Marca mi puesto como solución!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *