оценка сходства между фразами

Расстояние Левенштейна — это подход к измерению разницы между словами, но не для фраз.

Существует ли хорошая метрика расстояния для измерения различий между фразами?

Например, если фраза 1 состоит из n слов x1 x2 x_n, а фраза 2 состоит из m слов y1 y2 y_m. Я думаю, что они должны быть нечетко выровнены по словам, тогда выровненные слова должны иметь оценку того, насколько они похожи, и к не выровненным словам должен применяться какой-то штраф за пробел. Эти положительные и отрицательные оценки должны быть каким-то образом объединены. Кажется, здесь задействована какая-то эвристика.

Существует ли существующее решение для измерения сходства между фразами? Предпочтение отдается Python, но подойдет и другое решение. Спасибо.


person user1424739    schedule 11.04.2019    source источник


Ответы (2)


Вы также можете измерить сходство между двумя фразами, используя расстояние Левенштейна, оценивая каждое слово как отдельный элемент. Если у вас есть строки неравных размеров, вы можете использовать алгоритм Смита-Уотермана или Нидлмана-Вунша. Эти алгоритмы широко используются в биоинформатике, и их реализацию можно найти в пакете biopython. Вы также можете токенизировать слова во фразах и измерить частоту каждого токена в каждой фразе, что приведет к массиву частот для каждой фразы. Из этого массива вы можете измерить попарное сходство, используя любое векторное расстояние, такое как евклидово расстояние или косинусное сходство. Токенизация фраз может быть выполнена с помощью пакета nltk, а расстояния могут быть измерены с помощью scipy. Надеюсь, поможет.

person TavoGLC    schedule 12.04.2019

Взгляните на FuzzyWuzzy:

>>> from fuzzywuzzy import fuzz

>>> s1 = "this is a sentence used for testing"
>>> s2 = "while this is another sentence also used for testing"
>>> s3 = "I am a completely unrelated string"

>>> fuzz.partial_ratio(s1, s2)
80
>>> fuzz.partial_ratio(s1, s3)
52
>>> fuzz.partial_ratio(s2, s3)
43

Он также включает другие режимы сравнения, которые учитывают неупорядоченные токены и т. д.

person Avish    schedule 11.04.2019
comment
Учитывает ли он слова? Или все же считать фразу строкой? - person user1424739; 11.04.2019
comment
Можете уточнить свой вопрос? - person Avish; 11.04.2019
comment
Сначала он сравнивает слова между фразами и вычисляет разницу между фразами, используя оценку слов? - person user1424739; 11.04.2019
comment
Я не думаю, что это так, но вам больше повезет проверить документы проекта. Я получил сходство 83 с "thisisasentenceusedfortesting", что, вероятно, указывает на то, что ему все равно на слова. Однако некоторые другие его методы, такие как token_sort и token_set, заботятся о словах. - person Avish; 11.04.2019
comment
В ПОРЯДКЕ. Кроме того, разница между разными словоформами одного и того же слова (например, во множественном числе и в единственном числе) должна быть меньше, чем между двумя разными словами (например, «взял» и «посмотрел»). Есть ли оценка подобия, которая может позаботиться об этом? - person user1424739; 11.04.2019
comment
Существуют более сложные подходы, которые, вероятно, включают определение основы или даже семантическое присвоение (например, использование wordnet, word2vec и т. д.), но я не знаком с конкретными из них. NLTK будет хорошим местом для начала поиска. - person Avish; 11.04.2019