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

如何在分词时分离撇号?现有Python分词函数未达预期

解决分词中撇号拆分问题

你的问题出在原正则只处理连续的非单词字符,但像isn't、O'Brian里的单个撇号夹在字母中间,不属于连续非单词字符,所以没法被拆分出来。

试试这个修改后的函数,分两步处理:

from typing import List
import re

def tokenize(text: str) -> List[str]:
    # 先拆分夹在字母中间的撇号,给撇号前后加空格
    text = re.sub(r"([a-zA-Z])'([a-zA-Z])", r"\1 ' \2", text)
    # 处理所有非单词字符,前后加空格后转小写
    text = re.sub(r"(\W+)", r" \1 ", text.lower())
    # 拆分并过滤可能的空字符串
    return [token for token in text.split() if token]

测试你的输入:

input_text = "He said 'Isn't O'Brian the best?'"
print(tokenize(input_text))

输出结果正好符合你的期望:

['he', 'said', "'", 'isn', "'", 't', 'o', "'", 'brian', 'the', 'best', "?'"]

逻辑说明:

  1. 第一步正则([a-zA-Z])'([a-zA-Z])专门匹配字母-撇号-字母的结构,把撇号单独拆出来,比如Isn't变成Isn ' t,O'Brian变成O ' Brian。
  2. 第二步再用原逻辑处理所有连续的非单词字符(比如开头的'、结尾的?'),给它们前后加空格,转小写后拆分。
  3. 最后过滤空字符串是为了避免连续空格导致的空元素,让结果更干净。

内容的提问来源于stack exchange,提问作者zen145

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:31:35