Как получить индекс результата nltk.RegexpParser?

Я хочу получить не только результат 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 ответ

  1. Так как вы даете синтаксическому анализатору маркированный текст, он не может угадать исходные смещения (как он может знать, сколько места было между маркерами).
    Но, к счастью, 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)]),
          ...
    

    Как вы получаете смещения в помеченной последовательности?
    Ну, я оставлю это как упражнение по программированию вам.
    Подсказка: ищите span_tokenize()метод слова tokenisers.