преобразование словесного вида числа в число

Здравствуйте и снова я с тупым вопросом. У меня появилось необходимость перевести словесное представление числа (например: пять) в число (например: 5). В обратную сторону нашёл тучу решений, а вот так ни одного, поэтому и задал такой вот вопрос. Буду признателен за ответ и если можно пояснение, заранее спасибо.


Ответы (3 шт):

Автор решения: Mark Shevchenko

Эта задача решается не так тривиально, как формулируется. Мне приходилось заниматься подобной задачей и в нашей команде её решали с помощью парсеров (анализаторов).

Лексический и синтаксический анализатор широко используются при создании интерпретаторов и компиляторов. Сейчас популярны так называемые 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 рублей
→ Ссылка