亦菲喊你来学机器学习(18) --TF-IDF方法

news2024/11/15 9:44:55

文章目录

  • TF-IDF
    • 词频TF
    • 逆文档频率IDF
    • 计算TF-IDF值
  • 应用
  • 实验使用TF-IDF
    • 1. 收集数据
    • 2. 数据预处理
    • 3. 构建TF-IDF模型对象
    • 4. 转化稀疏矩阵
    • 5. 排序取值
    • 完整代码展示
  • jieba分词
  • 总结

TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

比如我们常用的百度软件,是如何做到输入搜索词就可以在数不清的文档中取出我们需要的呢?就是因为,他对每一篇文章都计算了文章内容单词的TF-IDF值,找出哪些词对文章是重要的,可以作为搜索词,定位到文章。

词频TF

TF(Term Frequency,词频),词频是指某个词在文档中出现的次数。对于某一特定文件里的词语t来说,它的重要性可以简单地通过它在该文件中出现的次数来衡量。但是,这种简单的统计方法有两个问题:

  1. 它没有考虑到文件长度。较长的文件可能会包含更多的词,因此单纯的词频统计会使得长文件中的词看起来更重要。
  2. 它没有考虑到词的重要性与它在语料库中出现的频率成反比这一事实。一些常用的词(如“的”,“是”,“在”等)可能在很多文档中频繁出现,但它们对文档的主题可能没有太大贡献。

在这里插入图片描述

逆文档频率IDF

IDF(Inverse Document Frequency,逆文档频率),逆文档频率是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

在这里插入图片描述

计算TF-IDF值

在这里插入图片描述

应用

TF-IDF在文本挖掘和信息检索领域有着广泛的应用。例如,在搜索引擎中,搜索引擎可以根据用户输入的查询词,计算每个网页中这些查询词的TF-IDF值,然后根据这些值对网页进行排序,将最相关的网页排在前面。此外,TF-IDF还可以用于文本分类、文本聚类、关键词提取等任务中。

实验使用TF-IDF

目标:计算给予数据中,每篇文章名字中适合搜索的单词。

1. 收集数据

链接: 实验数据
提取码: 9unj

2. 数据预处理

读取文本内容:

inFile = open('task2_1.txt','r')
corpus = inFile.readlines()     #读取所有行数据,存在列表中

3. 构建TF-IDF模型对象

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()  #构建TF-IDF模型对象
tfidf = vectorizer.fit_transform(corpus)    #fit_transform()拟合并调整数据的分布或范围
print(tfidf)
----------------
  (0, 1)	0.4489258246711445
  (0, 3)	0.620513986496383
  (0, 10)	0.3876833588747892
  (0, 5)	0.3876833588747892
	………………		…………

注意:拟合完之后会有一串数据(tfidf),其中列如"(0, 1) 0.4489258246711445"表示,在第1篇中,第2个词的TF-IDF值。但是!!值得注意的是,这里的第2个词并不是指在那篇文章中的第2个单词,而是在文本中所有单词中的第2个。那么,我们怎么知道文本中有多少词呢?

我们看看下一行get_feature_names_out()方法:

# get_feature_names_out()方法:获取特征名称,所有的单词
# 上述所说的第几个词,表示在这里面的索引获取的值
wordlist = vectorizer.get_feature_names_out()
print(wordlist)
--------------------
['and' 'document' 'final' 'first' 'has' 'is' 'line' 'one' 'second'
 'several' 'the' 'third' 'this' 'words']

4. 转化稀疏矩阵

由于获得的tfidf数据观察起来有些困难,所以将其转化为稀疏矩阵(以wordlist为索引):

df = pd.DataFrame(tfidf.T.todense(),index=wordlist)

在这里插入图片描述

得到每篇文章,对应每个单词的TF-IDF值,没有该单词的为0。

5. 排序取值

步骤:获取矩阵中的每一列 —> 将每一篇的对所有单词的TF-IDF值给取出存入字典中 —> sorted方法排序(以TF-IDF值为基准)

for i in range(0,6):
    # 获取矩阵中的每一列
    featyrelist = df.iloc[:,i].to_list()

    # 将每一篇的对所有单词的TF-IDF值给取出存入字典中
    resdict = {}
    for j in range(0,len(wordlist)):
        resdict[wordlist[j]] = featyrelist[j]   #给字典创建键值对内容

    # resdict.items()获取字典中键值对所有内容,返回的是元组
    # key:以key为基准排序,lambda x: x[1]表示取返回元组中的第二个值,即TF-IDF值
    # reverse:排序方式,True表示降序
    resdict = sorted(resdict.items(),key=lambda x: x[1],reverse=True)
    print(resdict)

输出显示:

[('first', 0.620513986496383), ('document', 0.4489258246711445), ('is', 0.3876833588747892), ('the', 0.3876833588747892), ('this', 0.3359035918367382), ('and', 0.0), ('final', 0.0), ('has', 0.0), ('line', 0.0), ('one', 0.0), ('second', 0.0), ('several', 0.0), ('third', 0.0), ('words', 0.0)]
[('document', 0.670678043970947), ('second', 0.5652488019730092), ('is', 0.28959206902465257), ('the', 0.28959206902465257), ('this', 0.25091357141339277), ('and', 0.0), ('final', 0.0), ('first', 0.0), ('has', 0.0), ('line', 0.0), ('one', 0.0), ('several', 0.0), ('third', 0.0), ('words', 0.0)]
[('and', 0.5183362513321061), ('one', 0.5183362513321061), ('third', 0.5183362513321061), ('is', 0.2655575154689396), ('the', 0.2655575154689396), ('this', 0.23008912103979834), ('document', 0.0), ('final', 0.0), ('first', 0.0), ('has', 0.0), ('line', 0.0), ('second', 0.0), ('several', 0.0), ('words', 0.0)]
………………多余不展示

这样我们就知道了每篇文章对应每个单词的权重大小。

完整代码展示

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

inFile = open('task2_1.txt','r')
corpus = inFile.readlines()     #读取所有行数据,存在列表中

vectorizer = TfidfVectorizer()  #构建TF-IDF模型对象
tfidf = vectorizer.fit_transform(corpus)    #fit_transform()拟合并调整数据的分布或范围
# 拟合完之后会有一串数据,表示,在第几篇中,第几个词的TF-IDF值
# 但是!!值得注意的是,这里的第几个词并不是指在那篇文章中的第几个,而是在文本中所有单词中的第几个
# 那么,我们怎么知道文本中有多少词呢?我们看看下一行get_feature_names_out()方法
print(tfidf)

# get_feature_names_out()方法:获取特征名称,所有的单词
# 上述所说的第几个词,表示在这里面的索引获取的值
wordlist = vectorizer.get_feature_names_out()
print(wordlist)

# 由于获得的tfidf数据观察起来有些困难,所以将其转化为稀疏矩阵(以wordlist为索引)
df = pd.DataFrame(tfidf.T.todense(),index=wordlist)
# print(df)

words = []
for i in range(0,6):
    # 获取矩阵中的每一列
    featyrelist = df.iloc[:,i].to_list()

    # 将每一篇的对所有单词的TF-IDF值给取出存入字典中
    resdict = {}
    for j in range(0,len(wordlist)):
        resdict[wordlist[j]] = featyrelist[j]   #给字典创建键值对内容

    # resdict.items()获取字典中键值对所有内容,返回的是元组
    # key:以key为基准排序,lambda x: x[1]表示取返回元组中的第二个值,即TF-IDF值
    # reverse:排序方式,True表示降序
    resdict = sorted(resdict.items(),key=lambda x: x[1],reverse=True)
    words.append(resdict[0][0])	#获取TF-IDF值最高的单词
    print(resdict)
print('每篇文章对应的搜索单词为:',words)

jieba分词

但是,注意咯,我们实验使用的数据是英文的,它本身每个单词之间就已经被空格分开了。那假如我们要处理中文文章呢?所有单词都在一句话中连在一起,我们怎么得到每个单词呢?更别提得到每个单词的TF-IDF值了。

所以在这里,我们需要实验jieba库方法,对中文进行分词,库本身包含了中文大部分词海,他会判断哪些字比较适合合在一起作为一个单词,进行划分,从而起到分词作用。该方法我们下期介绍并尝试实验使用它!

总结

本篇介绍了:

  1. 什么是TF-IDF值?它有什么作用?
  2. 如何计算TF-IDF值
  3. 使用TF-IDF对象得到文章单词权重
  4. 下期介绍,使用jieba库进行中文分词

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

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

相关文章

浅析Java线程池实现原理 1

目录 一、线程池 1.1 线程池是什么 1.2 线程池解决的问题是什么 二、线程池核心设计与实现 2.1 总体设计 ThreadPoolExecutor是如何运行,如何同时维护线程和执行任务的呢? 2.2 生命周期管理 2.3 任务执行机制 任务调度 任务缓冲 任务申请 任…

日常工作中的AI助手

近几年,人工智能进入了一个高速发展的阶段。AI也与各种业态深度融合,各类工具的出现也为行业赋能。今天,我们一起来探索几款能够在日常工作中提升效率的AI助手。 排名不分先后,内容仅供参考,大家可以根据实际需求自行…

计算机网络1.1

计算机网络:多台电脑 通过交换机 相互连接 互连网:多个计算机网络 通过路由器 连接 互联网:最大的互连网 电路交换: 报文交换:传送的数据在中间节点进行储存,再进行转发(根据转发表确定转…

ctfshow(web入门-命令执行)-1

1.web29 只有当c参数的值不包含“flag”(区分大小写),才会执行这段代码 $c $_GET[c];if(!preg_match("/flag/i", $c)){eval($c);}只要payload中没有flag即可 先尝试cat (右键源代码) tail,tac皆可 system("tail fla*"…

利用深度学习实现验证码识别-1

验证码(CAPTCHA)是网络安全中常用的一种机制,用于区分人类用户和自动化程序。然而,随着人工智能技术的发展,计算机视觉和深度学习算法在识别验证码方面取得了显著进展。本文将介绍如何使用PyTorch框架实现一个深度学习模型来识别简单的数字验证码。 数据生成与预处理 首先,我…

数据图像处理26

六、图像分割 6.3 分水岭图像分割 6.3.1分水岭算法的基本概念 分水岭算法之所以得名,是因为其的分割原理与地理学中的分水岭现象非常相似。在地理学中,分水岭是分隔相邻水系的山岭或高地,雨水会分别流向两侧的水系。 分水岭算法常用于图像…

代码随想录训练营day34|62.不同路径,63. 不同路径 II,343.整数拆分,96.不同的二叉搜索树

不同路径1 题目 题目并不难想&#xff0c;每一个点只有两种走到的方法&#xff0c;要么从左侧来&#xff0c;要么从上侧来&#xff0c;所以 dp[i][j]dp[i-1][j]dp[i][j-1]; vector<vector<int>> dp(m,vector<int>(n,0)); for(int i0;i<m;i){for(int j0;j…

MLM之Qwen:Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略

MLM之Qwen&#xff1a;Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略 目录 Qwen2-VL的简介 1、主要增强功能&#xff1a; 2、模型架构更新&#xff1a; 3、性能 图像基准测试 视频基准测试 代理基准测试 多语言基准测试 4、新闻 5、限制 Qwen2-VL的安装和使用…

【hot100篇-python刷题记录】【翻转二叉树】

R7-二叉树篇 一眼递归 递归具有相同子问题的特点。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def in…

metallb-speaker缓存

手动修改metallb-config arping返回2个mac地址 删除pod mac正常返回 pkill 进程 返回2个mac

pycharm 2024.1下载、安装

下载 下载官网&#xff1a; Other Versions - PyCharm 选择需要的版本下载&#xff0c;这里以 2024.1 的版本为例 安装 双击下载好的安装程序&#xff0c;点击下一步 选择安装路径&#xff0c;最好是英文路径&#xff1b;然后下一步 点击完成 激活 网址&#xff1a; Some…

突发!某GPU芯片独角兽!400+人 原地解散!

今天偶然打开脉脉APP&#xff0c;看看最近IT圈子又有什么劲爆消息&#xff0c;发现某芯片独角兽全员原地解散的消息登上热搜 No1了。 之前没有怎么关注过芯片行业&#xff0c;因此完全不知道这家公司&#xff0c;没想到成了热搜No1&#xff1b;由此可见该公司在行业内应该还是比…

安装vmtools管理虚拟机教程

目录 1.什么是vmtools 2.安装教程 2.1删除和安装 2.2文件的复制和粘贴 2.3指令操作 3.检验效果 4.小结 1.什么是vmtools vmtools就是安装之后可以让我们更好的管理我们的虚拟机&#xff1b; 我们可以设置windows和centos共享的文件夹&#xff0c;让该文件夹实现共享&am…

C++初始化列表,staic成员变量

初始化列表的引入 class Stack { public:Stack(int capacity){_arr (int*)malloc(sizeof(int) * capacity);if (_arr NULL){perror("malloc->_newarr");return;}_capacity capacity;} private:int _capacity;int _size;int* _arr; //默…

滚动视图ScrollView

activity_scroll_view.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

嵌入式全栈开发学习笔记---Linux常用库(json)

目录 入门级问题 为什么使用json? 什么是json? json-c库 json源码 安装方法 json-c API Json类型 C-API 将一个字符串转换成符合json格式的字符串(json对象) 定义一个字符串数组 定义一个json_object结构体指针 把一个字符串转换成一个json对象 将转换成json对…

TS类型注解(下)

文章目录 前言三、TypeScript类型约束&#xff08;5&#xff09;对象&#xff08;6&#xff09;接口&#xff08;TS中对象类型的专属约束&#xff09;&#xff08;7&#xff09;TS中的扩展类型 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&…

台式机CPU温度90℃以上-排查思路

虽然现在台式机不值钱。 但是对于穷苦老百姓来说&#xff0c;还是害怕它坏掉&#xff0c;坏掉就又需要花钱买了。 ①风扇清理所有灰尘&#xff08;风扇的散热网是可以拆下来的&#xff09;&#xff0c; 主板清理所有灰尘&#xff08;用画笔或者干燥的牙刷&#xff0c;注意是…

LeetCode - 11 盛最多水的容器

题目来源 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最…

小型集群分析

目录 介绍步骤 介绍 etcd是CoreOS基于Raft协议开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;。 在分布式系统中&#xff0c;如何管理节点间的状态一直是一个难题&#xff0c;etcd像是专门为…