tf-idf算法

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的统计方法,用来评估一个词语对于一个文档集或一个语料库的重要程度。TF-IDF的基本思想是:如果一个词语在某个文档中出现的次数多,并且在其他文档中很少出现,那么该词语具有很好的区分能力,适合作为关键词。

### 一、算法概述

TF-IDF由两部分组成:词频(TF)和逆文档频率(IDF)。

1. **词频(TF)**:衡量一个词语在文档中出现的频率。
   - 公式:\[ TF(t, d) = \frac{f_{t,d}}{N_d} \]
   - 其中,\( f_{t,d} \) 是词语 \( t \) 在文档 \( d \) 中出现的次数,\( N_d \) 是文档 \( d \) 中词语的总数。

2. **逆文档频率(IDF)**:衡量一个词语在整个语料库中出现的频率。
   - 公式:\[ IDF(t, D) = \log \frac{N}{1 + n_t} \]
   - 其中,\( N \) 是语料库中文档的总数,\( n_t \) 是包含词语 \( t \) 的文档数量。

3. **TF-IDF**:词语 \( t \) 在文档 \( d \) 中的TF-IDF值。
   - 公式:\[ TF\text{-}IDF(t, d, D) = TF(t, d) \times IDF(t, D) \]

### 二、算法步骤

1. **计算词频(TF)**:
   对于每个文档,计算每个词语的词频。

2. **计算逆文档频率(IDF)**:
   对于每个词语,计算其在整个语料库中的逆文档频率。

3. **计算TF-IDF**:
   将词频和逆文档频率相乘,得到每个词语的TF-IDF值。

### 三、示例

假设我们有以下三个文档:

- 文档1:`"this is a sample"`
- 文档2:`"this is another example example"`
- 文档3:`"this example is different"`

#### 1. 计算词频(TF)

| 词语    | 文档1 (TF) | 文档2 (TF) | 文档3 (TF) |
|---------|------------|------------|------------|
| this    | 1/4        | 1/5        | 1/4        |
| is      | 1/4        | 1/5        | 1/4        |
| a       | 1/4        | 0          | 0          |
| sample  | 1/4        | 0          | 0          |
| another | 0          | 1/5        | 0          |
| example | 0          | 2/5        | 1/4        |
| different | 0        | 0          | 1/4        |

#### 2. 计算逆文档频率(IDF)

| 词语    | 出现的文档数 (nt) | IDF (log(3/(1 + nt))) |
|---------|-------------------|------------------------|
| this    | 3                 | log(3/4) = -0.125      |
| is      | 3                 | log(3/4) = -0.125      |
| a       | 1                 | log(3/2) = 0.405       |
| sample  | 1                 | log(3/2) = 0.405       |
| another | 1                 | log(3/2) = 0.405       |
| example | 2                 | log(3/3) = 0           |
| different | 1               | log(3/2) = 0.405       |

#### 3. 计算TF-IDF

| 词语    | 文档1 (TF-IDF)             | 文档2 (TF-IDF)             | 文档3 (TF-IDF)             |
|---------|----------------------------|----------------------------|----------------------------|
| this    | (1/4) * (-0.125) = -0.031  | (1/5) * (-0.125) = -0.025  | (1/4) * (-0.125) = -0.031  |
| is      | (1/4) * (-0.125) = -0.031  | (1/5) * (-0.125) = -0.025  | (1/4) * (-0.125) = -0.031  |
| a       | (1/4) * 0.405 = 0.101      | 0                          | 0                          |
| sample  | (1/4) * 0.405 = 0.101      | 0                          | 0                          |
| another | 0                          | (1/5) * 0.405 = 0.081      | 0                          |
| example | 0                          | (2/5) * 0 = 0              | (1/4) * 0 = 0              |
| different | 0                        | 0                          | (1/4) * 0.405 = 0.101      |

### 四、Python实现

以下是使用Python实现TF-IDF算法的代码示例:

```python
import math
from collections import Counter

# 文档集
documents = [
    "this is a sample",
    "this is another example example",
    "this example is different"
]

# 计算TF
def compute_tf(text):
    tf_text = Counter(text.split())
    for i in tf_text:
        tf_text[i] = tf_text[i]/float(len(text.split()))
    return tf_text

# 计算IDF
def compute_idf(word, corpus):
    return math.log(len(corpus)/(1 + sum([1 for doc in corpus if word in doc])))

# 计算TF-IDF
def compute_tfidf(corpus):
    documents_list = [doc.split() for doc in corpus]
    tfidf_docs = []
    for text in documents_list:
        tfidf = {}
        computed_tf = compute_tf(" ".join(text))
        for word in computed_tf:
            tfidf[word] = computed_tf[word] * compute_idf(word, corpus)
        tfidf_docs.append(tfidf)
    return tfidf_docs

# 计算并打印TF-IDF
tfidf_docs = compute_tfidf(documents)
for i, doc in enumerate(tfidf_docs):
    print(f"文档 {i+1} 的 TF-IDF 值:")
    for word in doc:
        print(f"{word}: {doc[word]}")
    print("\n")
```

### 五、应用场景

TF-IDF广泛应用于以下领域:

1. **信息检索**:评估文档与查询词语的相关性。
2. **文本分类**:用于特征提取,作为分类器的输入。
3. **关键词提取**:自动从文本中提取关键词。
4. **推荐系统**:分析用户评论或内容,提供个性化推荐。

通过TF-IDF算法,能够有效地识别出文本中的重要词语,从而在信息检索、文本分析和自然语言处理等领域发挥重要作用。

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

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

相关文章

settings和toolchains.xml 区别用法配置

在 IntelliJ IDEA 中配置 Maven 项目时,settings.xml 和 toolchains.xml 的使用场景有所不同。以下是具体的使用情景和配置方法: 1. 使用 settings.xml 使用场景 全局或用户级别的配置:包括设置本地仓库位置、远程仓库、代理服务器、认证信…

k8s+RabbitMQ单机部署

1 k8s 配置文件yaml: apiVersion: apps/v1 kind: Deployment metadata:name: rabbitmq-deploynamespace: rz-dt spec:replicas: 1selector:matchLabels:app: rabbitmqtemplate:metadata:labels:app: rabbitmqspec:containers:- name: rabbitmqimage: "rz-dt-image-server…

MySQL从入门到高级 --- 15.优化 16.pymysql

文章目录 第十五章 && 第十六章:15.优化15.1 查询SQL执行效率15.2 定位低效率执行SQL15.3 explain分析执行计划 - 基本使用15.4 explain分析执行计划 - id15.5 explain分析执行计划 - select_type15.6 explain分析执行计划 - type15.7 explain分析执行计划 …

Java:爬虫htmlunit抓取a标签

如果对htmlunit还不了解的话可以参考Java:爬虫htmlunit-CSDN博客 了解了htmlunit之后,我们再来学习如何在页面中抓取我们想要的数据,我们在学习初期可以找一些结构比较清晰的网站来做测试爬取,首先我们随意找个网站如下&#xff…

【5.x】ELK日志分析

ELK日志分析 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。 一个完整的集中式日志系统,需要包含以下几个主…

百度网盘限速解决办法

文章目录 开启P2P下载30秒会员下载体验一次性高速下载服务导入“百度网盘青春版”后下载注册新号参与活动 获取下载直链后使用磁力链接下载不是办法的办法无效、已失效方法免限速客户端、老版本客户端、永久会员下载体验试用客户端,或类似脚本、工具获取下载直链后多…

linux执行ifconfig命令ens33没有显示ip地址解决方法

1.右键启动VMware DHCP和NAT这两个服务 2.执行reboot命令,重启linux。然后再执行ifconfig命令,可以看到inet了,就是ip。xshell也可以连接到主机了。

复旦微FMQL20SM全国产ARM+FPGA核心板,替代xilinx ZYNQ7020系列

FMQL20SM核心板一款全国产工业核心板。基于复旦微FMQL20S400M四核ARM Cortex-A7(PS端) FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业核心板,PS端主频高达1GHz。 核心板简介 FMQL20SM核心板是一款全国…

网络安全练气篇——操作系统基础

目录 windows系统基础 什么是windows? windows用户和管理组 1、用户管理和组管理 三种方式登录 相关命令行 2、windows防火墙 3、windows目录 4、windows服务 5、常见端口及其相对应的服务 6、windows进程 7、windows注册表 8、常见的dos命令 系统信息 网络 用…

RK3568平台(显示篇)HDMIOUT调试

一.HDMIOUT代码路径 DRM 全称是 Direct Rendering Manager 是 DRI ( Direct Rendering Infrastructure ) 框架的一个 组件。LINUX 4.4/4.19 内核采用 DRM 框架, HDMI 驱动的路径为: kernel/drivers/gpu/drm/rockchip/dw_hdmi-Rockchip.c kernel/driv…

【Spine学习07】之跑步动作制作思路总结

前几节试着做了待机和走路动画 现在开始尝试做跑步动作 注意跑步动作和走路一样 暂时不需要使用IK约束但是会用到塞贝尔曲线(模拟裙子飞起动效) 第一步: 先将人物整体斜放置(因为人跑步的时候,身体前倾) …

电池包断路单元DBU的预充电电阻应用案例

当电池组接触器闭合到电机和逆变器上时,逆变器电容器中会有电流涌入。这种非常高的电流至少可能会使接触器老化,并可能永久损坏接触器。 因此,当我们关闭电池组上的接触器时,我们分三个步骤执行此操作: 1.关闭主负极…

2024-06-10 Unity 编辑器开发之编辑器拓展10 —— 其他常见工具类

文章目录 1 AssetDatabase1.1 准备工作1.2 常用 API 2 PrefabUtility1 准备工作2 常用 API 3 EditorApplication3.1 准备工作3.2 常用 API 4 CompilationPipeline4.1 CompilationPipeline.assemblyCompilationFinished4.2 CompilationPipeline.compilationFinished4.3 示例 5 A…

git 怎么设置代理

Git 设置代理通常用于在公司内网或需要通过代理服务器访问外网的情况下。以下是一些常用的设置方法: 命令行一次性设置代理: 使用 git config 命令可以临时设置代理,这将只影响当前的仓库。 git config --global http.proxy http://proxyuser…

MMDetection实用工具详解(下):模型复杂度、基准测试

工具目录 四、模型复杂度应用展示结果解析 五、基准测试鲁棒性测试基准应用展示结果解析Testing gaussian_noise at severity 0Testing gaussian_noise at severity 2Aggregated results 遇到的tools自定义导包模块No Module Error错误解决思路 上期MMDetection内三个实用工具详…

Mongodb使用$<identifier>过滤更新数组元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第65篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

JAVA学习笔记DAY5——SSM_Spring

文章目录 技术体系结构单体架构分布式架构 框架 FrameworkSpringIoc容器和核心概念组件Spring管理组件优点Spring Ioc 容器和容器实现普通容器复杂容器SpringIoc容器具体接口和实现类SpringIoc 容器管理配置方式 SpringIoc Ioc DI Spring Ioc 实践和应用Spring Ioc创建步骤配置…

算法day29

第一题 695. 岛屿的最大面积 本题解法:采用bfs的算法; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历; 本题具体分析如上题故事,但是由于要求区域的最大面…

如何更新 iOS 18 Beta 版本?具体步骤总结

如何更新 iOS 18 Beta 想必有一些用户已经迫不及待的想要知道怎么更新 iOS 18 Beta 版本了吧,下面就给大家总结了具体的操作步骤: 在更新 iOS 18 Beta 版本之前记得我们需要将手机的数据进行备份,大家可以自行选用备份软件比如 iCloud 等。…

Codeforces Round 952 (Div. 4) c++题解(A-H1)

开头 : 这场没打,今天vp了一下,写了A-G,然后就去吃饭了! 比赛链接 : Dashboard - Codeforces Round 952 (Div. 4) - Codeforces A 直接交换,输出即可 inline void solve(){string a , b ; cin >> a>> b ;char c a[0] ;a…