【问题标题】:Parsing string text to num in spanish grammar在西班牙语语法中将字符串文本解析为 num
【发布时间】:2014-09-01 10:43:28
【问题描述】:

我需要编写一个 Python 程序将字符串文本中的西班牙数字转换为数字:

输入:

'Ciento Veinticuatro Mil Ochocientos Treinta y Cinco'

所需的输出:

124835

我已经编写了一些代码,但我意识到我正在重新发明轮子,只是一个解析器。所以,我需要使用一个词法/语法分析器模块。但我以前从未使用过词法/语法解析器,首先需要编写 BNF 或 PEG 表示法(我还没有决定我将使用哪个解析器模块,我能找到最简单的。)

这对我来说很难,西班牙语的数字语法与英语完全不同。

我的做法:

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

我担心这是讲西班牙语的人的问题。

【问题讨论】:

  • 我不知道为什么你认为西班牙数字与英文如此不同,它基本上是相同的结构。当然,有数百个融合(性别:quinientas),但这是一个小细节,您的示例代码似乎在正确的轨道上。如果你想要一些复杂的东西,试试爱尔兰语:)
  • @rici 不仅融合的数百人有性别。 21->“veintiuno”,“veintiuna”。一些数字具有三种形式(更多带有重音字符):21->“veintiún”、“veintiun”、“veintiuno”、“veintiuna”。十位和单位之间的连词“y”:35->“treinta”“y”“cinco”。即便如此,西班牙语并不是我的国家(西班牙)最纠结的语言,北方说的是巴斯克语(也称为“Euskera”),它的数字系统是一个疯狂的问题:santurtzieus.com/gelairekia/laguntza/funtzioak/los_numeros.htm
  • Si pues pero no hay problema en reconocer las variantes;独奏 tienes que poner todas en tu léxico。你忽略了y。 Yo que tu ignoraría los acentos también; mucha gente no les teclean, especialmente si no tienen un teclado adecuado。你坚持 que irlandés es aun peor que vasco。体育quince es "a cúig déag" (a cuíg=5; a deich=10) y 17 es "a seacht déag"。佩罗。 15 天秤座:“cuíg punt déag”。 17 天秤座:“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。
  • 另外,英语也不是那么简单。例如,母语人士 (yo) 会将范围 4050-4100 解读为“介于 4050 和 4100 之间”。请注意,“四百”是完全错误的,而“四千”是可能的,但不常见,除非在强调的情况下:“有四百——我重复一遍,四 ——这些……”我不相信西班牙语有这种微妙之处。
  • 十亿西班牙语比英语多:)

标签: python parsing bnf peg


【解决方案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')

【讨论】:

猜你喜欢
  • 2020-07-12
  • 2023-03-21
  • 2022-11-07
  • 2023-03-18
  • 2012-10-26
  • 2017-12-29
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多