软件测试一篇通

核心内容摘要

情感化字体设计:Plus Jakarta Sans如何塑造数字产品的用户体验
硕士论文AI检测标准是什么?各高校AIGC疑似度要求汇总

CPU缓存实战指南:L1 D-cache与L1 I-cache的区别及其对性能的实际影响

​ 在上一节中我们介绍了 TF-IDF 的基本原理它通过结合词频TF和逆文档频率IDF来衡量每个词在文档中的重要性。

理解了原理之后我们可以用 Python 将文本转换为 TF-IDF 向量从而实现关键词提取、文本相似度计算等实际应用。

TF-IDF 应用场景概览​ TF-IDF 的典型应用包括关键词提取从文档中提取最能代表内容的高权重词。

文本相似度计算用向量表示文档计算余弦相似度衡量文档之间的内容相似性。

搜索与推荐搜索引擎通过 TF-IDF 评估文档与查询关键词的匹配程度。

通过这些应用TF-IDF 可以帮助我们把文本“量化”用于分析、搜索和推荐系统。

动手玩转 TF-IDF从文本到向量​ 在理论理解之后我们可以用 Python 直接将文本转换为 TF-IDF 向量方便进行关键词提取和文本相似度计算。

1 示例代码​ 假设有两句英文sentence_1This is a good job.I will not miss it for anythingsentence_2This is not good at all​ 我们希望使用TfidfVectorizer将它们转换为 TF-IDF 特征向量fromsklearn.feature_extraction.textimportCountVectorizer,TfidfVectorizer# define tf-idftf_idf_vecTfidfVectorizer(use_idfTrue,# 使用逆文档频率smooth_idfTrue,# 平滑 IDF防止除零或负值ngram_range(1,

,# 只使用单个词 (Unigram)stop_wordsenglish# 去掉英文停用词)# to use only bigrams ngram_range(2,

参数解释use_idfTrue使用逆文档频率smooth_idf是否平滑处理smooth_idfTrue使用平滑 IDF避免除零问题推荐smooth_idfFalse不使用平滑极少数情况下会导致 IDF 不稳定ngram_range(1,

只考虑单个词Unigramstop_wordsenglish去掉英文停用词如 “the”、“is”

2 步骤说明(

统一词汇表扫描整个语料库收集所有词去除停用词每个词对应向量中的一列索引(

生成TF-IDF向量每篇文档的向量长度 词汇表大小文档未出现的词 → 对应列为 0因此无论文档长度或内容如何每篇向量维度都一致

3 拟合语料fit()​ 在将文本转换为 TF-IDF 向量之前需要先**“学习”语料库的词汇表**这一步由fit()完成。

核心作用扫描语料库中的所有文档构建固定的词汇表Vocabulary记录每个词在向量中的索引位置。

注意fit()只学习词表不返回向量。

可以通过get_feature_names_out()查看词表。

停用词如英文的 “the”, “is” 等会被自动过滤如果在TfidfVectorizer中指定stop_wordsenglish。

示例代码# 拟合语料tf_idf_vec.fit([sentence_1,sentence_2])# 查看词汇表print(Vocabulary:,tf_idf_vec.get_feature_names_out())输出Vocabulary: [good job miss]说明在两条示例句子中去掉英文停用词后语料库中出现的有效词是good、job和miss。

词汇表顺序对应向量列的索引也就是说向量的第一列对应good第二列对应job第三列对应miss。

这一步是后续 transform() 或 fit_transform() 的基础所有文档向量的维度都是固定的与词汇表大小一致。

如果语料库很大词汇表会非常长可能有几十万甚至上百万个词大部分文档向量元素仍然是 0 → 体现 TF-IDF 的稀疏性。

fit()不会计算每篇文档的 TF-IDF 值仅仅是生成固定的向量空间。

4 转换文本为向量transform()​ 在完成对语料库的拟合 (fit()) 后我们可以使用transform()方法将任意文本转换为TF-IDF 向量。

核心作用将文本映射到和训练语料一致的固定维度向量空间保证每篇文档向量长度与词汇表大小一致。

特点只使用已拟合的词表Vocabulary中的词。

文本中未出现的词对应列值为 0。

新文本中未在原语料中出现的词会被忽略TF-IDF 0不会改变向量维度。

(

示例代码# 使用已有向量器进行 transformtf_idf_sentencetf_idf_vec.transform([sentence_1,sentence_2])tf_idf_dataframepd.DataFrame(tf_idf_sentence.toarray(),columnstf_idf_vec.get_feature_names_out())print(ftransform for sentences:\n{tf_idf_dataframe})输出transformforsentences: good job miss

00.

4494360.

6316670.

63166711.

0000000.

0

000000可以看到第一条句子This is a good job. I will not miss it for anything对应向量中good、job、miss的 TF-IDF 值都有非零值。

第二条句子This is not good at all中只包含good→ 其他列为 0。

(

对新句子进行转换​ 对于未在训练语料中出现的新句子transform()同样适用new_sentence[This job is good but not perfect]tf_idf_new_sentencetf_idf_vec.transform(new_sentence)tf_idf_dataframepd.DataFrame(tf_idf_new_sentence.toarray(),columnstf_idf_vec.get_feature_names_out())print(ftransform for sentences:\n{tf_idf_dataframe})transformforsentences: good job miss

00.

5797390.

8

0说明good和job出现在训练语料中 → 有对应的 TF-IDF 值。

perfect未在训练语料中出现 → 被忽略TF-IDF 0。

保证了向量维度与训练语料一致便于后续相似度计算或模型输入。

总结transform()的核心是将任意文本映射到固定的向量空间保证新文本和训练语料的特征维度一致同时保持 TF-IDF 的稀疏性特点。

TF-IDF 计算示例从公式到数值结果​ 为了更直观地理解 TF-IDF 的计算过程我们用一个简单的中文语料库作为示例机器学习是人工智能的分支深度学习是机器学习的分支自然语言处理需要机器学习​ 我们希望计算词语机器学习在文档1中的 TF-IDF 值。

1 计算词频TF首先计算词“机器学习”在文档1中的词频Term Frequency, TF“机器学习” 在文档1中出现1 次文档1的总词数为6因此TF机器学习16 \mathcal{TF}_{\text{机器学习}} \frac{1}{6}TF机器学习​61​​ 这一步反映的是这个词在当前文档中的重要程度。

2 计算逆文档频率IDF​ 接下来计算逆文档频率Inverse Document Frequency, IDF衡量这个词在整个语料库中的稀有程度。

语料库文档总数N3N3N3“机器学习” 出现在3 篇文档中即DF3DF 3DF3使用平滑版本 IDF 公式IDF机器学习log⁡1N1DF1log⁡131311 \mathcal{IDF}_{\text{机器学习}} \log \frac{1\text{N}}{1 \text{DF}} 1 \log \frac{13}{13}11IDF机器学习​log1DF1N​1log1313​11​ 因为“机器学习”出现在所有文档中它并不是区分文档的关键词所以 IDF 权重最低1。

3 计算TF-IDF​ 最后将 TF 和 IDF 相乘TF−IDF机器学习TF机器学习×IDF机器学习16×116 \mathcal{TF-IDF}_{\text{机器学习}} \mathcal{TF}_{\text{机器学习}} \times \mathcal{IDF}_{\text{机器学习}} \frac{1}{6} \times 1 \frac{1}{6}TF−IDF机器学习​TF机器学习​×IDF机器学习​61​×161​

4 直观理解TF词在当前文档中出现得多不多IDF这个词是不是“通用词”能否区分文档TF-IDF既在当前文档中重要又能区分文档的词权重最高​ 在这个例子中“机器学习”虽然在文档1中出现但它在所有文档中都出现因此区分度不高最终权重也不高。

​ 假设 “人工智能” 只出现在文档1那么它的DF1DF1DF1IDF 会更大因此 TF-IDF 权重会更高。

应用场景​ TF-IDF 是经典文本表示方法在信息检索、文本挖掘和 NLP 工程实践中被广泛使用。

下面介绍两个最典型的应用场景。

1 关键词提取​ TF-IDF 的核心思想是在当前文档中频繁出现但在整个语料库中较少出现的词更可能是关键词。

​ 因此可以通过 TF-IDF 权重排序来提取文档关键词。

(

示例语料​ 假设我们的语料库如下其中每个元素是一篇文档。

corpus[this is a good book,this book is great,good book recommend,I really love this great book]​ 每个字符串代表一篇文档语料库中包含 4 篇文档。

(

计算TF-IDF​fit_transform()会完成两步操作构建词表Vocabulary计算每个文档的 TF-IDF 向量表示fromsklearn.feature_extraction.textimportTfidfVectorizer vectorizerTfidfVectorizer()Xvectorizer.fit_transform(corpus)(

定义关键词提取函数​ 该函数对每篇文档按 TF-IDF 权重排序选取权重最高的top_n个词作为关键词importnumpyasnpdefextract_keywords(tfidf_matrix,feature_names,top_n

:keywords[]foriinrange(tfidf_matrix.shape[0]):# 取出第 i 篇文档的 TF-IDF 向量rownp.squeeze(tfidf_matrix[i].toarray())# 按 TF-IDF 值排序取前 top_n 个top_indicesrow.argsort()[-top_n:][::-1]# 提取对应的关键词keywords.append([feature_names[j]forjintop_indices])returnkeywords(

查看结果keywordsextract_keywords(X,vectorizer.get_feature_names_out())fori,kwinenumerate(keywords):print(f文档{i1}的关键词{kw})运行结果文档1的关键词[good,is,this]文档2的关键词[great,is,this]文档3的关键词[recommend,good,book]文档4的关键词[love,really,great]结果分析recommend、love等稀有词被识别为关键词高频通用词this, is仍然可能被选中因此实际工程中通常需要去除停用词stopwordsTF-IDF 是自动摘要、搜索关键词高亮、内容推荐的基础技术

2 文本相似度计算Document Similarity使用TF-IDF向量计算余弦相似度​ TF-IDF 向量可以看作是文档在高维空间中的坐标因此可以使用向量相似度衡量文档语义相似性。

(

基本思想每篇文档 → 一个 TF-IDF 向量在向量空间中计算文档之间的距离或夹角距离越近 / 角度越小 → 文档越相似(

余弦相似度Cosine Similarity​ 在文本领域最常用的是余弦相似度它衡量两个向量之间的夹角similarity(di,dj)cos⁡(θij)vi⋅vj∥vi∥∥vj∥ \text{similarity}(d_i,d_j) \cos(\theta_{ij}) \frac{\mathbf{v}_i\cdot \mathbf{v}_j}{\|\mathbf{v}_i\| \|\mathbf{v}_j\|}similarity(di​,dj​)cos(θij​)∥vi​∥∥vj​∥vi​⋅vj​​​ 其中vi\mathbf{v}_ivi​文档did_idi​的 TF-IDF 向量vi⋅vj\mathbf{v}_i \cdot \mathbf{v}_jvi​⋅vj​两个文档共享词汇的加权重叠∥vi∥\|\mathbf{v}_i\|∥vi​∥向量长度用于归一化为什么使用余弦相似度文档长度不同会影响欧几里得距离但长度不会影响主题方向余弦相似度只关注词分布方向更适合文本语义比较取值范围[0,1][0,1][0,1]越接近 1 表示两篇文档越相似越接近 0 表示越不相似。

当两个文档共享更多高权重TF-IDF 值高的词时它们的余弦相似度会更接近 1。

(

代码示例fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.metrics.pairwiseimportcosine_similarity corpus[this is a good book,this book is great,good book recommend,I really love this great book]vectorizerTfidfVectorizer()Xvectorizer.fit_transform(corpus)similaritiescosine_similarity(X[0:1],X[1:])fori,scoreinenumerate(similarities[0],start

:print(f文档 1 与文档{i}的相似度{score:.3f})这里使用cosine_similarity()函数计算余弦相似度。

fromsklearn.metrics.pairwiseimportcosine_similarity similaritiescosine_similarity(X[0:1],X[1:])cosine_similarity(A, B)计算矩阵A与B中各行向量之间的余弦相似度。

范围为[0, 1]越接近 1 表示文本语义越相似。

输出文档1与文档2的相似度

677 文档1与文档3的相似度

468 文档1与文档4的相似度

270结果分析文档 1 与 文档 2 最相似因为共享大量词this, book, is文档 3 次之部分关键词重叠文档 4 语义差异较大因此相似度最低

3 工业应用

总结应用领域TF-IDF 作用搜索引擎文档相关性排序推荐系统内容相似度计算文本聚类向量化输入关键词提取自动摘要传统机器学习特征工程

总结​ TF-IDF 是传统 NLP 的工业基石。

即使在大模型盛行的今天它依然是计算成本最低、可解释性最强、工程实践中最稳定可靠的文本表示方法之一。

9.1.gb.crm直接看-9.1.gb.crm直接看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123