У меня 12 миллионов имен компаний в моем db. Я хочу сопоставить их со списком в автономном режиме. Я хочу знать лучший алгоритм для этого. Я сделал это через расстояние Левентиенса, но он не дает ожидаемых результатов. Не могли бы вы предложить некоторые алгоритмы для того же. Проблема совпадала с такими компаниями, как
G corp. ----this need to be mapped to G corporation
water Inc -----Water Incorporated
Вы можете использовать fuzzyset, поместить все имена своих компаний в нечеткое множество, а затем сопоставить новый термин, чтобы получить соответствующие баллы. Пример:
import fuzzyset
fz = fuzzyset.FuzzySet()
#Create a list of terms we would like to match against in a fuzzy way
for l in ["Diane Abbott", "Boris Johnson"]:
fz.add(l)
#Now see if our sample term fuzzy matches any of those specified terms
sample_term='Boris Johnstone'
fz.get(sample_term), fz.get('Diana Abbot'), fz.get('Joanna Lumley')
Кроме того, если вы хотите работать с семантикой, а не только с строкой (которая лучше работает в таких сценариях), то посмотрите на близость. Пример из документов spacy:
import spacy
nlp = spacy.load('en_core_web_md') # make sure to use larger model!
tokens = nlp(u'dog cat banana')
for token1 in tokens:
for token2 in tokens:
print(token1.text, token2.text, token1.similarity(token2))
Вероятно, вы должны начать с расширения известных суффиксов в обоих списках (база данных и список). Для получения правильного отображения, например, с регулярными выражениями, потребуется ручная работа:
\s+inc\.?$
→ Incorporated
\s+corp\.?$
→ Corporation
Возможно, вы захотите выполнить иную нормализацию, например, обрезать все, удалить знаки препинания и т.д.
Затем вы можете использовать расстояние Левенштейна или другой алгоритм нечеткого совпадения.