Соответствие названия компаний примерно

1

У меня 12 миллионов имен компаний в моем db. Я хочу сопоставить их со списком в автономном режиме. Я хочу знать лучший алгоритм для этого. Я сделал это через расстояние Левентиенса, но он не дает ожидаемых результатов. Не могли бы вы предложить некоторые алгоритмы для того же. Проблема совпадала с такими компаниями, как

G corp. ----this need to be mapped to G corporation
water Inc -----Water Incorporated
  • 0
    наконец, как вы решили свою проблему?
  • 0
    Пока нет, пробую разные варианты
Теги:
algorithm
string-matching
levenshtein-distance
jaro-winkler

2 ответа

2

Вы можете использовать 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))
  • 0
    Fuzzyset тратит часы на загрузку 12 миллионов компаний. Есть ли другой пакет, который может помочь?
  • 0
    Как я уже сказал, spacy - это очень хорошая библиотека.
2

Вероятно, вы должны начать с расширения известных суффиксов в обоих списках (база данных и список). Для получения правильного отображения, например, с регулярными выражениями, потребуется ручная работа:

  • \s+inc\.?$Incorporated
  • \s+corp\.?$Corporation

Возможно, вы захотите выполнить иную нормализацию, например, обрезать все, удалить знаки препинания и т.д.

Затем вы можете использовать расстояние Левенштейна или другой алгоритм нечеткого совпадения.

  • 0
    Есть сотни таких нормализаций. Поэтому я ожидаю некоторый алгоритм, который может справиться с такими случаями
  • 1
    @Shashank: тот факт, что "Corp." «Корпорация» означает человеческую конструкцию, а не логическую. Таким образом, единственный алгоритм, чтобы обнаружить это, вручную сказать это. Конечно, могут быть лучшие или худшие способы сделать это, но что-нибудь удаленно функциональное будет играть на этом решении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню