NLTK分块解析树,将其保存到文件中并使用CorpusReader类加载它

时间:2015-03-29 02:02:13

标签: python nltk tagged-corpus

我们说我有一个像下面这样的分块语料库,它保存在一个名为test.txt的文件中

[Rapunzel/NNP] let/VBD down/RP [her/PP$ long/JJ golden/JJ hair/NN]

然后我可以用ChunkedCorpusReader加载它。

>>> from nltk.corpus.reader import ChunkedCorpusReader
>>> reader = ChunkedCorpusReader('.','test.txt')
>>> reader.chunked_sents()[0]
Tree('S', [Tree('NP', [('Rapunzel', 'NNP')]), ('let', 'VBD'), ('down', 'RP'), Tree('NP', [('her', 'PP$'), ('long', 'JJ'), ('golden', 'JJ'), ('hair', 'NN')])])
>>> print(reader.chunked_sents()[0])
(S
  (NP Rapunzel/NNP)
  let/VBD
  down/RP
  (NP her/PP$ long/JJ golden/JJ hair/NN))

我对Tree对象进行了一些更改,比如,将块标记从NP切换到NPP并调用new

>>> print(new)
(S
  (NPP Rapunzel/NNP)
  let/VBD
  down/RP
  (NPP her/PP$ long/JJ golden/JJ hair/NN))

现在我要做的是将这个new树保存在一个文件中并使用ChunkedCorpusReader或任何其他读者加载它,就像我使用test.txt一样。但是,我无法找到将NLTK Tree对象保存在文件中的方法,而且还要从文件中读取它。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

print给你的字符串的默认转换也不错:它将单词与POS标签合并,并正确地缩进新行。由于file.write()不会自动转换为字符串,因此您必须将str(newtree)传递给文件的write方法。

要更好地控制树的字符串表示的外观,请使用树方法pformat()。请注意,在早期版本的nltk中,Tree.pformat()被称为Tree.pprint();在最新版本中,Tree.pformat()返回一个字符串,而Tree.pprint()写入stdout。

如果您希望用方括号分隔树,请将选项parens="[]"添加到pformat()

>>> print(new.pformat(parens="[]"))
[S
  [NP Rapunzel/NNP]
  let/VBD
  down/RP
  [NP her/PP$ long/JJ golden/JJ hair/NN]]