如何通过nltk在Python中从Tree类型转换为String类型?

时间:2015-11-24 18:32:50

标签: python list tree tuples nltk

for subtree3 in tree.subtrees():
  if subtree3.label() == 'CLAUSE':
    print(subtree3)
    print subtree3.leaves()

使用此代码,我可以提取树的叶子。哪个是: [('talking', 'VBG'), ('constantly', 'RB')]表示某个例子。这是完全正确的。现在我想要将这些Tree元素转换为字符串或列表以进行进一步处理。我怎么能这样做?

我尝试了什么

for subtree3 in tree.subtrees():
  if subtree3.label() == 'CLAUSE':
    print(subtree3)
    print subtree3.leaves()
    fo.write(subtree3.leaves())
fo.close()

但它引发了一个错误:

Traceback (most recent call last):
  File "C:\Python27\Association_verb_adverb.py", line 35, in <module>
    fo.write(subtree3.leaves())
TypeError: expected a character buffer object

我只想将树叶存储在文本文件中。

2 个答案:

答案 0 :(得分:4)

这取决于您的NLTK和Python版本。我认为你引用了nltk.tree模块中的Tree类。如果是这样,请继续阅读。

在您的代码中,确实如此:

  1. subtree3.leaves()返回“元组列表”对象,
  2. fo是Python File IO objectfo.write只接收str类型作为参数
  3. 您可以使用fo.write(str(subtree3.leaves()))打印树叶,因此:

    for subtree3 in tree.subtrees():
        if subtree3.label() == 'CLAUSE':
            print(subtree3)
            print subtree3.leaves()
            fo.write(str(subtree3.leaves()))
    fo.flush()
    fo.close()
    

    并且不要忘记flush()缓冲区。

答案 1 :(得分:3)

可能问题更多的是尝试将元组列表写入文件而不是遍历NLTK Tree对象。请参阅NLTK: How do I traverse a noun phrase to return list of strings?Unpacking a list / tuple of pairs into two lists / tuples

要输出2个字符串的元组列表,我觉得使用这个成语很有用:

fout = open('outputfile', 'w')

listoftuples = [('talking', 'VBG'), ('constantly', 'RB')]
words, tags = zip(*listoftuples)

fout.write(' '.join(words) + '\t' + ' '.join(tags) + '\n')

但是如果子树中有多个级别,则zip(*list)代码可能无效。