所以我试图从文本中提取一些信息,我正在使用 NLTK 分块。
这是我的输入
The stocks show 67% rise, last year it was 12% fall
我想捕捉
67% rise
和12% fall
POS Tagging 上面这句话显示
('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:{<:>}
这匹配:
输入中的所有 s。所以我要做的就是
XYZ:{<%>}
这不起作用。我试图%
逃避
XYZ:{<\%>}
但这也不起作用。我试过\\
但无济于事。我真的不想修改输入字符串,因为一旦我匹配,我想找出匹配字符串的索引。因此,如果我修改输入字符串,除非我先进行反向转换,否则我的索引将被抛出