使用scikit-learn构建词项文档矩阵时如何避免拆分带连字符的词汇
解决方案
问题原因
sklearn的CountVectorizer默认分词规则仅匹配连续字母/数字组合,会自动把连字符当作分词分隔符,因此会拆分带连字符的葡萄牙语复合名词。
方案1:修改默认分词正则表达式(最简单高效,适配20万级语料无性能损耗)
直接修改CountVectorizer的token_pattern参数,将连字符加入允许匹配的字符范围即可,正则规则自带Unicode适配,可正常识别葡萄牙语带重音的字符,同时自动剔除词汇首尾的标点符号。
只需修改你代码中初始化CountVectorizer的代码行:
# 自定义分词规则:允许词汇包含字母、数字、连字符,兼容Unicode编码 vect = CountVectorizer(token_pattern=r'(?u)\b[\w-]+\b')
使用你的测试语料运行后,生成的词项文档矩阵会直接保留guarda-chuva、covid-19、teto-de-gastos这类带连字符的词汇作为单独列,不会被拆分。
方案2:自定义分词函数(适配更复杂的预处理需求)
如果后续你还有其他自定义分词需求,比如需要额外过滤特定符号、保留其他特殊字符,可以自己写分词函数传给tokenizer参数,示例如下:
import re # 自定义分词逻辑:先去除所有非空格、非字母、非数字、非连字符的符号,再按空格拆分 def custom_tokenizer(text): # 剔除不需要的标点符号 cleaned_text = re.sub(r'[^\w\s-]', '', text) # 按空格拆分得到token return cleaned_text.split() # 调用时传入自定义分词器,注意需要关闭默认的分词正则匹配 vect = CountVectorizer(tokenizer=custom_tokenizer, token_pattern=None)
内容的提问来源于stack exchange,提问作者Thomas GF
相关产品推荐
相关产品推荐

