Сходство между двумя словами

15

Я ищу библиотеку Python, которая помогает мне определить сходство между двумя словами или предложениями.

Я буду выполнять преобразование аудио в текст, что приведет к появлению английского словаря или словарных слов (это может быть имя человека или компании). После этого мне нужно сравнить его с известным словом или словами.

Пример:

1) Результат преобразования текста в аудио: спасибо за вызов America Expansion будет сравниваться с American Express .

Оба предложения как-то похожи, но не одинаковы.

Похоже, мне нужно посмотреть, сколько символов они разделяют. Любые идеи будут отличными. Похоже, функциональность, как поиск Google "вы имели в виду" функцию.

gogasca
источник

Ответы:

14

Самый близкий был бы, как Ян упомянул в своем ответе, расстояние Левенштейна (также обычно называемое расстоянием редактирования).

В теории информации и информатике расстояние Левенштейна представляет собой строковую метрику для измерения разницы между двумя последовательностями. Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных правок (т. Е. Вставок, удалений или подстановок), необходимых для замены одного слова на другое.

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

import nltk
nltk.edit_distance("humpty", "dumpty")

Вышеприведенный код вернется 1, так как только одна буква отличается между двумя словами.

Dawny33
источник
1
Расстояние Лавенштиена - это худший алгоритм, который вы можете использовать, если НЛП - это то, что вы намерены делать. Если два синонима имеют различный набор символов, LD будет работать очень плохо в этих случаях.
Это ловушка
8

Помимо очень хороших ответов, вы можете попробовать SequenceMatcher в библиотеке difflib python.

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Теперь рассмотрим следующий код:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Теперь вы можете сравнить значение d, чтобы оценить сходство.

SVK
источник
1
Если вы чувствуете, что seq.ratio () работает медленно, вы можете использовать seq.quick_ratio ()
Набин
6

Если ваш словарь не слишком большой, то обычным подходом является определение расстояния Левенштейна, которое в основном подсчитывает, сколько изменений нужно сделать, чтобы перейти от одного слова к другому. Изменения включают в себя изменение символа, удаление символа или добавление символа. Пример из Википедии :

лев (котенок сидит) = 3

  • к иттен -> с иттен
  • сит е н -> сит т н н
  • сижу -> сижу г

Вот некоторые инструменты Python для Wikibooks.

Однако алгоритм для вычисления этих расстояний не из дешевых. Если вам нужно сделать это в больших масштабах, есть способы использовать косинусное сходство на двухграммных векторах, которые намного быстрее и проще распределить, если вам нужно найти совпадения для большого количества слов одновременно. Они, однако, только приближение к этому расстоянию.

Ян ван дер Вегт
источник
(+1) для Лев. Метрика расстояния. Nltk поставляется с готовой реализацией. Косинусное сходство не является хорошим показателем сходства строк ИМХО :)
Dawny33
Я согласен, что это намного хуже, чем расстояние Левенштейна, но если вам нужно нечеткое сопоставление между двумя наборами данных из миллионов, оно действительно может сделать это за разумное время из-за необходимости некоторых хитростей и умножения матриц
Ян ван дер Вегт
1
@ Dawny33 Я бы не согласился. Мало того, что косинусное сходство сработало очень быстро для меня, но и очень точно, учитывая, что был использован правильный n-грамм.
Мохит Мотвани
3

Старый и хорошо известный метод сравнения - алгоритм Soundex . Идея состоит в том, чтобы сравнить не сами слова, а приблизительные значения их произношения. Насколько это на самом деле улучшает качество результатов, я не знаю.

Однако немного странно применять что-то вроде Soundex к результатам из механизма распознавания речи в текст. Сначала вы выбрасываете информацию о том, как произносятся слова, а затем пытаетесь добавить ее снова. Было бы лучше объединить эти две фазы.

Следовательно, я ожидаю, что современные технологии в этой области сделают это, и станут некой формой адаптивной классификации, например, основанной на нейронных сетях. Google возвращает недавнее исследование по распознаванию речи в нейронных сетях .

reinierpost
источник