Stanford NLP TokenRegex规则匹配问题:如何实现双规则同时命中?
解决Stanford NLP TokenRegex多规则同时匹配的问题
这个问题其实是TokenRegex默认的匹配策略导致的——它默认会优先匹配最长的序列,而且不允许同一个token被多个规则重复匹配。所以当Rule 2匹配到了Samsung Notebook 9 Pen这个长序列后,里面的单个名词就被“占用”了,没法再被Rule 1单独命中。
要让两个规则同时生效,你只需要开启重叠匹配功能就行,具体分两种情况操作:
1. 规则文件配置方式
如果是用规则文件来定义规则,你可以在文件开头添加全局配置,开启允许重叠匹配:
{ "allowOverlappingMatches": true, "rules": [ { "ruleType":"tokens", "pattern":([{tag:/NN/}|{tag:/NNP/}]), "result":"Single noun" }, { "ruleType": "tokens", "pattern":([{tag:/NN.*/}|{tag:/CD/}]), "result": "Noun with Number" } ] }
(注:我把你Rule 2里的CD*改成了CD,因为CD*会匹配零个或多个CD标签,这可能不是你想要的效果——如果确实需要匹配多个数字标签,可以保留CD+或者CD*)
2. 代码调用方式
如果是用Java代码直接调用TokenRegex,那就在创建匹配器后,手动开启重叠匹配:
// 假设你已经获取到了tokens和tokenPattern TokenSequenceMatcher matcher = tokenPattern.getMatcher(tokens); // 开启重叠匹配 matcher.setAllowOverlappingMatches(true); // 遍历所有匹配结果 while (matcher.find()) { String resultType = matcher.getMatchResult(); List<CoreLabel> matchedTokens = matcher.groupNodes(); // 处理你的匹配结果 }
开启重叠匹配后,TokenRegex就会允许同一个token被多个规则匹配了:Rule 1会命中note、Samsung、Notebook、Pen这些单个名词,而Rule 2依然会命中Samsung Notebook 9 Pen这个完整序列,这样你就能同时得到两种匹配结果了。
内容的提问来源于stack exchange,提问作者Bless Babu
相关产品推荐
相关产品推荐

