Подход на расстоянии Левенштейна
Недавно я работал с набором данных и должен был сопоставить строки. Пришлось рассчитать процент совпадения строк. Поскольку я работал с 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)
использованная литература
Мир!