【问题标题】:NLTK Convert Tree to Array?NLTK 将树转换为数组?
【发布时间】:2015-12-09 12:09:01
【问题描述】:

首先,我将树变成了一个列表: 您插入一个已经标记化的句子,它会返回一棵树。

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']]]

【问题讨论】:

  • 是否可以从树开始,而不是从一个字符串开始,然后回到基本上是一棵树?
  • 你的解析列表是不是缺少开头的'S' 指示符?
  • 你描述的输出仍然是一棵树;递归包含其他列表等的列表。

标签: python list tree nltk python-3.4


【解决方案1】:

这比你想象的要容易得多:-) 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”呢?这样它们也成为两个不同的列表项。
  • 在你自己的树中,不应该有任何东西可以分开:单词和词性标签是分开的,这就是它们的打印方式。试试看,如果你不能让它工作,提供一个简短但完整(可执行!)的例子。
  • 如果我只是跳过你告诉我要做的事情而只使用 result[x] 它与“A/DT”一起使用,并将其显示为如下列表:('A','DT ')。
  • 不,现在你正在做我让你做的事情:“只需对cp.parse()的结果使用普通的列表方法”。你以前不了解我,我的例子只是为了说明,因为你的代码不完整。 [在您在问题中提供的代码中,result 是一个字符串,因此您所说的不可能;但我确信你的真实代码是不同的)。
  • 但是很高兴你让它工作了。如果我的回答解决了您的问题,请点击旁边的大勾号“接受”它。
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2011-05-18
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多