说明我尝试做的事情的例子可以在 http://www.nltk.org/book/ch07.html 的第3.1部分找到。
其本质内容如下:
这将根据给定的text
生成树。
我编写的代码试图使用来自文本文件的输入。因此,在打开文件后,我使用readlines
获取其字符串版本。
我遇到的错误是:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-17-768af8cd2f77> in <module>() 3 f1 = f.read().strip() 4 f2 = ' '.join(f1.split())----> 5 nltk.chunk.conllstr2tree(f2, chunk_types=['NP']).draw()/usr/local/lib/python3.4/dist-packages/nltk/chunk/util.py in conllstr2tree(s, chunk_types, root_label) 380 match = _LINE_RE.match(line) 381 if match is None:--> 382 raise ValueError('Error on line %d' % lineno) 383 (word, tag, state, chunk_type) = match.groups() 384 ValueError: Error on line 0
回答:
您从sample.txt传递了原始字符串数据,修剪了空白字符f1
,然后按空格进行分词f2
。
如果您查看NTLK书中的示例,其中提到了分块方法,
nltk.chunk.conllstr2tree(text, chunk_types=['NP']).draw()
text
变量是一系列IOB标记的数据,如下所示:
text = """ he PRP B-NP accepted VBD B-VP the DT B-NP position NN I-NP of IN B-PP vice NN B-NP chairman NN I-NP of IN B-PP Carlyle NNP B-NP Group NNP I-NP , , O a DT B-NP merchant NN I-NP banking NN I-NP concern NN I-NP . . O"""
根据源代码文档,conllstr2tree方法:
返回一个单句的分块结构,该句子以给定的CONLL 2000风格字符串编码。此函数将CoNLL IOB字符串转换为树。它使用指定的分块类型(默认为NP、PP和VP),并创建一个以S节点(默认)为根的树。
问题在于您传递的格式(CoNLL 2000 Wall Street Journal)不正确,应该如下所示(不带斜杠):
token / POS Tag / IOB-Chunk Type
因此,您需要进行几个额外的步骤:
- 为每个单词找到可能的词性标签。
- 找到分块类型
- 添加适当的IOB标签。
对于一个SO问题来说,提供一个示例代码片段是不合理的,因为这需要大量的工作,但希望这能为您指明正确的方向!