前言在电商、社交媒体等场景中每天都会产生海量的用户评论文本。如何让计算机理解一段中文文本如何将非结构化的文字转化为算法可以处理的数值这是所有文本分类任务的第一步也是最关键的一步。本文是系列的上篇聚焦于如何将原始中文文本转化为有效的数值特征涵盖 TF-IDF 关键词提取、文本预处理、词向量转换三大核心模块。一、TF-IDF用数学量化词语的重要性在文本分类任务中我们需要将非结构化文本转化为数值特征。而关键词是捕捉文本主题的最直接线索。TF-IDF衡量的正是一个词对一篇文章的代表性或区分度。1.1 词频 TFTerm Frequency定义某一个给定的词语在该文件中出现的次数通常需要归一化以消除文档长度差异。TF 词在文档中出现的次数 / 文档的总词数案例理解在中国的蜜蜂养殖这篇文章中中国、蜜蜂、养殖三个词各出现了 20 次文章总词数为 1000则它们的 TF 都是 0.02。局限仅靠 TF 无法区分关键词。高频词如的、是在所有文档中都很高因此需要引入 IDF 来过滤通用词。1.2 逆文档频率 IDFInverse Document Frequency定义衡量一个词在整个语料库中的稀有程度。包含该词的文档越少IDF 值越大说明该词具有很好的类别区分能力。IDF log(语料库中文档总数 / (包含词的文档数 1))分母加 1 是为了避免除零当词在语料库中从未出现时。这揭示了一个重要的底层逻辑IDF 通过稀有度放大词的区分能力。案例理解假设语料库有 1000 篇文档蜜蜂只出现在 3 篇中则 IDF ≈ log(1000/3) ≈ 5.8中国出现在 500 篇中则 IDF ≈ log(1000/500) ≈ 0.7。可见蜜蜂的 IDF 远大于中国说明蜜蜂更能作为区分文档主题的关键词。IDF 的单调性包含词的文档数量越少IDF 越大反之越小。如果某个词在所有文档中都出现))))如停用词的则 IDF 接近 0。1.3 TF-IDF 计算公式TF-IDF TF × IDF一个词在文档中出现的频率越高TF 大且在整个语料库中越稀有IDF 大则 TF-IDF 值越大越可能是该文档的关键词。案例计算同上例TF 均为 0.02。假设 IDF 计算后中国 ≈ 0.3蜜蜂 ≈ 2.4养殖 ≈ 1.0。则 TF-IDF(中国) 0.006TF-IDF(蜜蜂) 0.048TF-IDF(养殖) 0.02。蜜蜂的 TF-IDF 值最高成为最核心的关键词。1.4 TF-IDF 的局限性TF-IDF 并不是完美的特征提取方法局限性说明无法捕捉语义相似性汽车和车辆会被视为独立特征忽略词序和上下文只考虑词袋模型无法处理语序颠倒的情况对长文档 有偏虽然 TF 做了归一化但长文档可能包含更多不同词汇尽管有这些局限TF-IDF 因其简单高效仍是传统文本分类中最常见的特征提取方法之一。核心辨析TF-IDF vs. 词频TF 仅表示单词在单))))篇文档中的频率而 TF-IDF 结合了全局稀有度因此能更好地消除常见词干扰。IDF 中的1分母加 1 是平滑项不仅防止除零还能在词从未出现时使 IDF ≈ log(N/1) ≈ 较大值。对数底数通常使用自然对数或常用对数不同底数只改变数值大小不影响词之间的相对排序。二、数据预处理将原始文本标准化在掌握了 TF-IDF 如何量化词语重要性之后我们发现 TF-IDF 的演示示例依赖于一个特定格式的语料库每行一篇文章词与词之间用空格分隔。然而现实中的原始文本如书籍、新闻、评论通常包含换行、标点、语气词等大量噪声无法直接喂给特征提取工具。预处理的核心任务就是将任意原始文本清洗、分词并整理成标准语料库格式。2.1 中文分词——为什么需要分词中文文本没有天然的空格分隔单词需要专门算法将句子切割成有语义的词语单元。核心概念分词Word Segmentation原始句子如垃圾苏宁赶紧倒闭是连续字符序列无法直接作为特征。分词后得到列表[垃圾, 苏宁, 赶紧, 倒闭]每个词才有独立含义。工具jieba结巴中文分词库支持三种模式模式特点适用场景精确模式最常用精准切分文本分析、特征提取全模式所有可能的词搜索引擎索引构建搜索引擎模式全模式长词再切搜索引擎查询分析Python# 精确模式默认 words jieba.lcut(我来到北京清华大学) # 输出[我, 来到, 北京, 清华大学]易混淆jieba.cut返回生成器jieba.lcut直接返回列表。在后续需要多次访问分词结果时建议使用lcut一次性获取列表。2.2 停用词过滤——剔除噪声词分词后的结果中包含大量高频但无实际意义的词如的、了、是、在等。这些))))词对文本分类没有贡献反而会增加噪声和维度。核心概念停用词Stop Words指那些在文本中频繁出现但对情感分析无帮助的词如语气词啊、呀、吧、助词的、))))了、标点符号等。Python# 过滤停用词 filtered_words [w for w in words if w not in stopwords]对比示例过滤前[垃圾, 苏宁, 赶紧, , 倒闭]过滤后[垃圾, 苏宁, 赶紧, 倒闭]关键提示停用词表需要根据任务场景调整。例如在情感分析中好、坏等词不应被过滤。将停用词表转换为集合set可以大幅提升查找速度。约 30% 的文本是停用词过滤后可降低约 50% 的特征维度。2.3 统一格式输出——标准语料库格式经过分词和停用词过滤后每篇文章得到一个词语列表。最后一步是将这些列表转换为一行一篇文章、词与词之间用空格分隔的标准格式即语料库格式。Python# 将过滤后的词列表合并为一行文本 corpus_line .join(filtered_words) # 输出来到 北京 清华大学⚠️常见错误直接使用str(words)将列表转为字符串结果会包含方括号和引号如[来到, 北京, 清华大学]。必须使用 .join(words)。三、词向量转换将文本转化为数值矩阵在完成了关键词提取和文本预处理后我们面临一个根本问题原始文本句子如今天下雨我不去打球无法直接输入任何机器学习模型。所有模型本质上是数学算式只能处理数值。本章的任务是将变长的、无序的文本转化为固定维度的数值矩阵。3.1 CountVectorizer——词库构建与词频统计CountVectorizer是 scikit-learn 中的文本特征提取工具其核心方法fit_transform承担了两步工作步骤操作说明① 拟合fit扫描语料库统计不重复词构建全局词汇表② 转换transform统计每篇文章中每个词的出现次数输出固定维度的数值矩阵Pythonfrom sklearn.feature_extraction.text import CountVectorizer vectorizer CountVectorizer() X vectorizer.fit_transform(corpus) # corpus 是预处理后的文章列表 print(vectorizer.get_feature_names_out()) # 获取词汇表 print(X.toarray()) # 转换为可读的稠密矩阵为什么需要 fit 步骤词汇表必须基于整个语料库建立。例如有两篇文章dog cat dog和cat cat cat。如果只看第一篇文章词汇是 {dog, cat}但加上第二篇后词汇表仍然是 {dog, cat}。如果还有一篇文章bird那么词汇表就变成 {dog, cat, bird}。fit保证了词汇表覆盖全局。3.2 稀疏矩阵——为什么要用 toarrayfit_transform返回的是稀疏矩阵scipy.sparse.csr_matrix只存储非零元素的位置和值极大节省内存。存储方式特点适用场景稀疏矩阵只存储非零元素的位置和值大规模文本数据内存高效稠密矩阵toarray存储所有元素包括零调试和理解小规模数据 例如一个 10000 篇文章、20000 个词的矩阵每篇文章平均只有 20 个非零词稀疏矩阵的存储效率极高。sklearn 模型可以直接使用稀疏矩阵训练。3.3 核心参数解析max_features控制保留的最大特征数量。设置过大容易过拟合设置过小可能丢失重要信息。Pythonvectorizer CountVectorizer(max_features4000)ngram_range决定提取词的连续组合范围。参数值特征示例语义捕捉能力(1,1)[手机, 不错]仅单个词(1,2)[手机, 不错, 手机 不错]单个词相邻词组⚠️ngram_range的值越大特征数量会指数级增长。通常设置为(1,2)即可。3.4 词汇表与矩阵的对应关系get_feature_names_out()返回词汇表列表其顺序与矩阵的列索引一一对应。示例词汇表[bert, cat, dog, it]矩阵列索引第 0 列 → bert第 1 列 → cat第 2 列 → dog第 3 列 → it第一篇文章dog dog cat it的行向量[1, 1, 1, 1]第二篇文章cat cat的行向量[0, 2, 0, 0]核心理解无论原文长短每一篇文章都被映射为相同长度))))的向量从而可以统一输入给分类模型。本节小结知识点核心理解TF-IDFTF × IDF综合反映词对文档的代表性IDF通过稀有度放大词的区分能力中文分词使用jieba的精确模式将连续文本切分为词语列表停用词过滤去除高频但无意义的词如“的”、“了”降低约50%的特征维度CountVectorizer先fit构建全局词汇表再transform输出固定维度的词频矩阵稀疏矩阵只存储非零元素极大节省内存max_features控制词汇表大小防止维度爆炸ngram_range控制是否考虑连续词组捕捉上下文语义