Рубрики
Без рубрики

FuzzyWuzzy: как измерить струнный расстояние на питоне

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

Python’s Fuzzywuzzy Библиотека используется для измерения сходства между двумя строками. Вот как вы можете начать использовать его тоже.

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

В других случаях, однако, все может немного … Fuzzier Анкет

Если зовут моего клиента Альберт Томпсон , но он платит кредитной картой под названием Альберт Г. Томпсон , Должен ли я позвонить в полицию, чтобы сообщить о мошенничестве? Должны ли «Властелин колец II: две башни» и «Властелин колец 2: 2 башни» рассматриваться как две совершенно отдельные книги на веб -сайте? Австрия и Австралия действительно две разные страны?

Хорошо, я, возможно, увлекся этим последним, но вы поняли.

Строковые расстояния меры

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

Jaccard расстояние: первый подход

Одним из самых интуитивных из них является дистанция Jaccard. Это может быть обобщено до меры расстояния для любых двух наборов. У него следующая формула:

Формула установленной дистанции Джейкарда

То есть сколько элементов на любом из набора, но не разделяется обоими, разделенными на общее количество различных элементов.

Например, учитывая строки «Альберт» и «Альберто», он сообщит о сходстве 85,7%, поскольку они разделяют 6 букв из 7.

Однако это не мера, специально предназначенная для строк.

Это потерпит неудачу во многих вариантах использования, поскольку на самом деле это не учитывает заказы. Например, две анаграммы, такие как «Безопасность железной дороги» и «сказки», всегда будут иметь 100% матч, даже если эти строки совершенно разные.

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

Изобретен российским ученым Владимиром Левенштейном в 60 -х годах, эта мера немного более интуитивно понятна: считает, сколько замен необходимо, учитывая строку u , чтобы преобразовать его в V Анкет

Для этого метода замена определяется как:

  • Стирая персонажа.
  • Добавление одного.
  • Заменив персонажа другим.

Минимальная сумма этих операций, которые необходимо выполнить для U Чтобы превратить его в V, соответствуют расстоянию Левенштейна между этими двумя строками.

Это может быть получено рекурсивно с этой формулой:

Levenshtein String Distance Formula

Где я и J являются индексами для последнего персонажа подстроения, который мы будем сравнивать. Второй термин в последнем выражении равен 1, если эти символы разные, и 0, если они одинаковы.

Это мера, которую использует библиотека Fuzzywuzzy в Python.

Использование FuzzyWuzzy в Python

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

from fuzzywuzzy import fuzz
similarity = fuzz.ratio("hello","world")

Вы, наверное, заметили, что я сказал соотношение. Метод соотношения всегда будет возвращать число от 0 до 100 (да, я бы предпочел, чтобы оно было от 0 до 1, или назвать его процентом, но для каждого своего собственного).

Можно показать, что расстояние Levenshtein не более длины самой длинной струны: замените все символы в более короткой части первой частью более длинной, а затем добавьте оставшиеся.

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

Это решает некоторые из ранее упомянутых проблем:

fuzz.ratio("Albert Thompson", "Albert G. Thompson") #91%

fuzz.ratio("The Lord of the Rings II: The Two Towers",
 "The Lord of the Rings 2: the 2 Towers") #88%

Даже если это может принести несколько новых:

#88% for two different countries
fuzz.ratio("Austria","Australia")

#57% but it's the same country
fuzz.ratio("Czechia","Czech Republic")

Другие методы Fuzzywuzzy

Библиотека Python Fuzzywuzzy предоставляет нам не только ванильное расстояние Levenshtein, но и с несколькими другими методами, которые мы можем использовать.

partial_ratio

partial_ratio Метод рассчитывает соотношение FuzzyWuzzy для всех подстроков более длинной строки с длиной более короткой, а затем возвращает наибольшее соответствие.

Например,

fuzz.partial_ratio("abc","a") == 
min([fuzz.ratio( char, "a") for char in "abc"])

Это имеет некоторые интересные эффекты:

fuzz.partial_ratio("Thomas and His Friends", "Thomas") #100%
fuzz.partial_ratio("Batman vs Superman", "Batman") #100%

По сути, метод partial_ratio может быть нечеткой заменой на содержит Строковой метод, так же как обычное соотношение может заменить равно метод

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

#72% with basically the same idea
fuzz.partial_ratio("Peanut Butter and Jelly",
 "Jelly and Peanut Butter") 

#86% with a random (carefully selected) string
fuzz.partial_ratio("Peanut Butter and Jelly",
 "Otter and Hell")

token_sort_ratio

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

Это означает:

fuzz.partial_ratio("Batman vs Superman", 
 "Superman vs Batman") #100%

fuzz.partial_ratio("a b c", "c b a") #100%

token_set_ratio

Коэффициент установки токена отделяет каждую строку словами, превращает оба списка в наборы (отбросы от повторяющихся слов), а затем сортирует их перед тем, как выполнять соотношение.

Таким образом, мы не только исключаем общие слова, мы также учитываем повторения.

fuzz.token_set_ratio("fun","fun fun fun") #100%

fuzz.token_set_ratio("Lord the Rings of",
 "Lord of the Rings") #100%

Выводы

Библиотека Python Fuzzywuzzy может быть очень полезным инструментом для вашего пояса. Как для сопоставления имен клиента, либо выступая в качестве слов бедного человека, оно может сэкономить вам много проблем или помочь в разработке функций вашей модели машинного обучения.

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

Я надеюсь, что вы нашли эту статью полезной, и дайте мне знать, если вы найдете другое использование для Fuzzywuzzy в своей работе!

Следуй за мной на Twitter или Средний Чтобы оставаться в курсе с большим количеством учебных пособий по Python, советами и приемы.

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

Пост FuzzyWuzzy: как измерить струнный расстояние на Python появился первым на Данные материал Анкет

Оригинал: “https://dev.to/strikingloo/fuzzywuzzy-how-to-measure-string-distance-on-python-5g4g”