tag name php text-mining information-extraction nlp

php - get tag name wordpress



Elegir o generar variante canónica a partir de múltiples oraciones. (4)

Estoy trabajando con una API que asigna mis consultas de GTIN / EAN a los datos del producto.

Dado que los datos devueltos se originan en los feeds de productos comerciales, el siguiente es casi universalmente el caso:

  • Múltiples resultados por GTIN
  • Los títulos de los productos son bastante desestructurados.
  • Los títulos de los productos están "contaminados" con
    • Cosas relacionadas con SEO,
    • información sobre la cantidad contenida,
    • "Compra dos, consigue una gratis" ofertas,
    • etc.

Estoy buscando una forma programática para cualquiera

  • Elija la versión "más limpia" / más canónica disponible
  • o generar uno nuevo que represente el "denominador común más bajo".

Considere los siguientes resultados de ejemplo para una sola consulta EAN:

  • Nivea Deo Roll-On Dry Impact para Hombres
  • NIVEA DEO Roll on Dry / Blau
  • Nivea Deo Roll-On Dry Impact para hombre, 50 ml, paquete 3er (3 x 50 ml)
  • Nivea Deo Roll on Dry / blau 50 ml
  • Nivea Deoroller 50 ml en seco para Hombres blau Mindestabnahme: 6 Stück (1 VE)
  • NIVEA Deoroller, Dry Impact para Hombres.
  • NIVEA DEO Roll on Dry / blau_50 ml

Mi enfoque casero se parece a esto:

  • Limpieza básica:
    • Minúsculas los títulos,
    • quitar el espacio en blanco excesivo,
    • tirar las palabras clave aparentes como "comprar" y "hacer clic"
  • Construye una matriz para word => global occurence
    • "Nivea" => 7
    • "Deo" => 5
    • "Deoroller" => 2
    • "VE" => 1
  • Calcule el "valor de la palabra acumulativa" para cada uno de los títulos
    • "Nivea Deo" => 12
    • "Nivea Deoroller VE" => 10
  • Divide el valor acumulativo por la longitud del título, lo que resulta en una puntuación
    • "Nivea Deo" => 6
    • "Nivea Deoroller VE" => 3.34

Obviamente, mi enfoque es bastante básico, propenso a errores y sesgado hacia oraciones cortas con palabras de uso frecuente, con resultados más o menos satisfactorios.

  • ¿Elegirías un enfoque diferente?
  • ¿Hay alguna forma mágica de PNL para solucionar el problema que no conozco?

Carné de identidad:

  1. Convertir todas las cadenas a mayúsculas (o mayúsculas)
  2. Hacer una alineación de secuencias múltiples sobre todas las cadenas
  3. Convertir de nuevo a caja original
  4. Encuentra la letra más frecuente en cada columna.
  5. Eliminar los huecos

Para su ejemplo:

  1. Convertir todas las cadenas a mayúsculas (o mayúsculas)

    nivea deo roll-on dry impact for men nivea deo roll on dry/blau nivea deo roll-on dry impact for men, 50 ml, 3er pack (3 x 50 ml) nivea deo roll on dry/blau 50 ml nivea deoroller 50ml dry for men blau mindestabnahme: 6 stück (1 ve) nivea deoroller, dry impact for men nivea deo roll on dry/blau_50 ml

  2. Hacer una alineación de secuencias múltiples sobre todas las cadenas

    nivea deo roll°°-on °°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° nivea deo roll°° on °°dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° nivea deo roll°°-on °°dry °°°°°°°°°°impact for men, 50 ml, 3er pack (3 x 50 ml)°°°°°°° nivea deo roll°° on °°dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°° nivea deo°roller 50ml dry °°°°°°°°°°°°°°°°°for men blau mindestabnahme: 6 stück (1 ve) nivea deo°roller, °°°°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° nivea deo roll°° on °°dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

    (donde ° denota un carácter de brecha)

  3. Convertir de nuevo a caja original

    Nivea Deo Roll°°-On °°Dry °°°°°°°°°°Impact for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° NIVEA DEO Roll°° on °°Dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Nivea Deo Roll°°-On °°Dry °°°°°°°°°°Impact for Men, 50 ml, 3er Pack (3 x 50 ml)°°°°°°° Nivea Deo Roll°° on °°Dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Nivea Deo°roller 50ml dry °°°°°°°°°°°°°°°°°for Men blau Mindestabnahme: 6 Stück (1 VE) NIVEA Deo°roller, °°°°Dry °°°°°°°°°°Impact for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° NIVEA DEO Roll°° on °°Dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

  4. Encuentra la letra más frecuente en cada columna.

    Nivea Deo Roll°° on °°Dry °°°°°°°°°°°°°°°°°for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

  5. Eliminar los huecos

    Nivea Deo Roll on Dry for Men

Todo, excepto el paso 2 (alineación de secuencias múltiples) es sencillo. La alineación de secuencias múltiples se usa comúnmente en bioinformática, ver por ejemplo. here o here o aquí ... Ciertamente puedes encontrar código C o Java, pero no estoy seguro acerca de PHP.

Actualizar:

Para comenzar con la alineación múltiple, la llamada "alineación de estrella" es básicamente una combinación de alineaciones de pares de una secuencia (el "centro de la estrella") entre sí. Una alineación por pares se suele calcular utilizando la programación dinámica, ver, por ejemplo, here o here . Para producir alineación múltiple, elige una de tus cadenas para que sea el centro de la estrella. Encuentra las alineaciones de pares entre esta y cada otra cadena y luego alineas las alineaciones de pares introduciendo espacios en ellas para que los centros de estrella en todas las alineaciones estén perfectamente alineados. Puede repetir el procedimiento utilizando el resultado del paso anterior como centro de la estrella para el siguiente hasta que converja, es decir, el resultado no cambia.

Actualización 2: También puede usar palabras completas como símbolos (quants, átomos) para alinear. Diga, A = nivea , B = deo etc. Esto tiene las siguientes ventajas:

  1. Las palabras no pueden ser alteradas por la alineación y son tratadas por igual, independientemente de su longitud
  2. Al realizar una alineación por pares, puede asignar costos para sustituir palabras individuales ("símbolos") de acuerdo con TF-IDF y sus sinónimos. La alineación por pares intenta minimizar (ponderada) la distancia de Levenshtein entre las secuencias.

En su ejemplo (pruébelo usted mismo) esto llevaría a

Nivea Deo Roll on Dry for Men 50 ml

Es decir, llegamos aquí también los 50 ml . Esto se debe a que omitir palabras de dos letras no es más barato que omitir palabras de 20 letras.


Debido a que su métrica existente parece sesgarse hacia frases más cortas, debe considerar la inclusión de bigramas en la mezcla. Entonces, en lugar de considerar las puntuaciones solo para palabras individuales, también considere la puntuación para pares de palabras consecutivos (por ejemplo, ''nivea deo'', deo roll-on '','' roll-on dry '', etc.). Al calcular la puntuación para cada título, tenga en cuenta las puntuaciones para cada unigrama y bigrama que pueda generar juntos fuera del título, pero quizás le dé más peso a los bigramas, y esto debería alentar a su algoritmo a preferir frases más largas.

Si tiene a su disposición un gran corpus de muchos nombres como estos, considere usar algo como TF-IDF
Lo que estás haciendo bien puede compararse con solo usar TF. Usando su corpus global, puede calcular la idf de cada unigram y bigrama, que es básicamente una medida de una palabra o frase única o rara en todo el corpus.
tf = el número de veces que ha visto un ngram dentro de estos resultados
idf = una medida global de qué tan único podría ser un ngram en todos los resultados (o al menos un gran número de ellos)
Entonces, al calcular la puntuación de un título, en lugar de simplemente sumar los tf de cada ngram en él, se agrega el tf * idf de cada ngram en su lugar. Los ngrams más raros (que posiblemente hacen un mejor trabajo para distinguir este elemento de todos los demás elementos) tienen una idf más alta, por lo que su algoritmo debería darles un mayor peso. Un montón de términos basura (como Mindestabnahme) tendrían un idf realmente alto, pero tendrían un tf muy pequeño, por lo que podrían no hacer una gran diferencia. Alternativamente, pode las fichas que vea menos de k veces, para eliminar el ruido.

Otro truco de la PNL que se debe conocer es la distancia de Levenshtein ... que es una forma de cuantificar qué tan similares son dos cadenas. Puede calcular la distancia de levenshtein entre cada par de cadenas dentro de sus resultados, y luego intente preferir el resultado que tiene la distancia promedio más baja de todas las demás cadenas. Es posible que esto no funcione bien por sí solo ... pero tener en cuenta este puntaje con su enfoque existente podría ayudarlo a navegar por algunos casos difíciles.


Si entendí bien, no está comparando esos nombres con la base de datos existente, sino tratando de acercarse lo más posible al nombre real del producto, así que esta es mi idea:

  1. No realice la limpieza habitual, solo elimine los espacios en blanco adicionales, deje intactas las palabras de detención, el caso de los caracteres, los separadores (como el guión).
  2. Dividir cadenas en términos en espacios en blanco.
  3. Dividir términos en separadores, número / carácter, mayúsculas y minúsculas, pero no eliminar originales, solo agregar otros adicionales justo después del término dividido, escribir en minúsculas todos los términos, eliminar términos duplicados y vacíos
  4. Elimine los términos que no son comunes para el% fijo de las cadenas (si fuera el 40 o el 95% lo sabrá después de las pruebas): esto eliminará la mayoría, si no todas, las cosas agregadas por los comerciantes.
  5. Encuentra la posición más común para cada término.
  6. Si obtiene más de un término con la misma posición más común, verifique cuál de ellos es más común que el otro. Aumente la posición "más floja" en 1, repita hasta que no haya conflicto
  7. Para cada término que queda, seleccione la capitalización más común
  8. Fusionar los términos restantes

Usando tu ejemplo funcionaría así:

Paso 1:

Nivea Deo Roll-On Dry Impact para Hombres

NIVEA DEO Roll on Dry / Blau

Nivea Deo Roll-On Dry Impact para hombre, 50 ml, paquete 3er (3 x 50 ml)

Nivea Deo Roll on Dry / blau 50 ml

Nivea Deoroller 50 ml en seco para Hombres blau Mindestabnahme: 6 Stück (1 VE)

NIVEA Deoroller, Dry Impact para Hombres.

NIVEA DEO Roll on Dry / blau_50 ml

Paso 2:

Nivea, Deo, Roll-On, Seco, Impacto, para, Hombres

NIVEA, DEO, Roll, on, Dry / blau

Nivea, Deo, Roll-On, Dry, Impacto, para, Hombres, 50, ml, 3er, Paquete, (3, x, 50, ml)

Nivea, Deo, Roll, on, Dry / blau, 50, ml

Nivea, Deoroller, 50ml, seco, para, Men, blau, Mindestabnahme :, 6, Stück, (1, VE)

NIVEA, Deoroller, Dry, Impacto, para, Hombres

NIVEA, DEO, Roll, on, Dry / blau_50, ml

Paso 3:

nivea, deo, roll-on, roll, on, dry, impact, for, men

nivea, deo, roll, on, dry / blau, dry, blau

nivea, deo, roll-on, roll, on, dry, impact, for, men, 50, ml, 3er, pack, 3, x, 50, ml

nivea, deo, roll, on, dry, blau, 50, ml

nivea, deoroller, 50ml, 50, ml, seco, para, hombres, blau, mindestabnahme, 6, stück, 1, ve

nivea, deoroller, seco, impacto, para, hombres.

nivea, deo, roll, on, dry / blau, dry, blau, 50, ml

Paso 4: (asumiendo un umbral del 60%)

nivea, deo, roll, on, dry, para, hombres

nivea, deo, roll, on, dry, blau

nivea, deo, roll, on, dry, para, hombres, 50, ml

nivea, deo, roll, on, dry, 50, ml

nivea, 50, ml, seco, para, hombres, blau

nivea, seco, para, hombres

nivea, deo, roll, on, dry, blau, 50, ml

Paso 5:

nivea => 1

deo => 2

roll => 3

en => 4

seco => 5

para => 6

hombres => 7

blau => 6

50 => 8, 6, 2, 7

ml => 8, 7, 3, 8

Paso 6:

nivea => 1

deo => 2

roll => 3

en => 4

seco => 5

blau => 6

para => 7

hombres => 8

50 => 9

ml => 10

Paso 7

Nivea, Deo, Roll, on, Dry, blau for, Men, 50, ml

Paso 8

Resultado final: Nivea Deo Roll on Dry blau for Men 50 ml

Este método tiene los siguientes problemas:

  1. No maneja bien los nombres con términos duplicados (o en absoluto, todas las apariciones de términos después de la primera se pierden)
  2. Está predispuesto a dividir las partes del nombre separadas por guiones o por mayúsculas (Nombre de producto) en las separadas por espacios, esto puede solucionarse si se comprueba la versión más común en el paso 8.

Tienes un problema de PNL muy bueno. He trabajado uno similar hace aproximadamente un año. También recomendaría el enfoque por adi92. Pero en caso de que necesite utilizar algún software de PNL, le sugiero la PNL de Stanford. El software y las respectivas publicaciones también están presentes aquí. http://nlp.stanford.edu/ Espero que esto ayude.