You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改正则表达式,使分词器将连字符单词识别为单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:44