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

如何通过迭代使用CountVectorizer构建文档-词项矩阵?

CountVectorizer构建文档-词项矩阵的正确姿势

问题背景

需要基于以下句子列表,用CountVectorizer()构建文档-词项矩阵:

tokens_sents = [
    'go local restaraunt yesterday evening try pasta .',
    'expect delicious , eatable .',
    'smell really bad delicious .',
    'never eat pasta restaraunt taste pasta awful']

手动传入部分句子调用fit_transform()能得到预期的文档-词项矩阵,但迭代处理时仅返回最后一句的结果,无法生成完整矩阵。

错误原因

迭代中每次调用vectorizer.fit_transform([tokens_sents[i]])时,fit()步骤会重新构建词汇表,覆盖之前的词汇信息,最终仅保留最后一次拟合的词汇表,因此结果只包含最后一句的词项计数。

正确解决方案

方法1:直接传入整个句子列表(推荐)

CountVectorizer的fit_transform()原生支持传入文本列表,无需手动迭代,这是最高效的方式:

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

vectorizer = CountVectorizer()
# 直接传入整个句子列表
X = vectorizer.fit_transform(tokens_sents)
df_bow_sklearn = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
print(df_bow_sklearn)

输出结果:

awful  bad  delicious  eat  eatable  evening  expect  go  local  never  pasta  really  restaraunt  smell  taste  try  yesterday
0      0    0          0    0        0        1       0   1      1      0      1       0           1      0      0    1          1
1      0    0          1    0        1        0       1   0      0      0      0       0           0      0      0    0          0
2      0    1          1    0        0        0       0   0      0      0      0       1           0      1      0    0          0
3      1    0          0    1        0        0       0   0      0      1      2       0           1      0      1    0          0

方法2:迭代追加稀疏矩阵(适合大数据分批处理)

若数据量过大无法一次性加载,可先拟合完整词汇表,再迭代转换每个句子并拼接稀疏矩阵:

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
from scipy.sparse import vstack

vectorizer = CountVectorizer()
# 先拟合所有文本,构建完整词汇表
vectorizer.fit(tokens_sents)

# 初始化空的稀疏矩阵
X = None
for sent in tokens_sents:
    # 仅转换,不重新拟合
    sent_vec = vectorizer.transform([sent])
    if X is None:
        X = sent_vec
    else:
        # 垂直拼接稀疏矩阵
        X = vstack([X, sent_vec])

df_bow_sklearn = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
print(df_bow_sklearn)

此方法利用稀疏矩阵的高效拼接特性,避免内存占用过高,最终结果与方法1一致。

内容的提问来源于stack exchange,提问作者gray KK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:40:33