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

NLTK chunked parse tree, save it into a file and loading it with CorpusReader class

假设我有一个像下面这样的分块语料库,它保存在一个名为 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 对象保存在文件中以及从文件中读取它的方法。有人可以帮忙吗?

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

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

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

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