NLTK如何将树形结构转换为数组?

4
首先,我将树转换为列表: 您插入一个已经标记化的句子,它会返回一棵树。
def LanguageCreateTree(tokenizedSentence):
    cp = nltk.RegexpParser(GRAMMAR)
    result = cp.parse(tokenizedSentence)
    result = str(result)
    print(result)

>>> A red cat with a hat
(S A/DT (VP red/VBN (NP cat/NN)) with/IN a/DT hat/JJ)

我该如何基于这个字符串创建一个包含列表的列表?我需要它能够生成以下列表:

[['A','DT'], ['VP', ['red','VBN'], ['NP', ['cat','NN']]], ['with','IN'], ['a','DT'], ['hat','JJ']]]

有没有可能直接从树开始,而不是先转成字符串再转回树形结构? - KobeJohn
你解析的列表开头不是缺少了 'S' 标识符吗? - KobeJohn
你所描述的输出仍然是一棵树;一个包含其他列表等递归的列表。 - tripleee
1个回答

3
这比你想象的要容易得多 :-) NLTK的Tree类实际上是一个列表(更准确地说,它是从列表类派生出来的)。而且它恰好具有你需要的结构。只需在cp.parse()的结果上使用普通的列表方法即可。以下是一个近似的示例(为说明而实时构建树):
>>> from nltk import Tree
>>> t = Tree.fromstring("(S A/DT (VP red/VBN (NP cat/NN)) with/IN a/DT hat/JJ)")

>>> print(t[1])
(VP red/VBN (NP cat/NN))
>>> print(t[1][0])   # Element 0 of the subtree at index 1
red/VBN

在这个例子中,我没有将单词与POS标签分开;因此您的树会看起来不同。同时请注意,Tree 有很好的打印方式,但是通过使用repr()可以看到真正的结构:
>>> print(repr(t[1]))
Tree('VP', ['red/VBN', Tree('NP', ['cat/NN'])])

谢谢,这是一个好的解决方案。但是我该如何分离“A/DT”呢?以便它们也成为两个不同的列表项。 - deepadmax
1
在你自己的树中,不应该有任何分离的东西:单词和POS标签是分开的,这只是它们被打印出来的方式。如果无法使其工作,请尝试并提供一个简短但完整(可执行!)的示例。 - alexis
如果我只是跳过你告诉我的步骤,直接使用result[x],它可以在"A/DT"中工作,并将其显示为列表,如下所示:('A','DT')。 - deepadmax
不,现在你正在做我告诉你要做的事情:“只需对cp.parse()的结果使用普通列表方法”。 你之前没有理解我的意思,我的示例仅用于说明,因为你的代码是不完整的。[在你提出问题的代码中,result是一个字符串,所以你说的是不可能的;但我相信你的真实代码是不同的)。 - alexis
没问题!但是不完整的问题很难回答,你可以看到。顺便说一句,欢迎来到stackoverflow :-) - alexis
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接