【TF-IDF|1】深入解析TF-IDF算法—基础介绍

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本挖掘和信息检索的加权技术,用来评估一个词语对于一个文档集或一个语料库的重要程度。下面我们将从理论到实践,逐步解析TF-IDF算法,并编写一个简单的实现教程。

一、理论解析

1.1 术语频率(Term Frequency,TF)

术语频率表示某个词语在文档中出现的频率。其公式为:

[ \text{TF}(t, d) = \frac{f(t, d)}{ \sum_{t’ \in d} f(t’, d)} ]

其中:

  • ( t ) 是词语;
  • ( d ) 是文档;
  • ( f(t, d) ) 是词语 ( t ) 在文档 ( d ) 中出现的次数。
1.2 逆文档频率(Inverse Document Frequency,IDF)

逆文档频率衡量词语在整个文档集中的普遍性。其公式为:

[ \text{IDF}(t, D) = \log \left( \frac{N}{|{d \in D : t \in d}|} \right) ]

其中:

  • ( N ) 是文档集中总的文档数;
  • ( |{d \in D : t \in d}| ) 是包含词语 ( t ) 的文档数。
1.3 TF-IDF

TF-IDF 是 TF 和 IDF 的乘积,用于衡量词语 ( t ) 在文档 ( d ) 中的重要性。

[ \text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D) ]

二、实践教程

2.1 准备数据

我们将用一个简单的例子来计算TF-IDF。假设我们有如下三个文档:

d1: "The cat sat on the mat"
d2: "The cat sat"
d3: "The dog sat on the log"
2.2 编写代码

我们使用Python来实现TF-IDF算法。首先,我们计算TF。

import math
from collections import Counter# 文档
documents = ["The cat sat on the mat","The cat sat","The dog sat on the log"
]# 预处理文档(分词)
def tokenize(document):return document.lower().split()tokenized_documents = [tokenize(doc) for doc in documents]# 计算词频(TF)
def compute_tf(document):tf = Counter(document)total_terms = len(document)for term in tf:tf[term] /= total_termsreturn tftf_list = [compute_tf(doc) for doc in tokenized_documents]# 输出TF
for i, tf in enumerate(tf_list):print(f"Document {i+1} TF: {tf}")

接着,我们计算IDF。

# 计算逆文档频率(IDF)
def compute_idf(documents):idf = {}N = len(documents)all_terms = set(term for doc in documents for term in doc)for term in all_terms:containing_docs = sum(1 for doc in documents if term in doc)idf[term] = math.log(N / (containing_docs))return idfidf = compute_idf(tokenized_documents)# 输出IDF
print(f"IDF: {idf}")

最后,我们计算TF-IDF。

# 计算TF-IDF
def compute_tfidf(tf, idf):tfidf = {}for term, tf_val in tf.items():tfidf[term] = tf_val * idf.get(term, 0)return tfidftfidf_list = [compute_tfidf(tf, idf) for tf in tf_list]# 输出TF-IDF
for i, tfidf in enumerate(tfidf_list):print(f"Document {i+1} TF-IDF: {tfidf}")

三、总结

通过上述步骤,我们实现了TF-IDF算法的基础版本。这种算法在文本挖掘和信息检索中广泛应用,用于评估词语的重要性,从而更好地进行文本分析和搜索引擎优化。

四、进一步优化

我们已经实现了基础的TF-IDF算法。接下来,我们可以进行一些优化和扩展:

4.1 处理停用词

停用词(Stop Words)是一些在文本中频繁出现但对文本主题无实际贡献的词语,如“the”、“is”等。我们可以使用停用词表来过滤掉这些词。

# 定义停用词
stop_words = set(["the", "on"])# 预处理文档(分词并过滤停用词)
def tokenize(document):return [word for word in document.lower().split() if word not in stop_words]tokenized_documents = [tokenize(doc) for doc in documents]
4.2 使用TF-IDF计算库

在实际应用中,可以使用现成的库来计算TF-IDF,如scikit-learn。它提供了高效的实现,并且更容易处理大规模数据。

from sklearn.feature_extraction.text import TfidfVectorizer# 创建TF-IDF向量器
vectorizer = TfidfVectorizer(stop_words="english")# 计算TF-IDF矩阵
tfidf_matrix = vectorizer.fit_transform(documents)# 输出TF-IDF矩阵
print(tfidf_matrix.toarray())# 输出特征名称
print(vectorizer.get_feature_names_out())
4.3 示例项目:文本相似度计算

我们可以利用TF-IDF来计算文档之间的相似度。例如,使用余弦相似度来衡量两个文档之间的相似度。

from sklearn.metrics.pairwise import cosine_similarity# 计算文档之间的余弦相似度
cosine_similarities = cosine_similarity(tfidf_matrix)# 输出相似度矩阵
print(cosine_similarities)

五、完整代码示例

下面是完整的代码示例,包含所有优化和扩展:

import math
from collections import Counter
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity# 文档
documents = ["The cat sat on the mat","The cat sat","The dog sat on the log"
]# 定义停用词
stop_words = set(["the", "on"])# 预处理文档(分词并过滤停用词)
def tokenize(document):return [word for word in document.lower().split() if word not in stop_words]tokenized_documents = [tokenize(doc) for doc in documents]# 计算词频(TF)
def compute_tf(document):tf = Counter(document)total_terms = len(document)for term in tf:tf[term] /= total_termsreturn tftf_list = [compute_tf(doc) for doc in tokenized_documents]# 计算逆文档频率(IDF)
def compute_idf(documents):idf = {}N = len(documents)all_terms = set(term for doc in documents for term in doc)for term in all_terms:containing_docs = sum(1 for doc in documents if term in doc)idf[term] = math.log(N / (containing_docs))return idfidf = compute_idf(tokenized_documents)# 计算TF-IDF
def compute_tfidf(tf, idf):tfidf = {}for term, tf_val in tf.items():tfidf[term] = tf_val * idf.get(term, 0)return tfidftfidf_list = [compute_tfidf(tf, idf) for tf in tf_list]# 输出TF-IDF
for i, tfidf in enumerate(tfidf_list):print(f"Document {i+1} TF-IDF: {tfidf}")# 使用sklearn计算TF-IDF
vectorizer = TfidfVectorizer(stop_words="english")
tfidf_matrix = vectorizer.fit_transform(documents)# 输出TF-IDF矩阵
print(tfidf_matrix.toarray())# 输出特征名称
print(vectorizer.get_feature_names_out())# 计算文档之间的余弦相似度
cosine_similarities = cosine_similarity(tfidf_matrix)# 输出相似度矩阵
print(cosine_similarities)

六、总结

通过上述优化和扩展,我们不仅实现了基础的TF-IDF算法,还通过使用现成的库(如scikit-learn)提升了计算效率,并扩展了应用场景(如文档相似度计算)。TF-IDF作为一种经典的文本处理技术,广泛应用于信息检索、文本分类和自然语言处理等领域。了解其原理并掌握其实现,对于深入理解和应用文本挖掘技术非常有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型,供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

const与static区别

const与static的主要区别在于它们修饰的对象的行为和属性。 const 用于声明一个值不能被修改的常量。它主要用于定义常量、修饰指针、函数的输入参数和返回值,以确保这些值在程序运行期间保持不变。const修饰的变量或对象具有不可变性,这有助于提高程序的…

算法练习(一)——数学公式,逻辑思维,DFS递归

算法练习 题目一题干解法代码解释 Tips 题目二题干解法代码解释 Tips 题目三题干解法代码解释 Tips 题目一 题干 给定一个数a,这个a是可以由一组m个连续的正整数相加得到的,求这个m的最小值。举例:a211234561011,会发现10和11是…

VD1011 单节锂离子充电电池保护 2.8V过放保护 SOT-23小封装芯片

VD1011,内置高精度电压检测电路和延迟电路以及内置MOSFET,是用于单节锂离子/锂聚合物可再充电 电池的保护IC。 本IC适合干对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护。 VD1011具备如下特点 高精度电压检测电路 过充电检测电压 …

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力…

类加载的验证阶段你不知道的东西

一、验证是链接阶段(验证,准备,解析)的第一步,是验证.class文件中的二进制字节流被转换成的Java虚拟机里的Class对象是否合法的步骤。主要作用就是确保被加载的类的正确性、安全性及符合Java虚拟机规范,确保…

nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播

netcat(nc): 作用:一个功能强大的网络工具,提供了简单的网络测试和网络编程功能。工作原理:可以用于建立TCP或UDP连接,并发送和接收数据。示例用法: 监听TCP端口:nc -l 1…

OO U4 博客

文章目录 正向建模与开发单元架构设计与追踪关系单元架构设计追踪关系 架构设计思维进化测试思维演进课程收获 正向建模与开发 在本单元中,我学习了UML这一建模工具。UML具备相当多种类的图,通过先设计UML图再进行开发,能够避免架构的重大调…

django学习入门系列之第二点《浏览器能识别的标签4》

文章目录 input类型下拉框多行文本往期回顾 input类型 1&#xff1a;打出后可以在里面编写内容 <!-- 自闭合标签 --> <!-- 默认行内标签 --> <input type"text">placeholder 显示背景 <input type"text" id"txtUser" p…

如何在Spring Boot中实现图片上传至本地和阿里云OSS

在开发Web应用时&#xff0c;处理文件上传是常见的需求之一&#xff0c;尤其是在涉及到图片、视频等多媒体数据时。本文将详细介绍如何使用Spring Boot实现图片上传至本地服务器以及阿里云OSS存储服务&#xff0c;并提供完整的代码示例。 一、上传图片至本地 首先&#xff0c…

逻辑这回事(五)---- 资源优化

基础篇 Memory 避免细碎的RAM。将大的RAM拆分成多个小RAM&#xff0c;并根据地址关断可以优化功耗&#xff0c;但把多个小RAM合成大RAM可以优化面积。Block RAM和分布式RAM合理选择。根据存储容量&#xff0c;对Block RAM和分布式RAM的实现面积和功耗进行评估&#xff0c;选择…

文章MSM_metagenomics(三):Alpha多样性分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程使用基于R的函数来估计微生物群落的香农指数和丰富度&#xff0c;使用MetaPhlAn prof…

签约喜报 | Smartbi朋友圈又添新朋友啦~

近期&#xff0c;一系列业界翘楚如国际精密集团、惠达卫浴、华天科技、中国人寿等新老朋友纷纷携手Smartbi&#xff0c;共同探索数据驱动业务的新路径、新思路。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#x…

视频转换器在线哪个好?让视频播放不受格式限制

在日常的视频观看中&#xff0c;我们可能会遇到视频格式与设备不兼容的问题&#xff0c;导致无法顺畅播放。这就像是缺少了播放的钥匙&#xff0c;让人无法享受视频内容。 面对视频格式不兼容的挑战&#xff0c;选择合适的转换工具至关重要。但不用担心&#xff0c;本文将分享…

通义千问2(Qwen2)大语言模型在PAI-QuickStart的微调、评测与部署实践

Qwen2&#xff08;通义千问2&#xff09;是阿里云最近推出的开源大型语言模型系列&#xff0c;相比2月推出的Qwen1.5&#xff0c;Qwen2实现了整体性能的代际飞跃&#xff0c;大幅提升了代码、数学、推理、指令遵循、多语言理解等能力。其中&#xff0c;Qwen2系列包含5个尺寸的预…

LeetCode:2779. 数组的最大美丽值(滑动窗口 Java)

目录 2779. 数组的最大美丽值 题目描述&#xff1a; 实现代码与解析&#xff1a; 滑动窗口 原理思路&#xff1a; 2779. 数组的最大美丽值 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。 在一步操作中&#xff0c;你可以执行下述指令…

使用 Python 进行测试(2)前进到pytest

总结 pytest一个宝藏框架&#xff0c;减少了我们对测试蔬菜的抗拒&#xff0c;并让测试更有效率。 将上一节的使用unittest编写的测试使用pytest重写&#xff1a; import pytest from the_code_to_test import addpytest.fixture() def setup_and_tear_down():print(This is …

IDEA启动正常debug启动报错

项目场景&#xff1a; 很奇怪的一个问题,项目运行正常,debug启动直接报错,运行不起来 Exception in thread "main" java.lang.ClassNotFoundException: kotlinx.coroutines.debug.AgentPremainat java.net.URLClassLoader.findClass(URLClassLoader.java:382)at ja…

好像也没那么失望!SD3玩起来,Stable Diffusion 3工作流商业及广告设计(附安装包)

今天基于SD3 base 工作流来尝试进行下广告设计&#xff0c;这要是一配上设计文案&#xff0c;视觉感就出来了。下面来看看一些效果展示~ SD3 Medium模型及ComfyUI工作流下载地址&#xff1a;文末领取&#xff01; 1.清凉夏日——西瓜音乐会 提示词&#xff1a; a guitar wi…

协程库——测试、优化

Ubuntu: 2核4G 1 单线程 1.1 原生epoll ab -n 200000 -c 1000 http://192.168.253.138:12345/ Server Software: Server Hostname: 192.168.253.138 Server Port: 12345 Document Path: / Document Length: 496 bytes Concurrenc…