首页 > 其他分享 >TF-IDF(词频-逆文档词频)

TF-IDF(词频-逆文档词频)

时间:2024-09-14 17:51:40浏览次数:3  
标签:__ 词表 IDF 文档 tf TF 词频

目录

1. 算法公式

1.1 TF(词频)

1.2 IDF(逆文档词频)

2. 算法使用

2.1 API 使用

2.2 API 工作

3. 参数详解

3.1 文档处理相关参数

3.2 词表构建相关参数

3.3 影响计算相关参数


TF-IDF(Term Frequency – Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用技术。

通过 TF-IDF 我们可以实现:

  1. 评估文档中每个词的重要性,实现对文档的关键词抽取
  2. 将输入文档表示为向量(关键词重要性向量),可用于文档检索

1. 算法公式

TF-IDF 可以评估文档中某个词的重要性,其计算公式:TF-IDF = TF * IDF。通过该公式,我们得知,评估一个词的重要性时,该算法要综合考虑该词的 TF 值和 IDF 值。

  1. TF: 表示某个词在文档中出现的次数。如果该词在文档中出现的次数越多,TF 值就越大。
  2. IDF:表示包含某个词的文档数量。如果包含该词的文档数量越少,IDF 值就越大。

例如:词 A 和 词 B 是某个文档中出现的词,两个词在文档中出现的次数一样多,但是:

  1. 同时,词 A 在其他文档中大量出现。
  2. 同时,词 B 在其他文档中很少出现。

TF-IDF 认为:词 A 在其他文档中大量出现,说明该词很普遍,会降低该词的重要性。反之,则认为该词更为重要。

1.1 TF(词频)

采用对数平滑的方式有助于减小高频词对文档的影响,避免某些词对文档特征表示的过度影响。

import numpy as np
if __name__ == '__main__':
    tf = np.array([20, 5, 2])
    print(tf)
    tf = np.log(tf)
    print(tf)

输出结果:

[20  5  2]
[2.99573227 1.60943791 0.69314718]

1.2 IDF(逆文档词频)

IDF平滑的作用是什么?

IDF 的平滑计算目的是为了避免分母为 0,默认情况下,在计算时,都会默认进行 IDF 平滑

公式能够反映出的信息是什么? 

文档集合中,包含某个词的文档数量越多,该词的 IDF 值就越小。反之,则越大。

import matplotlib.pyplot as plt
import numpy as np
def test():
    doc_num = 100
    x = np.arange(1, 100)
    y = np.log((doc_num + 1) / (x + 1)) + 1
    plt.plot(x, y)
    plt.xlabel('Num of Docs Containing the Term')
    plt.ylabel('Inverse Document Frequency')
    plt.grid(True)
    plt.show()
if __name__ == '__main__':
    test()

为什么进行 log 计算?

对数函数能够将大范围的值映射到相对较小的范围内。这对于在不同文档中频率差异较大的词语来说尤其重要。通过取对数,可以有效地缩小高频词的影响,使得低频词在计算中更具影响力。

比如:共有 10000 个文档,某个词出现次数为 2,和出现次数为 1000,值分别为 5000 和 10,这个数值差距会很大。通过取对数值变为 [8.5 2.3],使得词影响均衡一些。

2. 算法使用

在这一节中,主要给同学们讲解下 TF-IDF 算法 API 的使用方法(scikit-learn 库),以及该 API 是如何将输入的文档转换为 TF-IDF 向量。

scikit-learn(sklearn)是一个用于机器学习的 Python 库,常用于数据挖掘和数据分析。它包含了各种机器学习算法和工具,支持分类、回归、聚类等任务,以及类似 TF-IDF 的特征提取算法。

pip install scikit-learn

2.1 API 使用

在 scikit-learn 中实现 TF-IDF 算法。下面我们将学习其使用方法:

from sklearn.feature_extraction.text import TfidfVectorizer

# 注意: 文档需要先进行分词,以空格隔开

texts = ['我们 是 中国人 中国人', '中国人 很 很 厉害', '他们 真的 厉害 吗 ?']

def test():

tfidf = TfidfVectorizer()

result = tfidf.fit_transform(texts)

print(tfidf.get_feature_names_out())

print(result.toarray())

if __name__ == '__main__':

test()

程序输出结果:

[[0.83559154 0. 0. 0.54935123 0. ]

[0.70710678 0. 0.70710678 0. 0. ]

[0. 0.62276601 0.4736296 0. 0.62276601]]

程序输出结果是每一篇,每一个关键字的TF-IDF 

2.2 API 工作

TfidfVectorizer 的计算过程如下:

  1. 首先,根据输入的多个文档、预料构建词表(先分词)
  2. 然后,统计每篇文档中,词表中的词出现的次数
  3. 接着,计算每个词的平滑之后的 TF-IDF 值
  4. 最后,对每个文档 TF-IDF 向量进行 L2 标准化
1. TFIDF 会根据空格将输入文档切分成词列表,并去除单字词、标点符号

['中国人' '他们' '厉害' '我们' '真的']

2. 统计每个文档中,词表中的词出现次数

[[2 0 0 1 0]

[1 0 1 0 0]

[0 1 1 0 1]]

3. 计算每个词平滑之后的 TF-IDF 值

[[2.57536414 0. 0. 1.69314718 0. ]

[1.28768207 0. 1.28768207 0. 0. ]

[0. 1.69314718 1.28768207 0. 1.69314718]]

4. 计算每个向量 L2 标准化之后的值

[[0.83559154 0. 0. 0.54935123 0. ]

[0.70710678 0. 0.70710678 0. 0. ]

[0. 0.62276601 0.4736296 0. 0.62276601]]

3. 参数详解

TfidfVectorizer 实现中,包含了很多相关参数,接下来,将会详细讲解其中的大多数参数的作用。

3.1 文档处理相关参数

# 指定文档预处理函数

preprocessor=None

# 指定分词是词粒度(word)还是字符粒度(char)

analyzer='word'

# 文本内容是否小写

lowercase=True

3.2 词表构建相关参数

# 用于切分出词的规则

token_pattern=r"(?u)\b\w\w+\b"

# 增加 N-Gram 特征词

ngram_range=(1, 1)

# 将某个词在整个文档列表中出现次数大于 max_df 的词从词表中去除

max_df=1.0

# 将某个词在整个文档列表中出现次数小于 max_df 的词从词表中去除

min_df=1

# 将 TF 值最大的前 Top N 保留

max_features=None

# 指定自定义词表

vocabulary=None

# 去除停用词

stop_words=None

3.3 影响计算相关参数

# 指定是否对 TF-IDF 向量进行标准化, 值可选:l1、l2

norm='l2'

# 是否计算 idf 值,如果为 False, idf(t) = 1.

use_idf=True

# 是否进行 TF-IDF 平滑计算

smooth_idf=True

# sublinear_tf 的设置影响 TF 的计算方式

sublinear_tf=False

 

标签:__,词表,IDF,文档,tf,TF,词频
From: https://blog.csdn.net/2302_80147064/article/details/142140536

相关文章

  • `ModuleNotFoundError: No module named ‘whisper‘`
    /home/shgbitai/pythonworkspace/ai-accompany/venv/bin/python/home/shgbitai/pythonworkspace/ai-accompany/main.pyTraceback(mostrecentcalllast):File"/home/shgbitai/pythonworkspace/ai-accompany/main.py",line3,in<module>impor......
  • Utf8JsonWriter生成json
    privatestaticTaskWriteResponse(HttpContextcontext,HealthReporthealthReport){context.Response.ContentType="application/json;charset=utf-8";varoptions=newJsonWriterOptions{Indented=true};usingvarmemoryStr......
  • 初探CTF-WEB挑战
    一、作业内容1.准备各种工具,并且能够使用2.完成新手题,找到flag二、操作步骤1.EzLogin2.Canyouaccess3.Chopper4.cookie5.Employeeswork6.Ezinclude7.Ezsearch8.Robots9.Vim10.Wtfbutton三、作业总结作业内容准备各种工具,并且......
  • ObjectFactory3
    packagecom.shrimpking.t6;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1218:06*/publicclassPerson{privateStringname;publicPerson(){this("匿名构造");}publicPerson(Stringnam......
  • ObjectFactory2反射
    packagecom.shrimpking.t6;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1218:06*/publicclassPerson{privateStringname;publicPerson(){this("匿名构造");}publicPerson(Stringnam......
  • ObjectFactory
    packagecom.shrimpking.t6;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1218:06*/publicclassPerson{privateStringname;publicPerson(){this("匿名构造");}publicPerson(Stringnam......
  • [SUCTF2019]SignIn1
    无壳,载入IDA. 搜索找到main函数开始分析.__int64__fastcallmain(inta1,char**a2,char**a3){charv4[16];//[rsp+0h][rbp-4A0h]BYREFcharv5[16];//[rsp+10h][rbp-490h]BYREFcharv6[16];//[rsp+20h][rbp-480h]BYREFcharv7[16];//[rsp+......
  • CTF-BugKu-PWN 瑞士军刀
    参考:bugku-瑞士军刀_114.67.175.224-CSDN博客NC:https://www.cnblogs.com/bakari/p/10898604.html#:~:text=nc%EF%BC%8C%E5%85%A8%E5%90%8D%E5%8F%AB%20n注意:nc连上之后是没有反馈的ls:列出目前工作目录所含的文件及子目录 可以看到有flag文件cat:用于显示文本文件内......
  • 什么是Restful风格的API
     1、REST的定义请参考论文:https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm2、API文档编写语义:本文档中的关键字:必须-MUST,不得-MUSTNOT,必需-REQUIRED,应该-SHALL,不应该-SHALLNOT,应该-SHOULD,不应该-SHOULDNOT,......
  • RESTful规范 GET请求、POST请求、PUT请求、DELETE请求的使用规范
    RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。RESTFul规范:一.http动词:GET(SELECT):从服务器取出资源......