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