Подход на расстоянии Левенштейна

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

Как бы то ни было, у Python есть для этого библиотека!

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

В этой статье я расскажу о том, как вы можете сопоставить нечеткие строки с вашими строками в Python.

FuzzyWuzzy в Python

При работе с проблемами сопоставления строк в Python вы можете импортировать FuzzyWuzzy. FuzzyWuzzy - это библиотека Python, которая использует расстояние Левенштейна для вычисления различий между последовательностями в простом в использовании пакете.

Вы можете установить его с помощью следующей команды:

#for pip users
pip install fuzzywuzzy
#for Jupyter notebook
conda install -c conda-forge fuzzywuzzy

После установки библиотеки есть множество способов использовать эту библиотеку для сопоставления строк.

from fuzzywuzzy import process, fuzz

Я импортировал указанную выше библиотеку. Теперь давайте посмотрим на различные варианты использования этой библиотеки.

Нечеткий модуль

Простое соотношение

Метод ratio сравнивает всю строку и следует стандартному коэффициенту подобия расстояния Левенштейна между двумя строками:

Он сравнит все строки и выведет соответствующий процент:

[Output 0]: String Matched: 96
[Output 1]: String Matched: 91
[Output 2]: String Matched: 100

Частичное соотношение

Метод partial ratio работает по «оптимальной частичной» логике. Если учитываются короткая строка k и длинная строка m, алгоритм будет оценивать, сравнивая длину строки k:

Str_Partial_Match = fuzz.partial_ratio('Hello World', 'Hello World!')
print("String Matched:",Str_Partial_Match)
Str_Partial_Match = fuzz.partial_ratio('Hello World', 'Hello world')
print("String Matched:",Str_Partial_Match)

Приведенный выше код будет искать только частичное совпадение. В первом случае меньшая строка (Hello World) будет просматриваться в большей строке, и произойдет сопоставление.

Во втором случае длина строк такая же, но алфавиты будут совпадать:

[Output 0]: String Matched: 100
[Output 1]: String Matched: 91

Коэффициент сортировки токенов

Метод token sort ratio сортирует токены по алфавиту. Затем применяется простой метод ratio для вывода совпадающего процента:

Str_Sort_Match = fuzz.token_sort_ratio('Hello World', 'Hello wrld')
print("String Matched:",Str_Partial_Match)
Str_Sort_Match = fuzz.token_sort_ratio('Hello World', 'world Hello')
print("String Matched:",Str_Partial_Match)

Приведенный выше код игнорирует порядок слов.

[Output 0]: String Matched: 95
[Output 1]: String Matched: 100

Соотношение набора токенов

token set ratio игнорирует повторяющиеся слова. Он похож на метод sort ratio, но более гибкий. Он в основном извлекает общие токены, а затем применяет fuzz.ratio() для сравнения:

String_Matched=fuzz.token_set_ratio('Hello World', 'Hello Hello world')
print(String_Matched)

Он игнорирует повторяющиеся значения.

[Output 0]: 100

Пришло время взглянуть на каждый метод и сравнить их:

Я взял две струны. Теперь я буду использовать каждый метод нечеткости, чтобы узнать сходство строк:

Ratio: 57
Partial_Ratio: 77
Token_Sort_Ratio: 58
Token_Set_Ratio: 95

Модуль процесса

Извлечь

Метод extract из модуля process вычисляет оценку подобия вектора строк:

str2Match = "apple inc"
strOptions = ["Apple Inc.","apple park","apple incorporated","iphone"]

Мне нужно сопоставить список строк (strOptions) с str2Match:

Ratios = process.extract(str2Match,strOptions)
print(Ratios)

Метод извлечения оценивает каждую строку из списка на основе сходства с совпадающей строкой (str2Match).

[Output 0]: [('Apple Inc.', 100), ('apple incorporated', 90), ('apple park', 67), ('iphone', 30)]

Извлеките один

Метод extractOne выводит наиболее похожую строку с ее оценкой из вектора строк:

Ratios = process.extractOne(str2Match,strOptions)
print(Ratios)

Наиболее похожая строка будет выведена с помощью этого метода:

[Output 0]: ('Apple Inc.', 100)

использованная литература

Мир!