Python NLTK区块解析器:如何转义特殊字符
因此,我试图从文本中提取一些信息,并使用NLTK分块 这是我的意见Python NLTK区块解析器:如何转义特殊字符,python,nlp,nltk,pos-tagger,text-chunking,Python,Nlp,Nltk,Pos Tagger,Text Chunking,因此,我试图从文本中提取一些信息,并使用NLTK分块 这是我的意见 股票上涨67%,去年下跌12% 我想抓住 67%上升和12%下降 以上句子的词性标注显示 ('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('
股票上涨67%,去年下跌12%
我想抓住
67%上升
和12%下降
以上句子的词性标注显示
('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:{(+||JJ)}
它工作得很好,可以捕获
('67', 'CD'), ('%', 'NN'), ('rise', 'NN')
('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
但在我的数据集中,我有
500万美元
那是
('5','CD'),('man','NN'),('stock','NN')
而且也被错误地捕获。所以我想在规则中加入%
符号
Stat:{(+||JJ)}
但这条规则现在什么都不符合。如何在区块规则中转义/包含%
更新
所以,我不明白的是,我可以匹配其他特殊字符。例如,如果我有一个规则
XYZ:{}
这与输入中的所有:
匹配。所以我想做的就是
XYZ:{}
这是行不通的。我已尝试通过退出%
XYZ:{}
但这也不起作用。我试过
\
,但没用。我真的不想修改输入字符串,因为一旦匹配,我想找出匹配字符串的索引。因此,如果我修改输入字符串,除非我先做一个反向转换,否则它将丢弃我的索引,因为它是一个正则表达式,您可以对它进行转义
Stat: {<CD><\%>(<NN>+|<VBN>|JJ)?}
Stat:{(+| | JJ)}
您还可以有一个要替换的关键字列表,这样块规则就不会变得太长
e、 g
s='56%上升,75%下降'
gen_替换=[(“%”、“百分比”)、(“百分比”)、“百分比”)等]
对于ndl,gen_更换件中的rpl:
s=s.replace(“%s”%ndl,“%s”%rpl)
统计:{(+| | JJ)}
使用如下模式
+你确定你熟悉ChunkParser解释块表达式的方式吗?它对标记文本进行操作。lenz:你能解释一下吗?我的后一个建议?这不是作为一个有效的例子,而是作为一个建议。我个人并不使用NLTK,但通过阅读NLTKs文档,似乎可以通过转义包含诸如%之类的字符,因为规则只是正则表达式。它们不仅仅是正则表达式–否则,
+
将被解释为“一个小于,两个N,一个或多个大于”,而不是“一个或多个名词”。还有一个额外的翻译步骤。它们应用于标记序列,而不是文本本身。顺便说一句:请在我的名字前面使用“@”,这样当你在这里问我问题时,我会收到通知。我想你无法匹配文本(%
),只有它的标记(奇怪的是,NN
)。如果您得到另一个POS标记器,它为%
提供了一个不同的标记,那么您可能能够改进chunker。我是否能够将nltk的chunker与其他POS标记器一起使用?nltk是否有其他POS标记器可用?或者我应该使用类似于斯坦福POS标记器的东西?@lenz有没有办法指定一个规则,例如NN匹配字符串%
?如果标记器的标记集与块规则中的标记集相同,则可以使用任何标记器,即使是NLTK之外的标记器(或Python)。可能有一种方法可以指定令牌,而不仅仅是它的标签,但我在文档中找不到任何相关内容。无论如何,这与转义无关。也许你应该改写问题(及其标题),或者发布一个新问题以引起正确的人的注意。
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)?}