如何获取nltk.RegexpParser的结果索引?

时间:2016-10-04 13:16:23

标签: regex nlp nltk

我不仅要获得RegexpParser的结果,还要获得结果的索引。 例如,单词的起始索引和单词的结束索引。

import nltk
from nltk import word_tokenize, pos_tag
text = word_tokenize("6 ACCESSKEY attribute can be used to specify many 6.0 shortcut key 6.0")
tag = pos_tag(text)

print tag

# grammar = "NP: {<DT>?<JJ>*<NN|NNS|NNP|NNPS>}"
grammar2 = """Triple: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*<MD>*<VB.*>+<JJ>?<RB>?<CD>*<DT>?<NN.*>*<IN*|TO*>?<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*}
              Triple: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*<MD>*<VB.*>+<JJ>?<RB>?<CD>*<DT>?<NN.*>*<TO>?<VB><DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*}
              """

grammar = """
                NP: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*}
                VP: {<VB.*>+<JJ>*<RB>*<JJ>*<VB.*>?<DT>?<NN|NP>?<IN*|TO*>?}
                """
cp = nltk.RegexpParser(grammar)
result = cp.parse(tag)
print(result)

result.draw()

1 个答案:

答案 0 :(得分:0)

由于您为解析器提供了标记化文本,因此无法猜出原始偏移量(如何知道标记之间有多少空间)。 但是,幸运的是,parse()方法接受其他信息,这些信息只是传递给输出。

在您的示例中,输入(您将其保存在名称较差的变量tag中)如下所示:

[('6', 'CD'),
 ('ACCESSKEY', 'NNP'),
 ('attribute', 'NN'),
 ...

如果您设法将其更改为

[('6', 'CD', 0, 1),
 ('ACCESSKEY', 'NNP', 2, 11),
 ('attribute', 'NN', 12, 21),
 ...

并将其提供给解析器,然后偏移量将包含在解析树中:

Tree('S',
     [Tree('NP', [('6', 'CD', 0, 1),
                  ('ACCESSKEY', 'NNP', 2, 11),
                  ('attribute', 'NN', 12, 21)]),
      ...

如何获得标记序列的偏移量? 好吧,我将把这作为编程练习留给你。 提示:查找单词tokenisers的span_tokenize()方法。