如何在分词时分离撇号?现有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', "?'"]
逻辑说明:
- 第一步正则
([a-zA-Z])'([a-zA-Z])专门匹配字母-撇号-字母的结构,把撇号单独拆出来,比如Isn't变成Isn ' t,O'Brian变成O ' Brian。 - 第二步再用原逻辑处理所有连续的非单词字符(比如开头的
'、结尾的?'),给它们前后加空格,转小写后拆分。 - 最后过滤空字符串是为了避免连续空格导致的空元素,让结果更干净。
内容的提问来源于stack exchange,提问作者zen145
相关产品推荐
相关产品推荐

