Всіх вітаю! У цій статті ми дослідимо, як перевіряти подібність слів у Python за допомогою бібліотек difflib та TheFuzz.
Використання difflib
Дана бібліотека є вбудованою, а тому нам не потрібно витрачати час на її встановлення. У даній бібліотеці нас цікавить конкретно функція get_close_matches(), яка приймає в основному два параметри: головне слово, з яким ми і будемо порівнювати інші, та список зі схожими словами, з яких дана функція потім вибере найбільш схожі до оригінального слова варіанти.
Ось приклад коду:
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = get_close_matches(original_word, similar_words)
print(define_matches)Спершу ми оголосили потрібні змінні, а саме original_word, де зберагіється головне слово, та similar_words, що є списком схожих слів.
Далі ми застосовуємо функцію get_close_matches() та передаємо усі оголошені змінні.
Результат:
['coward', 'word', 'wardrobe']У результаті ми отримали лише три слова, які найбільш схожі на слово “ward”.
Також ця функція має кілька опціональних параметрів, таких як n та cutoff. Параметр n встановлює максимальну кількість слів, яку ми будемо отримувати у результаті. А cutoff дозволяє встановити відсоток схожості, який повинен задовольняти нас. І, звісно, збільшення або зменшення відсотка схожості слів вплине на кінцевий результат.
Ось приклад застосування цих параметрів:
from difflib import get_close_matches
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = get_close_matches(original_word, similar_words, n=4, cutoff=0.4)
print(define_matches)У даному випадку ми визначили те, що хочемо отримувати максимально чотири слова та знизили рівень схожості до 40% (cutoff=0.4), хоча за замовчуванням даний параметр дорівнює 60% (cutoff=0.6).
Результат:
['coward', 'word', 'wardrobe', 'sword']Як бачимо, ми отримали рівно чотири схожі слова.
Тепер пропоную підвищити cutoff до 80%, щоб розуміти різницю:
from difflib import get_close_matches
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = get_close_matches(original_word, similar_words, n=4, cutoff=0.8)
print(define_matches)Результат:
['coward']Тут ми вже отримали не максимальну кількість слів, а лише одне, бо рівень схожості слів значно збільшився.
Використання TheFuzz
Тепер перейдемо до бібліотеки TheFuzz, яку вже треба встановлювати перед використанням. Конкретно ж ми будемо працювати з модулем process.
Встановлення
Спочатку нам треба встановити саму бібліотеку TheFuzz.
Windows:
pip install thefuzzMacOS:
pip3 install thefuzzLinux:
pip install thefuzzТакож для коректнох роботи треба встановити бібліотеку python-Levenshtein, бо вона використовується у бібліотеці TheFuzz.
Windows:
pip install python-LevenshteinMacOS:
pip3 install python-LevenshteinLinux:
pip install python-LevenshteinЗастосування функції extraxt() у коді
Тепер розглянемо наступний приклад з функцією extract(), яка виконує подібну до минулої функції роботу:
from thefuzz import process
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = process.extract(original_word, similar_words, limit=4)
print(define_matches)Результат:
[('coward', 90), ('wardrobe', 90), ('word', 75), ('password', 68)]Важливо зазначити той факт, що функція extract() повертає список слів з їхнім рівнем схожості поряд. Як бачимо, перші два слова є найбільш схожими на оригінал.
Щодо параметра limit — це опціональний параметр, який визначає максимальну кількість слів, яку ми отримаємо у результаті.
Далі протестуємо код без параметра limit:
from thefuzz import process
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = process.extract(original_word, similar_words)
print(define_matches)Результат:
[('coward', 90), ('wardrobe', 90), ('word', 75), ('password', 68), ('toword', 68)]Тут варто розуміти, що за замовчуванням функція extract() виводить п’ять слів з їхнім рівнем схожості.
Крім цього, коли limit більший за кількість слів у списку, то код не повертає жодної помилки. У підсумку він просто видає менше слів у кінцевому списку.
Розглянемо такий приклад:
from thefuzz import process
original_word = "ward"
similar_words = ["word", "sword", "password", "toword"]
define_matches = process.extract(original_word, similar_words, limit=6)
print(define_matches)Результат:
[('word', 75), ('password', 68), ('toword', 68), ('sword', 67)]Як бачимо, функція повернула лише чотири слова, хоча ми зазначили 6 у limit.
Застосування функції extraxtOne() у коді
Також у цій бібліотеці є функція extractOne(), єдиною відмінністю якої від усіх попередніх є те, що вона повертає лише одне найбільш схоже слово з усіх наявних у списку similar_words.
Ось приклад:
from thefuzz import process
original_word = "ward"
similar_words = ["word", "sword", "password", "toword", "coward", "foreword", "wardrobe"]
define_matches = process.extractOne(original_word, similar_words)
print(define_matches)Результат:
('coward', 90)Висновок
У даній статті ми розглянули одразу дві бібліотеки, що дозволять знаходити схожі слова, та приділили достатню увагу їх особливостям.