市图书馆的老林,一干就是二十年。每天清晨,出版社的大卡车都会把成箱的新书倒进仓库,老林的任务,就是在一堆堆散装书里快速判断:这本该进“自然科学”书架,那本该进“美食烹饪”书架,还有几本八成是侦探小说。这活儿听起来简单,可对一台冷冰冰的计算机来说,书里的文字只是一串毫无意义的字符,它连“猫”和“狗”谁是谁都分不清。老林有个聪明的土办法:他从来不逐页读书,而是把每本书先“拆词”——就像大厨备菜时把整棵娃娃菜掰成叶片,再去掉黄叶烂根,最后数出这筐菜里有哪些食材、各有多少。只要看一眼“量子物理”的书里满是“量子、波函数”,而“红烧肉秘籍”里满是“酱油、火候”,分类的答案就呼之欲出了。这套“拆菜、数菜、打特色分、凭经验下判断”的方法,在 AI 世界里有一个正式的名字——文本分类。而其中最基础的两件工具,就是 BoW 词袋模型与 TF-IDF 权重算法,再加上一位“有经验的分类老师”:朴素贝叶斯分类器。本文将带你亲手搭起这套系统,从文本清洗到特征提取,从模型训练到效果评估,用一场“图书馆实战”把你从零带到能独立完成文本分类任务。
文本分类是 NLP 最基础的落地技能,掌握 BoW 与 TF-IDF 的特征工程思路,能让你理解向量化与特征权重的本质,为后续上手 BERT 等深度模型打下坚实直觉。
可视化演示
展示TCP连接建立的三次握手流程,动态演示SYN、SYN+ACK、ACK报文交互与客户端服务端状态转换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
TCP三次握手建立连接 客户端发送SYN报文,进入SYN_SENT状态,等待服务端确认 SYN(seq=x) 三次握手确保双方收发能力正常
文本预处理
市图书馆的老林每天都要给新书分类,但他从不一口气把书读完,而是先做一件看似枯燥的事——“拆书”。他把封面腰封、目录页脚这些干扰信息统统丢到一边,只留下正文,再把正文切成一个个能查字典的词。这就像大厨备菜,先把整棵娃娃菜掰成叶片,再摘掉发黄的叶子,只留下最干净的部分下锅。
在 AI 世界里,这个“拆书备菜”的过程叫文本预处理。计算机不认识句子,只认识词,我们得先把原始文本切成词,再滤掉噪音,才能喂给机器。英文天生用空格隔词,中文没有空格,需要 jieba 这样的分词工具来切。常见的预处理步骤有三步:分词、去除停用词、词形还原。
分词把连续文本切成独立的词语序列;去停用词是丢掉“的、了、在”这类几乎每篇文档都会出现、却毫无区分度的功能词;词形还原则把英语里的 cats 还原成 cat、running 还原成 run,把同一词的不同形态合并成一个特征。三步做完,一篇文章就变成一份干净的“词列表”,公式表示如下:
预处理之后,老林手里的书不再是密密麻麻的文字,而是一筐筐按词归置好的“食材”。接下来,他就要开始往筐里数数量、打标签了——这正是词袋模型的舞台。
- 原始文本表示一段未经处理的原始文本,比如一句话或一篇文章。
- 分词操作把连续的字符串按空格或词典切成一个个独立的词。
- 词序列切分后得到的有序词语集合,n 是分词后的词语总数。
- 过滤停用词剔除“的、了、在”这类高频但无区分作用的停用词。
- 干净词序列过滤后留下的核心词序列,m 通常远小于 n,是后续建模的输入。
词袋模型
老林把一本书预处理完,得到一串食材清单。但他很快发现,与其按句子顺序记录“先放了猪肉,又放了白菜”,不如直接问:这筐菜里到底有哪些食材?每样多少?于是他找来一个巨大的布口袋,把书里所有词往口袋里一倒——这就是“词袋子”。
词袋模型(Bag of Words,BoW)的核心思想,正是把一篇文档看成“一袋词”,完全忽略语序和语法,只统计每个词出现的次数。每篇文档因此可以转换成一个固定长度的向量,像一张“食材数量清单”。
具体做法分三步:首先,把整个语料库所有出现过的词去重,构建一张“词汇表”V,词汇表大小 |V| 就是向量的维度;然后,对每一篇文档,统计每个词在其中出现的次数,得到一个 |V| 维的计数向量;最后,由于一篇文档只提及少数词,向量里绝大多数位置是 0,这种“高维稀疏”的向量用稀疏矩阵存储,可大幅节省内存和计算量。
有了这张“食材数量清单”,老林能把任意一本书变成一张数字表。但问题随之而来:清单上“盐、水”这种词每本书都有,数量还不少,它们真的能代表这本书的特色吗?于是,老林决定给每种食材打一个“特色分”。
- 文档向量一篇文档转换后的特征向量,相当于这本书的“食材清单编号”。
- 向量展开向量的每个位置对应词汇表里的一个词,整体是一个长元组。
- 词汇表大小词汇表 V 中词的个数,它决定了特征向量的维度。
- 词频计数统计词 $w_i$ 在这篇文档里到底出现了几次,次数就是该维度的取值。
TF-IDF原理
老林对着两本书的食材清单发愁:一本《量子物理入门》和一本《量子烹饪奇谭》,都出现了不少“量子”;可无论哪本书,清单里都少不了“的、和、是、了”这几位“钉子户”。如果按数量排序,钉子户们总是排最前面,但对判断书的内容毫无帮助。老林决定:给每个词算一个“特色分”,让真正代表主题的食材脱颖而出。
这个“特色分”在信息检索领域有标准算法,叫 TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)。它由两部分相乘:词频 TF(Term Frequency)衡量词在单篇文档里出现的频繁程度;逆文档频率 IDF(Inverse Document Frequency)衡量词在整个语料库里的稀有程度。
TF 可以用原始计数,也可以除以文档总词数做归一化。IDF 的计算公式是 log(N / (1 + DF(t))),其中 N 是语料库文档总数,DF(t) 是包含词 t 的文档数。一个词若只在少数文档里出现,DF 很小,IDF 就大,说明它很有辨识度;若像“的”一样每篇文档都有,DF 接近 N,IDF 就趋近于 0。最终用 TF 乘以 IDF,既保留词在文档中的重要性,又打压“钉子户词”。
给每样食材打完特色分,老林的清单终于靠谱了:“量子”在科学书里高分上榜,“西红柿炒蛋”在美食书里独占鳌头,“的、了”们被压到最低分。现在,这些加权数字就成了机器判断书籍类别的“证据”。不过,光有证据还不够,老林还需要一套“按证据下判断”的规则——这就要请出朴素贝叶斯。
- 词项权重词 t 在文档 d 中的最终特征权重,权重越大,对区分文档越有用。
- 词频词 t 在文档 d 中出现的频率,体现“这个词在这篇文章里多常见”。
- 对数运算对分数做对数变换,把巨大的倍数差压缩到可比较的尺度。
- 文档总数语料库里的文档总数量,是 IDF 计算的基准。
- 逆文档频率DF(t) 是包含词 t 的文档数,含该词的文档越多,这个值越小。
朴素贝叶斯
老林在图书馆干了二十年,心里早有了一套直觉:看到“量子、波函数”,十有八九是物理书;看到“黄油、烤箱、打发”,多半是烘焙书;看到“武林、江湖、秘籍”,一定是武侠小说。这些直觉,本质上就是多年积累的“经验概率”。
把这种经验判断数学化,就是贝叶斯定理。朴素贝叶斯分类器(Naive Bayes)用它来回答一个问题:给定一篇文档的特征(各词的 TF-IDF 权重或词频),它属于每个类别的概率分别是多少?我们取概率最大的类别作为最终预测。
公式记作 P(c|x) ∝ P(c) × ∏P(w_i|c)。其中 P(c) 是先验概率,表示类别 c 在训练样本中的占比;P(w_i|c) 是类条件概率,表示在类别 c 的文档中词 w_i 出现的概率;“朴素”体现在假设各个词相互独立,所以可以直接连乘。但有个隐患:如果某个词在训练集的某类中从未出现,P(w_i|c) 会等于 0,连乘结果整体变 0。解决办法是拉普拉斯平滑(Laplace Smoothing),在分子分母同时加上小常数,让概率永远不会为 0。
老林每月复盘时,分类经验中“什么样的词出现,书更可能是哪类”的概率不断被刷新。新书一到,他只需把食材清单喂给经验公式,就能算出一个最可能的答案。不过,老林怎么知道自己分得准不准呢?馆长可不会只看他自我感觉良好——这就要进入模型评估环节。
- 后验概率看到特征向量后,文档属于类别 c 的概率,这是我们最终要比较的量。
- 正比符号左右两边只差一个与类别无关的常数,比较大小可以忽略它。
- 先验概率类别 c 在所有训练文档中占的比例,类比“馆藏中物理书占比 20%”。
- 条件概率连乘把每个词在类别 c 下出现的概率相乘,汇总全部证据。
- 平滑分子词频计数加 1,即使某词从未出现也不会得到概率 0。
- 平滑分母分母加上词汇表大小,保证所有词的概率之和仍然为 1。
模型评估
月底,馆长让老林复盘:这个月一共给 200 本书分了类,分对了多少?老林翻开记录本,发现自己一共标了 50 本“物理书”,可真正属于物理类的只有 40 本;而物理类书架实际新进了 60 本,也就是说还有 20 本物理书被他错分到了别的书架。
分类模型同样需要这样的“复盘”。最朴素的指标是准确率(Accuracy):分对的样本占总样本的比例。但它有盲区——当类别极不平衡时(比如 99% 是普通邮件、只有 1% 是垃圾邮件),哪怕全部预测为普通邮件也有 99% 准确率,模型却毫无用处。因此我们还需要精确率(Precision)和召回率(Recall)。
精确率回答“预测为正例的样本里,有多少是真正例”;召回率回答“真实正例的样本里,有多少被找回来了”。二者往往此消彼长。F1 分数是它们的调和平均,用一个数字综合两者,公式为 2×(P×R)/(P+R)。只优化精确率而忽略召回率,F1 会被拉低;反之亦然。
从那天起,老林不再只看“分对了多少本”,而是同时盯着精确率和召回率,F1 成了他与馆长月度对话的核心数字。有了这套评估体系,老林的分类方法越来越稳。现在,他只需把整套流程固定成标准作业,应用到每天的工作台上。
- 真正例预测为正且实际也为正的数量,比如老林标对的那 40 本物理书。
- 假正例预测为正但实际为负的数量,比如被误标为物理书的那 10 本。
- 精确率在标为物理书的样本里,真正是物理书的占比,衡量“分得准不准”。
- 假反例预测为负但实际为正的数量,比如被错分到别的书架的那 20 本物理书。
- 召回率在真实物理书里,被正确找回来的占比,衡量“找得全不全”。
- F1 调和平均让精确率和召回率互相制约,任何一边太低都会明显拉低 F1。
实战应用
经过长期摸索,老林把“预处理→打特色分→按经验判断→复盘”这套完整流程,写成了一份《图书分类标准作业手册》。每天新书入库,他就照着手册一步步操作,从选菜、备菜到出锅,一气呵成。
在真实工程中,一套完整的文本分类任务也是同样的流水线:收集带标签的语料 → 文本预处理 → 用 BoW 或 TF-IDF 提取特征向量 → 用朴素贝叶斯(或其他分类器)训练模型 → 在测试集上评估指标 → 部署到线上服务。所有环节在 Python 生态里都有现成工具。
最常见的落地场景有三个:一是垃圾邮件过滤,把邮件正文做成 TF-IDF 特征,用朴素贝叶斯判断“垃圾/正常”,速度快、内存小,适合手机端实时拦截;二是电商评论情感分析,将用户评论转成特征向量,判断“好评/差评”,帮商家快速发现口碑问题;三是新闻自动分类,平台每天接入数万篇稿件,先自动归到“体育、财经、科技”等栏目,再由编辑精审。需要提醒的是,BoW 和 TF-IDF 都忽略词序,面对“这家店不好吃,但是便宜”这类转折句会力不从心,那时需要引入 n-gram 或更深的模型。整个流水线的最终决策,可以浓缩成一个公式:
老林的“标准作业手册”,现在也成了你手里的实战地图。从一本本书的“拆词备菜”,到打上 TF-IDF 特色分,再到朴素贝叶斯的经验判断,最后用评估指标复盘优化——你已经完整掌握了 BoW 与 TF-IDF 文本分类的全部核心环节,可以放开手脚,去搭建你自己的“图书分类工作台”了。
- 预测类别模型最终给文档打上的类别标签,是分类流程的输出结果。
- 求最大在候选类别集合中,找出让概率乘积最大的那个类别。
- 候选类别集所有可能类别的集合,例如 {物理,美食,武侠} 或 {垃圾邮件,正常邮件}。
- 决策分数先验概率乘以各词条件概率的连乘,分数最高的类别即最终答案。
AI 应用场景
垃圾短信实时拦截
阶段:特征工程 + 模型训练
解决的问题:传统关键词黑名单需要人工持续维护,还经常误伤正常短信。AI 用 TF-IDF + 朴素贝叶斯自动统计垃圾短信的高频特色词(如“点击、领取、转账、红包”),在手机端毫秒级完成判断。
具体案例:手机系统收到一条“恭喜您获得大礼包,请点击链接领取”,安全组件先分词,再转成 TF-IDF 特征,朴素贝叶斯实时给出“垃圾短信”概率,并在通知栏静默拦截。老林当年凭直觉辨认书的内容,如今算法凭概率辨认短信的真伪。
电商评论情感分析
阶段:文本预处理 + 分类模型
解决的问题:人工浏览海量用户评论费时费力且标准不一。AI 把每条评论转成 BoW/TF-IDF 向量,快速判定好评或差评,帮助商家集中精力处理中差评。
具体案例:某电商平台每天产生 20 万条评论,“物流很快、包装完好”被自动归入好评;“客服态度差、退货麻烦”被归入差评。运营团队再用差评词云定位服务短板,把退货率在一个季度内降低了 12%。
新闻稿件自动归类
阶段:数据准备 + 训练与评估
解决的问题:新闻门户每天收到数千篇投稿,人工分类滞后且成本高。AI 先做预分类,编辑只需审核微调,大幅缩短稿件上线时间。
具体案例:某资讯 App 接入 BoW + 朴素贝叶斯管线,把“体育、财经、娱乐”三分类的准确率做到 90% 以上,编辑人工标注工作量下降 60%。这正是老林“图书分类工作台”在新闻行业的翻版。
Python 演示
import jiebafrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import accuracy_score # 1. 构造小型新闻语料 (0=宠物猫, 1=宠物狗, 2=数码产品)docs = [ "猫爱吃鱼,猫喜欢睡觉,小鱼很新鲜", "小猫很可爱,猫咪爱干净,猫粮很香", "狗爱啃骨头,小狗喜欢奔跑,骨头很硬", "狗狗很忠诚,狗喜欢出门,狗粮很香", "苹果发布新手机,手机功能强大,屏幕很好", "手机价格便宜,手机续航好,苹果系统流畅",]labels = [0, 0, 1, 1, 2, 2] # 2. 中文分词: jieba 切词后用空格连接def cut(text): return " ".join(jieba.lcut(text)) seg_docs = [cut(d) for d in docs] # 3. 词袋模型: 统计词频, 得到高维稀疏特征矩阵bow_vec = CountVectorizer(token_pattern=r"(?u)\w+")X_bow = bow_vec.fit_transform(seg_docs)print("BoW 特征维度:", X_bow.shape[1]) # 4. TF-IDF 加权: 给常见词降权, 给特色词提权idf_vec = TfidfVectorizer(token_pattern=r"(?u)\w+")X_idf = idf_vec.fit_transform(seg_docs) # 5. 训练两个朴素贝叶斯分类器clf_bow = MultinomialNB()clf_bow.fit(X_bow, labels)print("BoW 训练集准确率:", accuracy_score(labels, clf_bow.predict(X_bow))) clf_idf = MultinomialNB()clf_idf.fit(X_idf, labels)print("TF-IDF 训练集准确率:", accuracy_score(labels, clf_idf.predict(X_idf))) # 6. 预测新文档new_texts = ["小猫咪在吃鱼", "新手机屏幕很大", "小狗在啃骨头"]new_seg = [cut(t) for t in new_texts]new_bow = bow_vec.transform(new_seg)new_idf = idf_vec.transform(new_seg)pred_bow = clf_bow.predict(new_bow)pred_idf = clf_idf.predict(new_idf) names = ["宠物猫", "宠物狗", "数码产品"]for txt, p1, p2 in zip(new_texts, pred_bow, pred_idf): print(f"{txt} => BoW:{names[p1]} | TF-IDF:{names[p2]}")
seg_docs = [cut(d) for d in docs]把每篇中文文档分词并用空格连接,让 sklearn 的向量器能按空格切分特征。bow_vec = CountVectorizer(token_pattern=r"(?u)\w+")构建词袋向量器,\w+让单个中文字也能保留为特征。X_bow = bow_vec.fit_transform(seg_docs)把分词后的文档一次性转成稀疏词频矩阵,行是文档、列是词。idf_vec = TfidfVectorizer(token_pattern=r"(?u)\w+")构建 TF-IDF 向量器,自动完成“特色打分”。X_idf = idf_vec.fit_transform(seg_docs)生成 TF-IDF 加权后的稀疏矩阵,常见词权重被压低。clf_bow = MultinomialNB()创建朴素贝叶斯分类器,这是“有经验的分类老师”。clf_bow.fit(X_bow, labels)用词袋特征和标签训练模型,模型记住了“哪类文档更像哪类词”。new_bow = bow_vec.transform(new_seg)用训练好的词表变换新文本,保证特征维度与训练时一致。pred_bow = clf_bow.predict(new_bow)对新文本输出预测类别,这就是最终的分类结果。
常见误区
误区初学者以为词袋模型就是把文本中的词按出现顺序装进一个序列,像排队一样。
正解词袋模型“袋”字的关键在于倒进口袋后顺序全部打乱,模型只关心每个词出现了几次,完全不关心它在句子哪里出现、前后是什么词。就像老林数食材时,只看筐里有 3 个鸡蛋、2 个西红柿,根本不关心鸡蛋是被西红柿压着还是摆在上面。
为何常见:因为“袋”字容易让人联想到装东西的容器,而日常生活中往口袋里装东西不会打乱顺序,再加上“模型”这个词自带距离感,就容易望文生义。
误区TF-IDF 分数高,就代表这个词在语义上一定很重要。
正解TF-IDF 衡量的是“区分度”,而不是“语义重要性”。一个词只在某篇文档里出现、在其他文档都没有,它的 IDF 就高,但这可能是因为它是拼写错误或无意义的专名。就像老林发现某本书里有一个错别字,全图书馆只有这本书有,这个错别字的 TF-IDF 极高,但它毫无意义。
为何常见:分数高天然让人联想到“重要”,而 TF-IDF 又常被包装成“关键词提取”工具,容易造成混淆。
误区认为朴素贝叶斯的假设太简化,效果肯定不如复杂模型。
正解“朴素”仅指假设特征之间相互独立。文本特征确实有依赖,“猫”和“鱼”常共现,但贝叶斯定理用连乘方式在实际文本任务中表现很好,训练极快、所需数据量小,特别适合垃圾邮件过滤这类高维稀疏场景。它就像老林靠着“看到量子=物理书”的几条粗经验也能快速分类,不是百分之百准,但胜在快和稳。
为何常见:中文“朴素”带有“简单朴素”的暗示,加上数学推导多,新手容易低估其工程价值。
误区只要是停用词,去掉越多越好。
正解停用词列表要根据任务判断。对“的、了、在”这类词,去掉能降噪减维;但在情感分析里,“太差、太好”中的“太”携带强烈情绪;在短文本中,“不要、但是”等词恰恰是分类关键。正确做法是做消融实验:保留 vs 去除停用词,看验证集指标再决定。
为何常见:几乎所有教程都强调“去停用词”这一步,初学者容易把它当成无条件的金科玉律。
误区用了 TF-IDF 就不用再关心词序和语义了。
正解TF-IDF 本质仍是词袋家族成员,它把“猫咬狗”和“狗咬猫”表示成几乎相同的向量,因为词序信息已经丢失。要理解语义关系,需要 n-gram、word2vec 乃至 BERT 等表示学习方法。TF-IDF 真正擅长的是“快速、可解释、小样本”的工程场景,而不是理解语言。
为何常见:教程往往从 BoW 到 TF-IDF 一路升级,容易让读者以为这一级就是“终点”。
面试题
Q1. BoW 词袋模型的核心特点是什么?
- A.只统计词出现次数忽略顺序← 正确答案
- B.按词语出现顺序记录文本
- C.用词向量表示上下文语义
- D.只保留语料中出现的高频词
答案:A。BoW 的关键是“袋”字,顺序完全打乱,只保留每个词的计数。B 说反了,C 是词向量模型的思路,D 误解了 BoW——它会保留词汇表中每个词并统计次数,而不是只留高频词。
Q2. 以下哪项属于文本预处理中的“去停用词”?
- A.删除的、了、在等词← 正确答案
- B.running 还原为 run
- C.按空格切分句子
- D.统计词的次数
答案:A。A 是去停用词——删除高频无区分度的功能词。B 是词形还原,C 是分词,D 是词频统计,它们都是预处理或特征提取的其他环节。
Q3. TF-IDF 中的 N 代表什么?
- A.语料库文档总数← 正确答案
- B.词汇表词语总数
- C.文档平均词数
- D.所有类别数量
答案:A。N 是语料库的文档总数,出现在 IDF 的分子上,表示“总文档数除以包含该词的文档数”。B 是词汇表大小 |V|,C 和 D 都与 N 无关。
Q4. 对于“的、了、在”这类几乎每篇文档都出现的词,其 IDF 值通常如何?
- A.非常大
- B.非常小← 正确答案
- C.等于零
- D.等于一
答案:B。这类词的文档频率 DF 接近文档总数 N,log(N/(1+DF)) 接近 log(1)=0,所以 IDF 非常小。这与老林“钉子户词没有区分度”的直觉完全一致。
Q5. 朴素贝叶斯分类器在训练和推理过程中需要用到哪些概率?
- A.先验概率 P(c)← 正确答案
- B.类条件概率 P(w|c)← 正确答案
- C.后验概率 P(c|x)← 正确答案
- D.转移概率 P(w_i|w_j)
答案:ABC。训练时统计先验 P(c) 和类条件 P(w|c),推理时计算后验 P(c|x),三者构成朴素贝叶斯的完整链路。D 是马尔可夫模型中的转移概率,与朴素贝叶斯无关。
Q6. 拉普拉斯平滑的主要作用是什么?
- A.加快模型训练速度
- B.防止条件概率为零← 正确答案
- C.提高特征向量维度
- D.减少训练样本噪声
答案:B。当某个词在训练集的某类中从未出现时,P(w|c)=0 会让连乘整体归零。平滑在分子分母各加一个常数,保证概率恒大于 0。A、C、D 都不是平滑的目的。
Q7. 语料库共有 1000 篇文档,词 t 仅在 2 篇文档中出现,则 IDF(t) 约为多少?
- A.log(1000/100)
- B.log(1000/2)
- C.log(1000/3)← 正确答案
- D.log(100/2)
答案:C。按 IDF = log(N/(1+DF)) 代入,N=1000、DF=2,得到 log(1000/3)。B 漏了分母的 +1,A 用了错误的文档数,D 连文档总数都写错了。
Q8. 以下哪些是分类模型常用的评估指标?
- A.准确率 Accuracy← 正确答案
- B.精确率 Precision← 正确答案
- C.召回率 Recall← 正确答案
- D.逆文档频率 IDF
答案:ABC。准确率、精确率、召回率都是分类模型的经典评估指标,F1 是它们的综合。D 的 IDF 是特征加权方法,属于特征工程环节,不是评估指标。
Q9. 关于精确率与召回率的关系,下列说法正确的是?
- A.二者总是同升同降
- B.二者往往此消彼长← 正确答案
- C.二者含义完全相同
- D.二者与模型无关
答案:B。精确率关注“分得准”,召回率关注“找得全”,这两个目标常常互相牵制——提高判定阈值会让模型更保守,精确率上升但召回率下降。F1 通过调和平均来平衡这对矛盾。
Q10. 关于 BoW 模型的局限,下列说法正确的是?
- A.忽略词序关系← 正确答案
- B.向量高维且稀疏← 正确答案
- C.无法表达语义← 正确答案
- D.不能统计词频
答案:ABC。BoW 丢词序、向量高维稀疏、无法理解语义,是它的三大经典局限。D 说反了,统计词频恰恰是 BoW 最核心的能力,它的“食材清单”就是靠词频计数得到的。