Схожість між двома словами


15

Я шукаю бібліотеку Python, яка допомагає мені виявити подібність між двома словами чи реченнями.

Я буду робити перетворення аудіо в текст, що призведе до словника англійської мови або слова без словника (Це може бути назва особи або компанії) Після цього мені потрібно порівняти це з відомим словом або словами.

Приклад:

1) Текст до аудіо результату: Дякуємо за те, що зателефонували до розширення America , порівняйте з American Express .

Обидва речення якось схожі, але не однакові.

Схоже, мені може знадобитися вивчити, скільки символів вони поділяють. Будь-які ідеї будуть чудовими. Виглядає така функціональність, як пошук Google "Ви мали на увазі" функцію.

Відповіді:


14

Найближче було б, як Ян згадував у своїй відповіді, відстань Левенштейна (також його в народі називають дистанцією редагування).

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

Це дуже часто вживаний показник для ідентифікації подібних слів. Nltk вже має реалізацію для метрики відстані редагування, яку можна викликати наступним чином:

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

Вищенаведений код повернеться 1, оскільки між двома словами лише одна літера.


1
Відстань Лавенштьєна - найгірший алгоритм, який можна використовувати, якщо NLP - це те, що ти маєш намір робити. Якщо два синоніми мають інший набір символів, 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 для оцінки подібності.


1
Якщо ви відчуваєте , що seq.ratio () повільно, ви можете використовувати seq.quick_ratio ()
Nabin

6

Якщо ваш словник не надто великий, загальним підходом є проходження відстані Левенштейна, яка в основному підраховує, скільки змін вам доведеться внести, щоб перейти від одного слова до іншого. Зміни включають зміну символу, видалення символу або додавання символу. Приклад з Вікіпедії :

лев (кошеня, сидячи) = 3

  • к itten -> s itten
  • сит e n -> sitt i n
  • sittin -> sittin g

Ось кілька реалізацій Python у Wikibooks.

Але алгоритм обчислення цих відстаней є недешевим. Якщо вам потрібно зробити це у великих масштабах, є способи використання косинусної подібності на біграмових векторах, які набагато швидше і простіше поширювати, якщо вам потрібно знайти збіги для багатьох слів відразу. Однак вони є лише наближенням до цієї відстані.


(+1) для лева. метрика відстані. nltk поставляється з готовою реалізацією. Подібність
косину

Я погоджуюся, що це набагато гірше, ніж відстань Левенштейна, але якщо вам потрібно нечітке зіставлення між двома мільйонами даних, це може насправді зробити це в розумний час через необхідність деяких прийомів плюс множення матриці
Jan van der Vegt

1
@ Dawny33 Я б не погодився. Мало того, що схожість на косинус спрацювала дуже швидко для мене, але й дуже точно, враховуючи, що був використаний правильний n-грам.
Мохіт Мотвані

3

Старий і добре відомий метод порівняння - це алгоритм Soundex . Ідея полягає у порівнянні не самих слів, а наближень того, як вони вимовляються. Наскільки це насправді покращує якість результатів, я не знаю.

Однак дивно застосовувати щось на кшталт Soundex до результатів роботи двигуна розпізнавання мови в текст. Спочатку ви викидаєте інформацію про те, як вимовляються слова, потім намагаєтесь знову додати їх. Краще було б поєднати ці дві фази.

Отже, я сподіваюсь, що це зробить найсучасніша технологія в цій галузі та є певною формою адаптивного класифікації, наприклад, заснованої на нейронних мережах. Google повертає нещодавні дослідження розпізнавання мови за допомогою нейронних мереж .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.