У сьогоднішній статті предметом нашого огляду буде невеличка бібліотека під назвою numerizer
, яка дозволяє перетворювати числа зі словесної у числову форму.
Встановлення
Windows:
pip install numerizer
MacOS:
pip3 install numerizer
Linux:
pip install numerizer
Використання
Отже, бібліотека numerizer
має функцію numerize()
. Саме функція numerize()
і перетворює числа зі словесної форми у числову.
Тож, імпортуємо бібліотеку та дивимося на приклад:
import numerizer
text = "Twenty-four"
print(numerizer.numerize(text))
24
Тобто ми передали функції numerize()
рядок “Twenty four“ (“Двадцять чотири“) та отримали результат у вигляді цілого числа. Але якщо ми спробуємо визначити, який тип даних має наш результат — результат буде str
, тобто результат залишається рядком. Перевіримо це на практиці:
text = "Twenty-four"
numerize_text = numerizer.numerize(text)
print(type(numerize_text))
<class 'str'>
Тобто функція numerize()
не змінює тип даних.
Тепер чудово було б навести ще приклади використання даної функції:
Приклад 2:
text = "Five hundred and forty three"
numerize_text = numerizer.numerize(text)
print(numerize_text)
543
Приклад 3:
text = "Twenty-one million forty-two thousand seven hundred and sixty-three"
numerize_text = numerizer.numerize(text)
print(numerize_text)
21042763
Приклад 4:
text = "Seven and two quarters"
numerize_text = numerizer.numerize(text)
print(numerize_text)
7.5
Важливий факт: numerize()
не розпізнає роздільник point для виведення десятих. Тобто коли ми, наприклад, захочемо перетворити рядок “Seven point thirty“ на 7.30, то ми не зможемо цього зробити. Ось приклад такого намаганняя у коді:
text = "Seven point thirty"
numerize_text = numerizer.numerize(text)
print(numerize_text)
7 point 30
Вдосконалення функції numerizer()
Тепер пропоную дещо усунути проблему із роздільником point. Отже, зробимо оновлену функцію, яка б мала всі ті ж функції, що й numerize()
, але підтримувала роздільник point. Тож, спочатку конкретезуємо, які дії нам треба виконати у коді, щоб отримати підтримку роздільника point.
По-перше, нам треба замінити слово point на крапку. З цим завданням ми можемо впоратися за допомогою методу replace()
, який якраз таки і заміняє потрібну нам частину рядка на вказаний нами символ.
По-друге, прибрати зайві пробіли між числами. Це можна зробити за допомогою того, що ми перетворимо рядок, який ми отримаємо у якості параметра у список. Таким чином ми просто зможемо видалити порожні елементи з новоствореного списка та повернути результат назад до рядкового типу даних.
Тож, тепер дещо модифікуємо функцію numerize()
, а саме створюємо нову функцію — modificated_numerize()
.
Ось код нашої функції:
text = "Seven point thirty"
def modificated_numerize(text):
totally_modified = None
numerize_text = numerizer.numerize(text)
replaced_point = numerize_text.replace("point", ".")
listed_text = list(replaced_point)
for i in listed_text:
if i == " ":
space_index = listed_text.index(i)
listed_text.pop(space_index)
elif " " not in listed_text:
totally_modified = "".join(listed_text)
return totally_modified
print(modificated_numerize(text))
7.30
І у підсумку отримали 7.30 як бажаний результат. Тепер пропоную розібрати цей код з поясненнями як він працює.
Розбір коду:
Перший етап. Визначаємо функцію та створюємо для неї параметр text, щоб ми потім могли вказати наш рядок у якості параметра.
Другий етап. Визначаємо змінну totally_modified
, яка у майбутньому буде зберігати наш кінцевий результат, а зараз вона просто зберігає порожній рядок.
Третій етап. Використовуємо функцію numerize()
, щоб перетворити словесний формат чисел у числовий. Результат роботи функції зберігаємо у змінній numerize_text
. Тобто, якщо зараз абстрагуватися від всього іншого коду і залишити тільки numerize()
, то ми отримаємо результат 7 point 30.
Четвертий етап. Визначаємо змінну replaced_point
та зберігаємо туди наш попередній результат тільки з крапкою замість слова point. Тобто ми отримали “7 . 30” у результаті. Ми досягли цього за допомогою методу replace()
, який отримав слово, яке треба замінити, та символ, на який ми хочемо замінити слово. У нашому випадку нам треба замінити слово point на крапку, звідси і такий запис replace(“point“, “.“)
.
П’ятий етап. Перетворюємо рядок на список. У такому разі кожен символ у рядку буде окремим елементом списку і пусті рядки також.
Шостий етап. Тут ми створюємо цикл for у якому проходимося по кожному елементу нещодавно створеного списку listed_text
. Цей цикл має у собі дві умови if i == " "
та if " " not in listed_text
. Перша умова перевіряє кожен елемент на те, чи є він порожнім рядком, якщо так, то ми знаходимо індекс цього елемента у списку і видаляємо його зі списку за допомогою методу pop()
. Якщо ж у списку більше немає жодного елемента, який був би порожнім рядком, то ми просто приєднуємо список до рядка і зберігаємо його у змінній totally_modified
. Варто зазначити одну важливу річ, приєднуючи список до рядка ми тим самим ніби конвертуємо список у рядок. Тобто на виході ми отримаємо результат типу str
.
Сьомий етап. Повертаємо змінну totally_modified
.
Висновок
У цій статті ми познайомилися з бібліотекою numerizer
, ознайомилися з функцією numerize()
, створили на її основі власну вдосконалену функцію modificated_numerize()
та детально розібрали її код. Сподіваюся, що вам сподобався цей матеріал і ви дізналися щось нове для себе. Дякую за увагу!