如何拼接文本单个字符?解决CountVectorizer分词统计缺失列问题
问题分析
你遇到的核心问题是CountVectorizer默认的分词规则会过滤掉单个字符——它默认的token_pattern是r'(?u)\b\w\w+\b',只识别长度≥2的单词,所以D B M LTD里的单个字母D、B、M会被直接忽略,没法生成对应列。而你的需求是把这类分散的单个字母缩写合并成完整的缩写词(比如把D B M转成DBM),同时保留正常的多字符单词(比如LTD)。
最优解决方案:预处理文本合并单个字符缩写
我们可以用正则表达式写一个预处理函数,自动识别并合并连续的单个字符(被空格分隔的),然后再交给CountVectorizer处理。这种方法既符合公司名缩写的常见格式,又能让CountVectorizer正确识别这些缩写词。
步骤1:编写预处理函数
这个函数会匹配文本中连续的单个字符序列,把它们的空格去掉合并:
import re def merge_single_char_abbr(text): # 匹配连续的单个字符(每个字符都是单独的单词,用空格分隔) # 用回调函数把匹配到的部分去掉空格 return re.sub(r'(\b\w\b)(?:\s+\b\w\b)+', lambda match: match.group(0).replace(' ', ''), text)
测试一下效果:
print(merge_single_char_abbr('D B M LTD')) # 输出: 'DBM LTD' print(merge_single_char_abbr('Costa Limited')) # 输出: 'Costa Limited'(无变化)
步骤2:预处理列表后再用CountVectorizer
把原始公司名列表全部预处理,再传入CountVectorizer:
from sklearn.feature_extraction.text import CountVectorizer compNames = ['Costa Limited', 'D B M LTD'] # 预处理所有公司名 processed_comp_names = [merge_single_char_abbr(name) for name in compNames] # 初始化并训练CountVectorizer count_vect = CountVectorizer(analyzer='word') count_matrix = count_vect.fit_transform(processed_comp_names).toarray() # 查看生成的特征词 print("特征词列表:", count_vect.get_feature_names_out()) # 输出: ['costa', 'dbm', 'limited', 'ltd'] # 查看词频矩阵 print("词频统计矩阵:\n", count_matrix) # 输出: # [[1 0 1 0] # [0 1 0 1]]
补充:如果需要保留单个字符的情况
如果你确实需要让CountVectorizer识别单个字符(而不是合并),可以修改它的token_pattern参数,让它匹配所有长度≥1的单词:
count_vect = CountVectorizer(analyzer='word', token_pattern=r'(?u)\b\w+\b')
但这种方法不推荐用于你的场景——因为公司名里的单个字母通常是缩写的一部分,合并成完整缩写更符合语义,也能避免生成过多无意义的单个字符特征。
内容的提问来源于stack exchange,提问作者S.Perera
相关产品推荐
相关产品推荐

