Я работаю над приложением, которое пытается сопоставить входной набор потенциально "грязных" имен сущностей с "чистыми" именами сущностей в списке ссылок. Я работаю с расстоянием редактирования и другими распространенными алгоритмами нечеткого совпадения, но мне интересно, есть ли какие-либо более эффективные подходы, позволяющие взвешивать термин, так что общим условиям дают меньше веса в нечетком совпадении.
Рассмотрим этот пример, используя библиотеку Python difflib
. Я работаю с именами организаций, которые имеют много стандартизованных компонентов и поэтому не могут использоваться для дифференциации между объектами.
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
Оба примера высоко оценивают полную строку, потому что RESEARCH
, INSTITUTE
, SEMICONDUCTOR
, MANUFACTURING
и CORP
- это высокочастотные, общие термины во многих именах организаций. Я ищу любые идеи о том, как интегрировать частотные диапазоны в соответствие нечеткой строкой (не обязательно используя difflib
), так что на оценки не влияют общие термины, и результаты могут больше походить на "e1b", и "e2b".
Я понимаю, что могу просто сделать большой список "частых терминов" и исключить из сравнения, но я хотел бы использовать частоты, если это возможно, потому что даже обычные слова добавляют некоторую информацию, а также точку отсечения для любого списка конечно, также произвольны.