我正在编写一些东西,以便用包含字符串或数字的元素来分析列表(或字典/元组)。但我遇到了一个问题:我可以分析简单数字(从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的注释区域)。然后我画了那棵树。
答案 0 :(得分:1)
您的问题的答案很简单,您的标记器将多位数字组合为单个标记。如果您单独标记每个数字,它将起作用。更一般地说,你应该更彻底地解决标记化的任务;例如,您的代码太脆弱,无法支持将引号分隔的字符串视为单个标记。
但是:为什么要尝试解析任意python列表的字符串表示?不要这样做。如果您正在阅读自己编写的数据,请以更简单的形式写出来,以便您可以轻松阅读。例如,每条记录是否包含标签和数字列表?将每条记录写为一个以空格分隔的行。读取和解析这是微不足道的。
对于结构更复杂的数据,请使用json
写出您的文件并重新读取。它会为您处理所有解析。