2015-11-03 35 views
0

我正在編寫一些東西,以便分析帶有元素的字符串或數字的列表(或字典/元組)。但我有一個問題:我可以分析簡單的數字(從0到9),但不能分析其他數字。 這裏是我的代碼:語法NLTK數字

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) 

的importants線之初,以「CHIFFRE」和「農佈雷」。我究竟做錯了什麼?另外,我需要對字符串做同樣的事情(所以chiffre將會是'「a」|「b」|「c」...),而nombre將是相同的)。

我試圖把我的列表中的數字看作是Int,而不是Str,但它不起作用......(參見帶有try/except的註釋區域)。 Ofc然後我畫那棵樹。

回答

1

您的問題的狹義答案是您的標記器將多位數字作爲單個標記進行分組。如果分別標記每個數字,它將起作用。更一般地說,你應該更徹底地解決令牌化的任務;例如,您的代碼太脆弱,無法支持將引號分隔的字符串視爲單個標記的情況。

但是:爲什麼你想解析任意python列表的字符串表示?不要這樣做。如果您正在閱讀自己寫的數據,請以更簡單的形式寫出來,以便您可以輕鬆閱讀。例如,每個記錄是否包含一個標籤和一個數字列表?將每條記錄寫入一個空格分隔的行。這是微不足道的閱讀和解析。

對於結構更復雜的數據,請使用json來寫出您的文件並將其重新讀入。它爲您處理所有解析。