преобразование словесного вида числа в число
Здравствуйте и снова я с тупым вопросом. У меня появилось необходимость перевести словесное представление числа (например: пять) в число (например: 5). В обратную сторону нашёл тучу решений, а вот так ни одного, поэтому и задал такой вот вопрос. Буду признателен за ответ и если можно пояснение, заранее спасибо.
Ответы (3 шт):
Эта задача решается не так тривиально, как формулируется. Мне приходилось заниматься подобной задачей и в нашей команде её решали с помощью парсеров (анализаторов).
Лексический и синтаксический анализатор широко используются при создании интерпретаторов и компиляторов. Сейчас популярны так называемые PEG-анализаторы.
Я писал парсеры для C#, и мы использовали библиотеку IronMeta. Вам для Python надо будет выбрать свою библиотеку. В частности, в Google я нашёл Parsimonious, но вы лучше повыбирайте сами.
Грамматика будет выглядеть приблизительно так:
zero = "ноль"
one = "один"
two = "два"
three = "три"
...
nine = "девять"
ones = one | two | three | ... | nine
eleven = "одинадцать"
twelve = "двенадцать"
...
nineteen = "девятнадцать"
teens = elevent | ... | twelve | ... | nineteen
ten = "десять"
twenty = "двадцать"
ninety = "девяности"
tens = ten | twenty | ... | ninety
number = zero | ones | teens | tens | tens ones
В визиторе, который описан в документации на Parsimonious, надо завести аккумулятор, в который надо прибавлять значения. visit_twenty добавит 20, visit_nine добавит 9, итого "двадцать девять" превратится в 29.
https://github.com/SergeyShk/Word-to-Number-Russian - вот отличный пример. Вот так я его использую:
from functions.timer_modules.extractor import NumberExtractor
print(NumberExtractor().replace_groups("сто минута"))
Дальше думаю сами разберётесь. В репозитории файл extractor и number это всё, что вам нужно.
Я пользовался репозиторием Сергея на работе, а потом оформил фиксы в него (а он слегка сломан) отдельным пакетом.
pip install rus2num
from rus2num import Rus2Num
r2n = Rus2Num()
text = "Выплаты за второго-третьего ребенка выросли "
"на пятьсот двадцать пять тысячных процента "
"и составили 90 тысяч рублей"
print(r2n(text))
# Выплаты за 2-3 ребенка выросли на 0.525 процента и составили 90000 рублей