Estoy trabajando en una aplicación que intenta hacer coincidir un conjunto de entrada de nombres de entidades potencialmente "desordenados" para "limpiar" nombres de entidades en una lista de referencia. He estado trabajando con la distancia de edición y otros algoritmos de coincidencia difusa comunes, pero me pregunto si hay mejores enfoques que permitan la ponderación de términos, de modo que los términos comunes tengan menos peso en la coincidencia difusa.coincidencia de cadenas difusas con los pesos del término
Considere este ejemplo, utilizando la biblioteca difflib
de Python. Estoy trabajando con nombres de organizaciones, que tienen muchos componentes estandarizados en común y, por lo tanto, no se pueden usar para diferenciar entre entidades.
from difflib import SequenceMatcher
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE",
"LONDON RESEARCH INSTITUTE")
print e1a.ratio()
0.88
e1b = SequenceMatcher(None, "ZOECON", "LONDON")
print e1b.ratio()
0.333333333333
e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP",
"TAIWAN SEMICONDUCTOR MANUFACTURING CORP")
print e2a.ratio()
0.83950617284
e2b = SequenceMatcher(None, "WORLDWIDE",
"TAIWAN")
print e2b.ratio()
0.133333333333
Ambos ejemplos puntuar alto en la cadena completa, porque RESEARCH
, INSTITUTE
, SEMICONDUCTOR
, MANUFACTURING
y CORP
son de alta frecuencia, los términos genéricos en muchos nombres de organizaciones. Estoy buscando ideas sobre cómo integrar frecuencias de términos en la coincidencia de cadenas difusas (no necesariamente usando difflib
), de modo que las puntuaciones no están tan influenciadas por términos comunes, y los resultados pueden parecerse más a "e1b" y "e1b". e2b "ejemplos.
que se dan cuenta de que sólo podía hacer una gran lista de "frecuentes término" y excluir a los de la comparación, pero me gustaría utilizar frecuencias si es posible porque incluso palabras comunes añaden alguna información, y también el punto de corte para cualquier lista, por supuesto, también sería arbitraria.
[Whoosh] (https://bitbucket.org/mchaput/whoosh/wiki/Home) parece interesante, particularmente su ['scoring'] (http://packages.python.org/Whoosh/api/scoring. html) módulo y [whoosh.reading.TermInfo] (http://packages.python.org/Whoosh/api/reading.html?highlight=frequency#whoosh.reading.TermInfo) 'doc_frequency()' y 'peso() ' –
¿Tiene acceso al corpus completo de nombres para el partido difuso? Si es así, puede usar tf-idf para entrenar un modelo de coincidencia difusa. –
Puedes dividir las cuerdas y calcular la diferencia en cada pieza. Esto te ayudaría en algunas situaciones en las que tienes casi los mismos nombres pero con solo una diferencia de palabras. Pero esto probablemente no es lo suficientemente robusto para lo que quieres hacer. – Bakuriu