如何通过迭代使用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
相关产品推荐
相关产品推荐

