修改正则表达式,使分词器将连字符单词识别为单个Token
解决分词器拆分连字符单词的问题
我懂你现在的困扰——原有的分词器会把带连字符的单词(比如half-life)拆成两个独立的token,这完全不是你想要的效果。咱们来一步步把这个问题搞定:
原代码的问题根源
你用的正则表达式是:
[(m.start(0), m.end(0), m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+", target_sentence)]
这里的\w+只能匹配字母、数字和下划线,连字符-不在\w的匹配范围内。所以遇到half-life时,\w+会先匹配half,剩下的-life会被最后一个分支\S+接手,直接把完整单词拆成了两部分。
修改后的解决方案
咱们只需要调整正则里的单词匹配规则,把连字符加入可匹配的字符池,同时保留其他规则不变。修改后的代码如下:
import re target_sentence = "half-life is a single token" tokens = [(m.start(0), m.end(0), m.group()) for m in re.finditer(r"[\w-]+|\$[\d\.]+|\S+", target_sentence)] print(tokens)
运行这段代码后,针对你的测试句子,会得到完全符合预期的结果:
[(0, 9, 'half-life'), (10, 12, 'is'), (13, 14, 'a'), (15, 21, 'single'), (22, 27, 'token')]
进阶优化(可选)
如果你想避免匹配首尾带连字符的无效字符串(比如-test或者test-),可以把正则再细化一步:
r"\w+(?:-\w+)*|\$[\d\.]+|\S+"
这个正则的逻辑是:
\w+:匹配开头的字母/数字/下划线(?:-\w+)*:匹配零个或多个「连字符+字母/数字/下划线」的组合(非捕获组,不会额外生成分组数据)- 后面的
\$[\d\.]+和\S+保持原有的匹配逻辑
这样就能精准识别中间带连字符的合法单词,同时不会误匹配单独的连字符或者首尾带连字符的无效内容。
内容的提问来源于stack exchange,提问作者seanysull
相关产品推荐
相关产品推荐

