NLTK分词异常:含连续重复字母单词被拆分问题求助
问题原因
nltk.tokenize.word_tokenize基于Penn Treebank分词规范,这套规则会将口语化缩约词(比如gonna、wanna)拆分为词根和后缀部分——gonna本质是"going to"的口语缩合,按照规则会被拆成gon和na,这是工具内置的行为,并非你的代码逻辑问题。
解决方案1:使用nltk的TweetTokenizer
TweetTokenizer专门针对口语化/社交媒体文本优化,能保留gonna这类缩约词作为单个token:
from nltk.tokenize import TweetTokenizer def clean_str_and_tokenise(line): chars_to_remove = [',', '.', '"', "'", '/', '*', ',', '?', '!', '-', '\n', '“', '”', '_', '&', '\ufeff', '&', ';', ":"] text_clean = "".join([i.lower() for i in line if i not in chars_to_remove]) print(text_clean) tknzr = TweetTokenizer() return tknzr.tokenize(text_clean)
测试test_str2会得到预期结果:['never', 'gonna', 'give', 'you', 'up']
解决方案2:自定义正则分词规则
如果不想替换原有分词器,可以用正则匹配指定缩约词,优先保留它们:
import re from nltk.tokenize import word_tokenize # 定义需要保留的口语缩约词列表 contractions = r'\b(gonna|wanna|gotta|lemme|gimme)\b' def clean_str_and_tokenise(line): chars_to_remove = [',', '.', '"', "'", '/', '*', ',', '?', '!', '-', '\n', '“', '”', '_', '&', '\ufeff', '&', ';', ":"] text_clean = "".join([i.lower() for i in line if i not in chars_to_remove]) print(text_clean) tokens = [] # 分割文本:缩约词和其他部分 parts = re.split(f'({contractions})', text_clean) for part in parts: if part.strip(): if re.match(contractions, part): tokens.append(part) else: tokens.extend(word_tokenize(part)) return tokens
这个方法可以精准控制需要保留的缩约词,同时兼容原分词逻辑。
解决方案3:使用spaCy分词器
spaCy的预训练模型对日常口语词汇的处理更精准,默认就能识别gonna为单个token:
import spacy # 需先安装spaCy并下载模型:python -m spacy download en_core_web_sm nlp = spacy.load("en_core_web_sm") def clean_str_and_tokenise(line): chars_to_remove = [',', '.', '"', "'", '/', '*', ',', '?', '!', '-', '\n', '“', '”', '_', '&', '\ufeff', '&', ';', ":"] text_clean = "".join([i.lower() for i in line if i not in chars_to_remove]) print(text_clean) doc = nlp(text_clean) return [token.text for token in doc]
内容的提问来源于stack exchange,提问作者avg-bitsian
相关产品推荐
相关产品推荐

