所以我试图从文本中提取一些信息,我正在使用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:{<\%>}
但这也不起作用。我试过\\
但无济于事。我真的不想修改输入字符串,因为我已经匹配,我想找出匹配字符串的索引。因此,如果我修改输入字符串,那将抛弃我的索引,除非我先进行反向转换
答案 0 :(得分:0)
好吧,因为它是一个正则表达式,你可以逃脱它。
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)?}
答案 1 :(得分:0)
使用类似的模式 &LT; CD &GT;&LT; NN &GT; +