Итак, я пытаюсь извлечь некоторую информацию из текста и использую фрагментацию NLTK.
Вот мой вклад
The stocks show 67% rise, last year it was 12% fall
я хочу захватить
67% rise
и 12% fall
POS Тегирование приведенного выше предложения показывает
('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
Теперь я придумал простое правило
Stat: {<CD><NN>(<NN>+|<VBN>|JJ)?}
который хорошо работает и захватывает
('67', 'CD'), ('%', 'NN'), ('rise', 'NN')
('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
но в моем наборе данных у меня есть такие вещи, как
5 million dollars
который
('5', 'CD'), ('man', 'NN'), ('stock', 'NN')
и тоже неправильно снято. Поэтому я подумал о включении знака %
в свое правило.
Stat: {<CD><%>(<NN>+|<VBN>|JJ)?}
но это правило теперь ничему не соответствует. Как избежать/включить %
в правило чанка?
Обновить
Итак, чего я не понимаю, так это того, что я могу сопоставлять другие специальные символы. Например, если у меня есть правило как
XYZ:{<:>}
это соответствует всем :
на входе. Так что все, что я пытаюсь сделать, это
XYZ:{<%>}
и это не работает. Я пытался избежать %
с помощью
XYZ:{<\%>}
но это тоже не работает. Я пробовал \\
, но безрезультатно. Я действительно не хочу изменять входную строку, так как после ее сопоставления я хочу узнать индексы совпадающих строк. Поэтому, если я изменю входную строку, это приведет к сбросу моих индексов, если я сначала не сделаю обратное преобразование.
%
), только его теги (как ни странно,NN
). Если вы получите другой тег POS, который дает вам отдельный тег для%
, вы можете улучшить блокировщик. - person lenz   schedule 12.02.2017NN that matches the string %
? - person AbtPst   schedule 13.02.2017