Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NLTK区块解析器:如何转义特殊字符_Python_Nlp_Nltk_Pos Tagger_Text Chunking - Fatal编程技术网

Python 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'), ('

因此,我试图从文本中提取一些信息,并使用NLTK分块

这是我的意见

股票上涨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)?}