Python生成TDM时表头存在无效低频词汇问题
Python词文档矩阵(TDM)表头残留零频词汇的解决方法
问题描述
我用Python开发了一个词文档矩阵(TDM)生成工具,功能是读取其他应用导出的CSV文件并生成对应的词文档矩阵。但目前遇到一个问题:字典中部分频率为0的词汇(如one、simply、focus、money等)仍会出现在矩阵表头中。我尝试过一些修复手段,但结果反而更糟。
当前输出截图:
[输出截图占位]
相关代码片段:
# 示例代码(请替换为你的实际代码) import pandas as pd from sklearn.feature_extraction.text import CountVectorizer def build_tdm(csv_file): df = pd.read_csv(csv_file) # 假设使用了自定义词汇表 custom_vocab = ["one", "simply", "focus", "money", ...] vectorizer = CountVectorizer(vocabulary=custom_vocab) tdm_matrix = vectorizer.fit_transform(df['content']) tdm_df = pd.DataFrame(tdm_matrix.toarray(), columns=vectorizer.get_feature_names_out()) return tdm_df
解决思路
1. 从源头过滤零频词(推荐)
如果你的TDM基于自定义词汇表构建,问题核心在于词汇表本身包含了零频词。可以先从语料库中统计词频,再过滤掉全局出现次数为0的词:
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer def build_clean_tdm(csv_file): df = pd.read_csv(csv_file) # 先拟合所有文本获取全局词频 temp_vectorizer = CountVectorizer() temp_vectorizer.fit(df['content']) # 计算每个词的总出现次数 total_word_counts = temp_vectorizer.transform(df['content']).sum(axis=0).tolist()[0] # 过滤出非零频词 filtered_vocab = [ word for word, idx in temp_vectorizer.vocabulary_.items() if total_word_counts[idx] > 0 ] # 用过滤后的词汇表生成TDM final_vectorizer = CountVectorizer(vocabulary=filtered_vocab) tdm_matrix = final_vectorizer.fit_transform(df['content']) tdm_df = pd.DataFrame(tdm_matrix.toarray(), columns=final_vectorizer.get_feature_names_out()) return tdm_df
2. 生成TDM后直接清理零频列
如果已经生成了带零频词的TDM,可以直接删除所有行求和为0的列:
# 过滤所有值全为0的列 tdm_df = tdm_df.loc[:, (tdm_df != 0).any(axis=0)]
这个方法操作简单,但如果词汇表规模很大,效率不如提前过滤词汇表。
3. 检查CountVectorizer参数
如果你使用sklearn的CountVectorizer,注意vocabulary参数会强制保留传入的所有词汇,不管频率。如果必须用自定义词汇表,要先手动清理掉其中的零频词。
4. 排查之前修复失败的原因
如果之前的修复导致问题恶化,大概率是以下情况:
- 错误过滤了非零频词,导致有用词汇被移除
- 修改词汇表后没有重新拟合/转换数据,造成表头与矩阵不匹配
- 误操作破坏了词汇表的索引映射
建议回滚到能正常生成TDM(仅存在零频词问题)的版本,再逐步应用上述过滤逻辑。
内容的提问来源于stack exchange,提问作者CommHub
相关产品推荐
相关产品推荐

