quanteda中kwic非预期正则匹配的原因及精准匹配方法
为什么quanteda的regex短语匹配会误匹配变形词?怎么实现精准匹配?
问题原因
你遇到的非预期匹配,核心是quanteda对phrase()结合valuetype="regex"的解析逻辑和常规字符串正则匹配不一样:
- 当你把
\\bplay the piano\\b传入phrase()时,quanteda会自动按空格把这个字符串拆成三个独立的正则模式:\\bplay、the、piano\\b,而不是把整个字符串当作一个完整的正则去匹配原始文本。 - 同时,quanteda的
regex匹配默认是部分匹配——只要token里存在能匹配正则的片段就算匹配,不是要求整个token完全符合正则。比如\\bplay这个模式,会匹配任何以"play"开头的token("plays"、"played"的开头都是"play",且开头是单词边界),所以这两个变形词都能被匹配到,最终导致整个短语被误匹配。
精准匹配的实现方法
有两种简单的方式实现你要的精准匹配:
方法1:使用精确匹配(推荐)
直接将valuetype设为"fixed",quanteda会严格匹配连续的三个token正好是"play"、"the"、"piano"的情况,不需要正则:
library(quanteda) testcorpus <- c( "I play the piano", "He plays the piano", "They played the piano", "I play the saxophone", "I play the Roland piano" ) tokenized <- tokens(testcorpus) kk <- kwic(tokenized, phrase("play the piano"), valuetype = "fixed") print(kk)
运行后只会输出唯一的精准匹配结果:
Keyword-in-context with 1 match. [text1, 2:4] I | play the piano |
方法2:使用正则强制全token匹配
如果一定要用正则,需要给每个token的正则加上^(开头)和$(结尾),强制要求整个token完全匹配正则模式,再用phrase()组合成短语:
kk <- kwic(tokenized, phrase(c("^play$", "^the$", "^piano$")), valuetype = "regex") print(kk)
这种方式同样会得到精准匹配的结果,因为^play$只会匹配完全等于"play"的token,不会匹配"plays"或"played"这类变形词。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

