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

#regex #nlp #nltk

#регулярное выражение #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:

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

Комментарии:

1. На самом деле я могу получить смещения, это не так сложно. В любом случае большое вам спасибо!