#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. На самом деле я могу получить смещения, это не так сложно. В любом случае большое вам спасибо!