NLTK Chunk Parser: как экранировать специальные символы

Итак, я пытаюсь извлечь некоторую информацию из текста и использую фрагментацию 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:{<\%>}

но это тоже не работает. Я пробовал \\, но безрезультатно. Я действительно не хочу изменять входную строку, так как после ее сопоставления я хочу узнать индексы совпадающих строк. Поэтому, если я изменю входную строку, это приведет к сбросу моих индексов, если я сначала не сделаю обратное преобразование.


person AbtPst    schedule 11.02.2017    source источник
comment
Я думаю, что вы не можете сопоставить текст (%), только его теги (как ни странно, NN). Если вы получите другой тег POS, который дает вам отдельный тег для %, вы можете улучшить блокировщик.   -  person lenz    schedule 12.02.2017
comment
смогу ли я использовать чанкер nltk с другими POS-тегерами? есть ли у nltk другие POS-теггеры? или я должен пойти на что-то вроде Stanford pos taggers?   -  person AbtPst    schedule 13.02.2017
comment
@lenz есть ли способ указать правило, такое как NN that matches the string %?   -  person AbtPst    schedule 13.02.2017
comment
Если набор тегов для тега такой же, как и в правилах вашего фрагмента, вы можете использовать любой тег, даже из-за пределов NLTK (или вообще Python).   -  person lenz    schedule 14.02.2017
comment
Может быть способ указать токен, а не только его тег, но я ничего не нашел об этом в документах. В любом случае, это не имеет ничего общего с побегом. Возможно, вам следует изменить формулировку вопроса (и его название) или вообще опубликовать новый вопрос, чтобы привлечь внимание нужных людей.   -  person lenz    schedule 14.02.2017


Ответы (2)


Ну, так как это регулярное выражение, вы можете просто избежать его.

Stat: {<CD><\%>(<NN>+|<VBN>|JJ)?}

У вас также может быть список ключевых слов, которые вы хотите заменить, чтобы ваши правила фрагментов не становились слишком длинными.

e.g.

s = '56% rise and 75% fall'
gen_replacements = [('%', 'PERCENTAGE'), ('perc.', 'PERCENTAGE'), etc]
for ndl, rpl in gen_replacements:
    s = s.replace(' %s ' % ndl, ' %s ' % rpl)

Stat: {<CD><PERCENTAGE>(<NN>+|<VBN>|JJ)?}
person alexisdevarennes    schedule 12.02.2017
comment
Вы уверены, что знакомы с тем, как ChunkParser интерпретирует выражения фрагментов, которые работают с размеченным текстом? - person lenz; 12.02.2017
comment
Ленц: Не могли бы вы уточнить? Мое последнее предложение? Это было дано не как рабочий пример, а как предложение. Я лично не использую NLTK, но Pattern, читая документацию NLTK, показал, что можно включать такие символы, как %, экранируя их, поскольку утверждается, что правила являются простыми регулярными выражениями. - person alexisdevarennes; 13.02.2017
comment
Это не просто регулярные выражения — иначе <NN>+ будет интерпретироваться как одна меньше чем, две N и одна или более больше чем вместо одного или нескольких существительных . Есть дополнительный шаг перевода. И применяются они к последовательности тегов, а не к самому тексту. - person lenz; 13.02.2017
comment
Кстати: пожалуйста, используйте @ перед моим именем, чтобы я получал уведомление, когда вы спрашиваете меня о чем-то здесь. - person lenz; 13.02.2017

Используйте шаблон, например ‹CD>‹NN>+

person Srikanth Rokkam    schedule 02.01.2018