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

如何拼接文本单个字符?解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:02