2017-02-11 14 views
0

Так что я пытаюсь извлечь некоторую информацию из текста, и я использую Chunking NLTK.NLTK Chunk Parser: Как избежать специальных символов

Вот мой вход

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)?}

, но это правило ничего не соответствует в настоящее время. Как мне избежать/включить % в моем правиле chunk?

Update

Итак, что я не понимаю, что я могу соответствовать другим специальным символам. Например, если у меня есть правило как

XYZ:{<:>}

это соответствует всем : сек на входе. Так что все, что я пытаюсь сделать, это

XYZ:{<%>}

и это не работает. Я пытался избежать % по

XYZ:{<\%>}

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

+1

Я думаю, что вы не можете соответствовать тексту (''%), только свои метки (как ни странно, 'NN'). Если вы получаете еще один тег POS, который дает вам отличный тег для '%', тогда вы можете улучшить chunker. – lenz

+0

я смогу использовать chunker nltk с другими тегерами POS? Есть ли в nltk другие пометки? или я должен пойти на что-то вроде stanford pos taggers? – AbtPst

+0

@ lenz Есть ли способ указать правило, такое как 'NN, которое соответствует строке%'? – AbtPst

ответ

1

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

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

Вы также можете получить список ключевых слов, которые вы хотите заменить, так что ваши правила порций не становятся слишком долго.

например.

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)?} 
+0

Вы уверены, что знакомы с тем, как ChunkParser интерпретирует выражения chunk, которые работают с помеченным текстом? – lenz

+0

спасибо, но побег не сработал – AbtPst

+0

lenz: Не могли бы вы активировать? Мое последнее предложение? Это не было дано в качестве рабочего примера, а в качестве предложения. Я лично не использую NLTK, но Pattern, просматривая документацию NLTKs, представляется возможным включить такие символы, как%, путем экранирования их, поскольку указано, что правила являются просто регулярными выражениями. – alexisdevarennes

0

использовать шаблон < CD> < NN> +