2014-09-01 3 views
0

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

Вход:

'Ciento Veinticuatro Mil Ochocientos Treinta y Cinco' 

Выхода желаемый:

124835 

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

Мне трудно, испанская грамматика для цифр, это так отличается от английского.

Мой подход:

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

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

+0

Я не знаю, почему вы думаете, испанские номера настолько отличаются от английских, это в основном та же структура. Конечно, есть сплавленные сотни (с полом: quinientas), но это небольшая деталь, и ваш пример кода, кажется, на правильном пути. Попробуй ирландский, если хочешь чего-то сложного :) – rici

+0

@rici Не только у плавленых сотен есть пол. 21-> «veintiuno», «veintiuna». Некоторое число имеет три формы (более с акцентированным характером): 21 -> «veintiún», «veintiun», «veintiuno», «veintiuna». Сопряжение «y» между десятками и единицами: 35-> «treinta» «y» «cinco». Несмотря на это, испанский язык не самый запутанный язык в моей стране (Испания), на севере - баскский язык (также называемый «Euskera»), его система цифр - сумасшедшая проблема: http://www.santurtzieus.com/ gelairekia/laguntza/funtzioak/los_numeros.htm – Trimax

+0

Si pues pero no hay problema en reconocer las варианты; соло tienes que poner todas en tu léxico. Y ignorar la 'y'. Yo que tu ignoraría los acentos también; mucha gente no les teclean, especialmente si no tienen un teclado adecuado. Y insisto que irlandés es aun peor que vasco. Возможная ошибка айва "a cúig déag" (cuíg = 5; deich = 10) y 17 es "seacht déag". Перо. 15 libras: «cuíg phunt déag». 17 libras: «seacht bpunt déag». Libra es "punt", pero los números cambian la palabra siguiente: cinco phunt (funt), siete bpunt (bunt, la p es muda acá). Y se entremezclan: siete bunt diez. – rici

ответ

0

Вы можете добиться этого, делая некоторые изменения в 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') 
+0

В испанской грамматике запутано. Вы можете увидеть мой подход на https://gist.github.com/SalvaJ/3bd467a23cc4d162ee6f – Trimax

+0

да, это был всего лишь пример, указывающий вам возможный путь для решения проблемы – klashxx