У сьогоднішній статті предметом нашого огляду буде невеличка бібліотека під назвою numerizer, яка дозволяє перетворювати числа зі словесної у числову форму.
Встановлення
Windows:
pip install numerizerMacOS:
pip3 install numerizerLinux:
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() та детально розібрали її код. Сподіваюся, що вам сподобався цей матеріал і ви дізналися щось нове для себе. Дякую за увагу!