数字

时间:2015-11-03 00:06:52

标签: python numbers nltk grammar

我正在编写一些东西,以便用包含字符串或数字的元素来分析列表(或字典/元组)。但我遇到了一个问题:我可以分析简单数字(从0到9)但不能分析其他数字。 这是我的代码:

grammaire = nltk.CFG.fromstring("""
    L -> OPEN CONTENT CLOSE
    OPEN -> "["
    CLOSE -> "]"
    CONTENT -> Element Seq |   
    Seq -> | S Element Seq
    S -> ","
    Element -> Word | nombre | T | L | D
    T -> "(" BeginTuple ")"
    BeginTuple -> ElementTuple S ElementTuple EndTuple
    EndTuple -> S ElementTuple |  
    ElementTuple -> nombre | T
    D -> "{" BeginDic "}"
    BeginDic -> ElementDic EndDic
    EndDic -> S ElementDic EndDic |
    ElementDic -> Key ":" Value
    Key -> Word
    Value -> nombre | T | L
    Word -> "Bonjour" | "Aurevoir" | "Bye" | "Cya" | "Coucou" | " " | "Hello" | "Hi" 
    nombre -> chiffre | chiffre nombre
    chiffre ->  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    """)

sent,res,elmt = "[{Bonjour:1,Hello:(1,2)}]",[],''
c = '()[]{}:,'
for x in sent:
    if x in c:
        if len(elmt) == 0:
            res += [x,]
        else:
            #try: res += [int(elmt),] #si c'est un nombre on le transforme en int
            #except: res += [elmt,]
            res += [elmt,]
            elmt = ""
            res += [x,]
    else:
        elmt += x
print(res)

重要的线条在开头,有“chiffre”和“nombre”。我究竟做错了什么?另外,我需要对字符串做同样的事情(所以chiffre将是'“a”|“b”|“c”......'并且nombre将是相同的。)

我试图将我的列表中的数字作为Int而不是Str,但它不起作用...(参见带有try / except的注释区域)。然后我画了那棵树。

1 个答案:

答案 0 :(得分:1)

您的问题的答案很简单,您的标记器将多位数字组合为单个标记。如果您单独标记每个数字,它将起作用。更一般地说,你应该更彻底地解决标记化的任务;例如,您的代码太脆弱,无法支持将引号分隔的字符串视为单个标记。

但是:为什么要尝试解析任意python列表的字符串表示?不要这样做。如果您正在阅读自己编写的数据,请以更简单的形式写出来,以便您可以轻松阅读。例如,每条记录是否包含标签和数字列表?将每条记录写为一个以空格分隔的行。读取和解析这是微不足道的。

对于结构更复杂的数据,请使用json写出您的文件并重新读取。它会为您处理所有解析。