NLP для вычисления коэффициента схожести между предложениями длиной максимум 5-6 слов.

Вопрос или проблема

Я ищу относительно простой алгоритм NLP, который помог бы мне оценить степень схожести между двумя предложениями. Эти предложения обычно содержат примерно от 1 до 5 слов.

Контекст:

Пользователь может создавать столько категорий, сколько захочет, чтобы сгруппировать свои фотографии. Я заметил, что многие из этих категорий пустые, и, изучая чуть глубже, вижу, что у многих категорий, созданных пользователем, почти идентичные имена, например: FRANCE VS FRANC | SUMMER VS SUMER | BEACH VS BEACH (СЕРДЦЕ ЭМОДЗИ).

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

Цель:

Квантовать количество пар категорий с высокой степенью схожести на уровне пользователя.

Таким образом, мой вопрос по сути двоичен:

  1. какой простой алгоритм NLP мог бы довольно хорошо справиться с этой задачей, не будучи каким-то сложным нейронным сетевым решением, которое использует такая компания, как Google? Слышал о косинусной схожести для векторного пространства, но не уверен

  2. какой был бы подходящий порог для коэффициентов схожести? Я полагаю, это субъективно, но буду признателен за любые советы

Для орфографических ошибок расстояние Левенштейна является хорошим началом. Эта метрика по сути вычисляет расстояние между двумя словами в терминах замен, удалений и вставок.

Например, “bear” можно написать как “fear” с одной заменой (замена “b” на “f”). В вашем случае, FRANC—это просто слово FRANCE с удалением (буквы “E”). Вы можете установить подходящий порог в зависимости от длины предложения. Например, для более коротких предложений можно установить меньший порог (расстояние Левенштейна равно 1), в то время как для предложений из 5 слов можно установить порог в 3 или 4.

Эта библиотека позволяет легко вычислять расстояние Левенштейна в виде процента от общей длины слова. Например, в упомянутом выше примере с “bear”/”fear” слова схожи на 75% (3 символа остаются одинаковыми из 4 символов в целом). Вы можете поэкспериментировать с порогом в процентах, который лучше всего подходит для вас, хотя я бы рекомендовал настраивать порог в зависимости от длины предложения.

Чтобы вычислить это с использованием косинусной схожести, вам необходимо сначала получить вектор отдельных предложений. Это можно сделать разными способами, от простого алгоритма TF-IDF до получения эмбеддингов из заранее обученной модели NLP. Как только вы получите вектор, косинусная схожесть является хорошей мерой для оценки схожести между двумя предложениями.

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

Для вычисления коэффициентов схожести между 2 короткими предложениями “Fuzz” будет работать хорошо.

  1. Схожесть строк Самый простой способ сравнить две строки—это измерение расстояния редактирования.

Например, следующие две строки довольно похожи: NEW YORK METS NEW YORK MEATS

m = SequenceMatcher(None, "NEW YORK METS", "NEW YORK MEATS")
m.ratio() ⇒ 0.962962962963

Что дает очень высокое значение из-за их схожести.

  1. Частичная схожесть строк

    fuzz.ratio(“NEW YORK METS”, “NEW YORK YANKEES”) ⇒ 75

Источник для дальнейшего изучения

https://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/

https://pypi.org/project/fuzzywuzzy/

https://github.com/seatgeek/thefuzz

Ответ или решение

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

Определение проблемы

Ваша цель — выявить пары категорий, сходных по написанию, но с возможными орфографическими ошибками, такими как "FRANCE" и "FRANC" или "SUMMER" и "SUMER". Это поможет вам определить дублирующиеся или ошибочные категории и предложить их объединение.

Расширенные методы

  1. Расстояние Левенштейна:

    • Описание: Это метрический метод, который измеряет количество редактирований (вставка, удаление или замена), необходимых для преобразования одной строки в другую.
    • Пример: Например, для "FRANCE" и "FRANC" расстояние Левенштейна равно 1, так как необходимо удалить одну букву.

    Используйте библиотеку FuzzyWuzzy, которая работает на базе расстояния Левенштейна для вычисления процентного сходства. Например, "FRANCE" и "FRANC" будут иметь сходство около 83%.

  2. Косинусное сходство:

    • Описание: Метрика, используемая для измерения углового сходства между двумя векторами текста. Для этого предложения нужно сначала перевести в вектора.
    • Реализация: Используйте TF-IDF преобразование или предварительно обученные эмбеддинги. После преобразования в векторное пространство можете вычислить косинусное сходство для каждой пары фраз.
    • Практическое применение: Для коротких предложений подойдут высокие пороговые значения, начиная с 0,9.

Рекомендации по порогу

Пороговое значение — субъективное и зависит от ваших нужд. Начните с высоких значений, от 80% для FuzzyWuzzy и от 0,85 для косинусного сходства. Постепенно корректируйте, пока не найдете оптимальный баланс между точностью и полнотой.

Заключение и ресурсы

Эффективное выявление схожих категорий поможет оптимизировать обработку данных категории и улучшит пользовательский опыт. Рекомендуем использовать TheFuzz как основной инструмент для вычисления строковой схожести.

Дополнительные ресурсы:

Эти инструменты позволят вам качественно оценивать схожесть и принимать обоснованные решения на основе количественного анализа.

Оцените материал
Добавить комментарий

Капча загружается...