Алгоритм нечеткого поиска с помощью Python
При организации поиска в данных возникают характерные проблемы, связанные с наличием в запросах орфографических и фонетических ошибок, некорректного ввода информации, а также отсутствием единых стандартов транскрипции с иностранных языков. Вследствие указанных причин задача поиска не может быть в полной мере решена только методами проверки на точное соответствие, в связи с чем становится актуальной разработка специальных методов и технологий нечеткого поиска.
Нечеткий поиск — это поиск информации, при котором выполняется сопоставление информации с заданным образцом или близким к этому образцу значением.
Данный сценарий реализует задачу нечеткого поиска с помощью библиотек языка программирования Python в Loginom.
Для работы узла Python может потребоваться предварительная настройка Loginom и установка Python. В демопримере используются библиотеки pandas и fuzzywuzzy.
Инструкция по установке библиотек.
Примечание: Демопример имеет ограничение демонстрации всех возможностей при запуске на демостенде (Запустить демо). Рекомендуем установить пример локально.
Описание алгоритма
1. Импорт данных
В подмодели Импорт данных загружаются данные из текстового файла, содержащего поисковые запросы для сравнения.
Таблица «Данные для сравнения»:
Имя поля | Метка поля |
---|---|
Text_1 | Текст 1 |
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 | Текст 1 |
Text_2 | Текст 2 |
fuzzy_search | Значение нечеткого поиска |
Устанавливается галочка в пункте Разрешить формировать выходные столбцы из кода.
Для доступа к данным портов и другим встроенным объектам в контексте выполнения кода предусмотрены:
- Входные наборы данных (InputTables, InputTable)
- Входные переменные (InputVariables)
- Выходной набор данных (OutputTable)
- Необходимые перечисления (DataType, DataKind, UsageType)
Вышеуказанные объекты импортируются из встроенного модуля «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.