Алгоритм нечеткого поиска с помощью Python

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

Нечеткий поиск — это поиск информации, при котором выполняется сопоставление информации с заданным образцом или близким к этому образцу значением.

Данный сценарий реализует задачу нечеткого поиска с помощью библиотек языка программирования Python в Loginom.

Для работы узла Python может потребоваться предварительная настройка Loginom и установка Python. В демопримере используются библиотеки pandas и fuzzywuzzy.

Инструкция по установке библиотек.

Примечание: Демопример имеет ограничение демонстрации всех возможностей при запуске на демостенде (Запустить демо). Рекомендуем установить пример локально.

Запустить демо

Установить локально

Описание алгоритма

1. Импорт данных

В подмодели Импорт данных загружаются данные из текстового файла, содержащего поисковые запросы для сравнения.

а) Загрузка данных

Таблица «Данные для сравнения»:

Имя поля Метка поля
Text_1 Text_1 Текст 1
Text_2 Text_2 Текст 2

2. Нечеткий поиск

В подмодели Нечеткий поиск реализован алгоритм нечеткого поиска с помощью обработчика Python.

а) Методы нечеткого поиска

Библиотека Python fuzzywuzzy предоставляет различные методы осуществления нечеткого поиска. Использование определенного метода обусловлено конкретной задачей или типом данных.

Рассмотрим каждый метод более подробно:

1) fuzz.ratio — метод, при котором к данным применяется простое посимвольное сравнение. Рейтинг «100» присваивается, только если строки полностью равны; любое различие уменьшает рейтинг, будь то знаки препинания, регистр букв, порядок слов и так далее.

2) fuzz.token_sort_ratio — данный метод акцентирует внимание именно на самих словах, игнорируя регистр букв, порядок слов и даже знаки препинания по краям строки.

3) fuzz.token_set_ratio — метод, похожий на предыдущий, но дополнительно игнорирующий повторяющиеся слова и учитывающий только уникальные.

4) fuzz.partial_ratio — данный метод проверяет вхождение одной строки в другую (лишние слова игнорируются) и, главное, оценивает, чтобы ядро сообщения было идентичным сравниваемому значению.

5) fuzz.WRatio — метод, который работает ближе к человеческой логике, комбинируя несколько методов в один алгоритм с определенными весами.

Для выбора метода в настройках порта переменных подмодели Нечеткий поиск необходимо указать соответствующее значение номера алгоритма для переменной fuzchanger.

б) Настройки узла Нечеткий поиск

В настройках входного порта узла Python самостоятельно задаются столбцы:

Имя поля Метка поля
Text_1 Text_1 Текст 1
Text_2 Text_2 Текст 2
fuzzy_search fuzzy_search Значение нечеткого поиска

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

Для доступа к данным портов и другим встроенным объектам в контексте выполнения кода предусмотрены:

Вышеуказанные объекты импортируются из встроенного модуля «builtin_data». По умолчанию в текст исполняемого узлом кода добавляется строка импорта.

Импорт необходимых библиотек:

import builtin_data
from builtin_data import InputTable, InputTables, InputVariables, OutputTable, DataType, DataKind, UsageType
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import pandas as pd 
import os
from builtin_pandas_utils import to_data_frame, prepare_compatible_table, fill_table

Создаются три столбца:

df = pd.DataFrame(columns=['Текст 1', 'Текст 2', 'Значение нечеткого поиска'])

Задается выбор метода нечеткого поиска с помощью переменных:

fuzchanger = InputVariables.Items["fuzchanger"].Value

С помощью цикла выполняется нечеткий поиск по всем строкам в зависимости от выбранного метода:

for i in range(InputTable.RowCount):
        if fuzchanger == 1:
            fuz = fuzz.ratio(InputTable.Get(i, 0),InputTable.Get(i, 1))
        if fuzchanger == 2:
            fuz = token_set_ratio(InputTable.Get(i, 0),InputTable.Get(i, 1))
        if fuzchanger == 3:
            fuz = fuzz.token_sort_ratio(InputTable.Get(i, 0),InputTable.Get(i, 1))
        if fuzchanger == 4:
            fuz = fuzz.partial_ratio(InputTable.Get(i, 0),InputTable.Get(i, 1))
        if fuzchanger == 5:
            fuz = fuzz.WRatio(InputTable.Get(i, 0),InputTable.Get(i, 1))
        df.loc[len(df.index)] = [InputTable.Get(i, 0), InputTable.Get(i, 1), fuz]

Выводятся результаты в таблицу:

fill_table(OutputTable, df, with_index=False)

Результат для метода fuzz.ratio:

Текст 1 Текст 2 Значение нечеткого поиска
Who is most talented on share? Who is most talented email world? 76
How do doughnut shops to actually make enough to survive, as well as pay for rent and employees? How do doughnut shops to actually make enough to survive, as well as pay for rent and employees? 36
How do game STP? How does StP? 76
What are good activities for a 2 old? What are good activities for a engineer year old? 84
Does turmeric powder stops or disturb mustache and beard growth in men if applied on face? What is the chances of getting a commitmentphobic man who says he'll never marry to want to try? He’s a little broken after his first marriage. 29

Скачайте и откройте файл в программе Loginom, которую при необходимости можно скачать бесплатно.

Скачать демопример

Минимальные требования к системе:

  • Операционная система: Windows 8.1 и выше.
  • CPU x64: 1 core.
  • Оперативная память: 1 GB.
  • Жесткий диск: 10 GB.