Разбор строкового текста в num в испанской грамматике

Мне нужно написать программу Python для преобразования испанских чисел в тексте строки в цифры:

Вход:

'Ciento Veinticuatro Mil Ochocientos Treinta y Cinco'

Желаемый результат:

124835

Я написал немного кода, но понял, что заново изобретаю велосипед, просто парсер. Итак, мне нужно использовать модуль парсера лексики/грамматики. Но я никогда раньше не имел дела с лексическими/грамматическими парсерами, и сначала нужно написать нотацию BNF или PEG (я еще не решил, какой модуль парсера я буду использовать, самый простой, который я могу найти).

Для меня это сложно, испанская грамматика для числительных так сильно отличается от английской.

Мой подход:

<numeral> ::= ([<centenas>][<decenas>][<unidades>])+ [<millares>]

Я боюсь, что это вопрос для говорящих по-испански.


person Trimax    schedule 01.09.2014    source источник
comment
Я не уверен, почему вы думаете, что испанские числа настолько отличаются от английских, это в основном та же структура. Конечно, есть объединенные сотни (с родом: quinientas), но это незначительная деталь, и ваш пример кода, похоже, находится на правильном пути. Попробуйте ирландский, если хотите чего-то сложного :)   -  person rici    schedule 02.09.2014
comment
@rici Не только слитые сотни имеют пол. 21-› вейнтиуно, вейнтиуна. Некоторое число имеет три формы (больше с ударением): 21-›veintiún, veintiun, veintiuno, veintiuna. Союз у между десятками и единицами: 35-> treinta y cinco. Несмотря на это, испанский не самый запутанный язык в моей стране (Испании), на севере говорят на баскском языке (также называемом эускера), его система счисления - сумасшедшая проблема: santurtzieus.com/gelairekia/laguntza/funtzioak/los_numeros.htm   -  person Trimax    schedule 02.09.2014
comment
Si pues pero no hay Problema en reconocer las variantes; соло tienes дие poner todas en tu lexico. Y игнорировать la y. Yo que tu ignoraría los acentos también; много родов нет les teclean, especialmente си нет tienen ип teclado adecuado. Y настаивает на том, что irlandés es aun peor Que vasco. П.э. айва es a cúig déag (cuig=5; a deich=10) y 17 es a seacht déag. Перо. 15 Весов: cuig phunt deag. 17 Весов: поиск и разгон. Libra es punt, pero los números cambian la palabra siguiente: cinco phunt (забава), siete bpunt (бунт, la p es muda acá). Y se entremezclan: siete bunt diez.   -  person rici    schedule 02.09.2014
comment
Кроме того, английский язык не так прост. Например, носитель языка (йо) прочтет диапазон 4050-4100 как от четырех тысяч пятидесяти до сорока одной сотни. Обратите внимание, что сорок сто просто неверно, в то время как четыре тысячи сто возможны, но неупотребительны, за исключением случаев выделения: их сорок одна сотня - повторяю, четыре тысячи сто - из них. .. Я не верю, что в испанском есть такая тонкость.   -  person rici    schedule 02.09.2014
comment
миллиард по-испански больше, чем по-английски :)   -  person 1010    schedule 23.09.2014


Ответы (1)


Этого можно добиться, внеся некоторые изменения в библиотеку text2num: https://github.com/ghewgill/text2num

import re

Small = {
    'cinco': 5,
    'veinticuatro': 24,
    'treinta': 30,
    'ciento': 100,
    'ochocientos': 800
}


Magnitude = {
    'mil':          1000
}

class NumberException(Exception):
    def __init__(self, msg):
        Exception.__init__(self, msg)

def text2num(s):
    a = re.split(r"[\s-]+", s.lower())
    n = 0
    g = 0
    for w in a:
        if w == 'y':
           continue
        x = Small.get(w, None)
        if x is not None:
            g += x
        else:
            x = Magnitude.get(w, None)
            if x is not None:
                n += g * x
                g = 0
            else:
                raise NumberException("Unknown number: "+w)
    return n + g

if __name__ == "__main__":
    assert 124835 == text2num('Ciento Veinticuatro Mil Ochocientos Treinta y Cinco')
person Juan Diego Godoy Robles    schedule 01.09.2014
comment
В испанской грамматике запутано. Вы можете увидеть мой подход на gist.github.com/SalvaJ/3bd467a23cc4d162ee6f - person Trimax; 01.09.2014
comment
да, это был только пример, чтобы указать вам возможный путь решения проблемы - person Juan Diego Godoy Robles; 01.09.2014