文本分析-使用jieba库实现TF-IDF算法提取关键词

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


1.TF-IDF算法介绍

        TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。简单来说就是:一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。这也就是TF-IDF的含义。

50ac51ba2c4f4f31bd3317896db25db8.png

TF(Term Frequency)

词频(TF)表示词条(关键字)在文本中出现的频率。

这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。

公式:

6ea46a15d63d43caa167d8e8e5992e58.png

 (术语 t 在文档中出现的次数) / (文档中的术语总数)

        但是,需要注意, 一些通用的词语对于主题并没有太大的作用, 反倒是一些出现频率较少的词才能够表达文章的主题, 所以单纯使用是TF不合适的。权重的设计必须满足:一个词预测主题的能力越强,权重越大,反之,权重越小。所有统计的文章中,一些词只是在其中很少几篇文章中出现,那么这样的词对文章的主题的作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作。

IDF(Inverse Document Frequency)

        逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

6058ee5cade448bdb82c5ff73e730b3c.png

log_e(文档总数/包含术语 t 的文档数)

        其中,|D| 是语料库中的文件总数。 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|。

        IDF用于衡量一个术语的重要性。在计算 TF 时,所有项都被认为同样重要。然而,众所周知,某些术语,如"是","的"和"那个",可能会出现很多次,但并不重要。

TF-IDF(Term Frequency-Inverse Document Frequency)

        某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语,表达为 :

aa21993d1208476a957ed98e9cb02d61.png

 注: TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

2.TF-IDF算法步骤

第一步,计算词频:

57a5aebae70440bb82587733396e0c57.png

考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。

d6e3f20934da4ef180725fa53ba60b17.png

第二步,计算逆文档频率:

这时,需要一个语料库(corpus),用来模拟语言的使用环境,

15beb2c703374b7081335bfd72b9b2f9.png

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

第三步,计算TF-IDF:

60b9338a0d8a41fcb6e69278bb3753e1.png

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。 

3.jieba库实现

jieba库实现TF-IDF算法主要是通过调用extract_tags函数实现。extract_tags函数参数介绍如下:

def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):"""Extract keywords from sentence using TF-IDF algorithm.Parameter:- topK: return how many top keywords. `None` for all possible words.- withWeight: if True, return a list of (word, weight);if False, return a list of words.- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v','nr'].if the POS of w is not in this list,it will be filtered.- withFlag: only work with allowPOS is not empty.if True, return a list of pair(word, weight) like posseg.cutif False, return a list of words"""

-sentence:要提取关键词的语句,必传参数

-topK:输入权重最高的K个词,默认输出前20个词

-withWeight:如果为True,则输出列表(词,权重)的形式;False则直接返回词语列表。默认为False

-allowPOS:允许出现的词性列表,比如['ns', 'n', 'vn', 'v','nr'] ,如果词语不在词性列表中将会被过滤掉。默认不过滤任何词性

-withFlag:没啥用,不用管,直接默认即可。

示例: 

在提取关键词之前可以加上自定义词典和停用词库,这里我用一条评论文本进行示范,注意使用jieba中的extract_tags函数不需要进行分词,直接传入原始文本即可。

import jieba.analyse
import jieba
jieba.load_userdict('自定义词典.txt')  # 应用自定义词典
jieba.analyse.set_stop_words('停用词库.txt')  # 去除自定义停用词
text = '大唐不夜城,不夜城趣味性很高,里面地方特色东西好吃,也有星巴克麦当劳等等选择,有不少场表演,外景夜景一定要薅一个,其它地方很难有这般景象了。娱乐体验了不倒翁,还有十二时辰里面表演更加精彩、内景拍照不错,簋唐楼可以尝试一下沉浸剧本杀……'
# 注意:使用TF-IDF不需要进行分词,直接将原始文本传入使用
jieba.analyse.extract_tags(text,topK=20) # 默认输出前20个关键词,数值可自行修改

# 如果想获取关键词的权重可以加上
jieba.analyse.extract_tags(text,topK=20,withWeight=True)

 

# 只筛选出n名词的单词 
jieba.analyse.extract_tags(text,topK=20,allowPOS=['n'])

 可以发现,它只将n名词的词语打印了出来。

关于其他词性的代码,具体可以参考下面表格:

案例实战

任务:使用TF-IDF提取红楼梦小说中的关键词及其权重

首先读取红楼梦小说

with open('HLM.txt')as f:content = f.read()
content

 接着使用re正则去除标点符号等异常字符,只保留中文

import re
new_text = "".join(re.findall('[\u4e00-\u9fa5]+', content, re.S))
new_text

最后使用jieba中的extract_tags函数实现TF-IDF提取关键词 

import jieba.analyse
jieba.load_userdict('自定义词典.txt')  # 应用自定义词典
jieba.analyse.set_stop_words('停用词库.txt')  # 去除自定义停用词
jieba.analyse.extract_tags(new_text,withWeight=True) 

 

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

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

相关文章

accountId、uid、roleId 游戏中的3种id

1)accountId: // 是一个字符串 这个是字符串,玩家可以输入名字(比如:输入zfoo) 或者 通过微信生成(openid是不变的)。 2)uid:// long 这个是一个很长的,玩家通过http登录授权后,通过web层,由雪花算法根据accountId生成…

Spring Bean的生命周期解读

目录 1. Spring IOC容器 1.1 Spring IOC 容器的设计 1.1.1 BeanFactory 1.1.2 ApplicationContext 1.2 Spring Bean的生命周期 1.2.1 BeanDefinition 1.2.2 InstantiationAwareBeanPostProcessor和BeanPostProcessor 1.2.3 测试生命周期 1. Spring IOC容器 1.1 Spring …

计算机网络那些事之 MTU 篇 pt.2

哈喽大家好,我是咸鱼 在《计算机网络那些事之 MTU 篇 》中,咸鱼跟大家介绍了 MTU 是指数据链路层能够传输的最大数据帧的大小 如果发送的数据大于 MTU,则就会进行分片操作(Fragment);如果小于 MTU&#x…

SpringBoot整合Redis缓存管理

1. 添加 Spring Data Redis 依赖启动器。在 chapter06 项目的 pom.xml 文件中添加 Spring Data Redis 依赖 启动器。 <!-- 引入整合 Redis 缓存的依赖启动器 --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>…

Java安全——应用安全

Java安全 Java 应用安全 JCE&#xff08;Java Cryptography Extension&#xff09;java加密扩展包 Java Cryptography Extension&#xff08;JCE&#xff09;是一个可选的Java标准扩展&#xff0c;提供了一组用于加密、密钥生成和密钥协商等功能的类和接口。JCE包含了导入、生…

android checkBox的使用

一、前言&#xff1a;之前工作中遇到的checkbox的使用是左边一个复选框&#xff0c;右边一个text。系统学完之后发现那样做的话有点别扭&#xff0c;还是中规中矩的舒坦。记录一下学习经过。 二、代码展示&#xff1a; 1.使用系统自带的checkbox插件。 创建一个CheckBoxActiv…

Solr框架 01 Solr框架简介,安装,配置(Analysis,Dataimport)

Solr简介&#xff1a; Solr是一个高性能&#xff0c;基于Lucene的全文搜索服务器。同时对其进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展&#xff0c;并对查询性能进行了优化&#xff0c;并且提供了一个完善的功能管理界面&am…

CentOs中文件权限命令

文件权限&#xff1a; ls -l命令查看文件详情&#xff0c;前十位就是文件的类型和权限 第一位&#xff1a;类型&#xff1a; - 普通文件 d 目录 l 链接文件&#xff08;快捷方式&#xff09;link 2~4位&#xff1a;所有者的权限 5~7位&#xff1a;所有者所在组其它用户的权限 …

2021 年高教社杯全国大学生数学建模竞赛 E 题 中药材的鉴别 第一题

目录 1.数据预处理 1.1 数据基本信息探索 1.2 数据可视化 1.3 异常值处理 2. 数据特征值提取 2.1 数据标准化 2.2 PCA提取特征值 3. 数据聚类鉴别药材种类 3.1 肘部图确定K值 3.2 轮廓系数图确定K值 3.3 数据聚类 3.4 聚类结果可视化 4. 研究不同种类药材…

【案例实战】SpringBoot整合Redis实现缓存分页数据查询

正式观看本文之前&#xff0c;设想一个问题&#xff0c;高并发情况下&#xff0c;首页列表数据怎么做&#xff1f; 类似淘宝首页&#xff0c;这些商品是从数据库中查出来的吗&#xff1f;答案肯定不是&#xff0c;在高并发的情况下&#xff0c;数据库是扛不住的&#xff0c;那么…

Redis分布式问题

Redis实现分布式锁 Redis为单进程单线程模式&#xff0c;采用队列模式将并发访问变成串行访问&#xff0c;且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。当且仅当 key 不存在&#xff0c;将 key 的值设为 value。 若给定的 key 已经存在&…

『赠书活动 | 第十三期』《算力经济:从超级计算到云计算》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十三期』 本期书籍&#xff1a;《算力经济&#xff1a;从超级计算到云计算》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…