当前位置: 首页 > news >正文

《机器学习》数据分析之关键词提取、TF-IDF、项目实现 <下>

目录

一、内容回顾

1、核心算法

2、算法公式

3、拆分文本

二、再次操作

1、取出每一卷的地址和内容

得到下列结果:(此为DF类型)

2、对每一篇文章进行分词

3、计算TF-IDF值

得到以下数据:

三、总结

1、关键词提取

1)基于频率统计的方法

2)基于文本特征的方法

2、TF-IDF(Term Frequency-Inverse Document Frequency)

1)词频(Term Frequency,TF)

2)逆文档频率(Inverse Document Frequency,IDF)

3)TF-IDF的最终得分为TF和IDF的乘积

3、总结


一、内容回顾

1、核心算法

        TF-IDF,用来评估一个词在文档中的重要性统计方法

2、算法公式

3、拆分文本

        上节课我们通过以下代码将红楼梦正篇文章分成了120个卷

import osfile = open(r'.\红楼梦.txt','r',encoding='utf8')  # 打开红楼梦数据文件
flag = 0   # 设置一个变量为0
juan_file = open(r'.\红楼梦\红楼梦卷开头.txt','w',encoding='utf8')  # 创建写模式,创建一个名为红楼梦卷开头的txt文件,文件放在红楼梦目录下for line in file:    # 遍历每一行内容if "手机电子书" not in line:if '卷 第' in line:   # 判断每一行是否有这个数值juan_name = line.strip()+'.txt'   # 去除带有上述数值的一行数据左右两边的空白字符,比如空格、制表、换行等,并增加了一个后缀txtpath = os.path.join('.\\红楼梦\\分卷\\',juan_name)  # 使用os库中的方法path.join遍历并创建一个文件,文件地址为红楼梦目录下的分卷文件内,文件名为上述增加了txt后缀的字符串print(path)   # 打印这个文件名if flag==0:  # 判断,如果flag=0juan_file = open(path,'w',encoding='utf8')   # 打开并创建写一个文件,文件名为上述生成的文件名flag=1   # 将flag赋值为1else:   # 如果flag不等于0,说明已经在生成文件名的操作内了,此时打开上述创建的文件juan_file.close()juan_file = open(path,'w',encoding='utf8')continue   # 这里的语句和上述if同级别,在上上个if下,即执行完上述内容后跳出这一整个循环,继续进行下一次循环juan_file.write(line)  # 此段和第一个if同级别,相当于if的else语句,如果字符串不在当前行内,那么就将这一行内容写入juan_file文件continue
juan_file.close()  # 操作完关闭文件

其处理结果如下所示:(分卷内存放每卷内容)

二、再次操作

1、取出每一卷的地址和内容

import pandas as pd
import osfilePaths = []   # 定义一个空列表用于存放卷内文件的地址
fileContents = []   # 用来存放卷内文件的内容for root,dirs,files in os.walk(r'.\红楼梦\分卷'):   # 使用os的walk用法,用来遍历文件内的文件地址、文件目录、文件名,返回三个参数for name in files:    # 遍历每一个文件名filePath = os.path.join(root,name)   # 使用os.path.join遍历文件地址和目录filePaths.append(filePath)   # 将带有文件地址和文件名的字符串存入filePaths列表f = open(filePath,'r',encoding='utf8')   # 打开前面生成的文件,因为此时已经有了文件地址和文件名fileContent = f.read()   # 读取文件内的内容fileContents.append(fileContent)   # 将文件内容存在fileContents列表中f.close()  # 存放完关闭文件corpos = pd.DataFrame({'filePath':filePaths,'fileContent':fileContents})  # 将上述带有文件地址和文件内容的两个列表转变成二维数组,并给予列名
print(corpos)
得到下列结果:(此为DF类型)

2、对每一篇文章进行分词

import jieba   # 导入分词库
jieba.load_userdict(r'.\红楼梦\红楼梦词库.txt')   # 传入本地的红楼梦词库,其中存放红楼梦的固定词组
# 使用pd打开停用词,则表明打开后的文件为一个DateFrame类型,index_col表示是否将第一列当做索引列,engine使用python解释器解析
stopwords = pd.read_csv(r'.\红楼梦\StopwordsCN.txt',encoding='utf8',index_col=False,engine='python')
file_to_jieba = open(r'.\红楼梦\分词后汇总.txt','w',encoding='utf8')   # 创建一个文件,用于存放分词后的数据,一行代表一卷内容的分词结果for index,row in corpos.iterrows():   # 使用iterrows遍历二维数组每一行的内容,返回两个参数,一个表示所有的行索引,一个表示所有行的内容series类型juan_ci = ''   # 定义一个空,用来递增每一卷分出来的词组filePath = row['filePath']   # 取出返回的每一行数据的地址fileContent = row['fileContent']  # 取出每一行的数据内容,表示每一卷的内容segs = jieba.cut(fileContent)   # 对取出的每一卷内容进行分词,得到一个列表,for seg in segs:   # 遍历每一个分出来的词组if seg not in stopwords.stopword.values and len(seg.strip())>0:  # 判断分出来的词组是否是空值,是否是停止词的内容juan_ci += seg + ' '   # 将取出的每一个词后面加上一个空格,然后将每一卷的所有的词组连接起来file_to_jieba.write(juan_ci+'\n')    # 将每一卷连接好的词组内容写入文件
file_to_jieba.close()  # 关闭文件

得到一个分词文件,其内有如下数据:(其中每一行代表一个卷的所有词组,因为文件长度不够,所以自动排列到下一行)

3、计算TF-IDF值

from sklearn.feature_extraction.text import TfidfVectorizer  # 导入计算TF-IDF的库
import pandas as pdinfile = open(r'.\红楼梦\分词后汇总.txt','r',encoding='utf8')   # 打开上述生成的词组文件
corpus = infile.readlines()   # 读取文件所有行的内容vectorizer = TfidfVectorizer()   # 建立模型
tfidf = vectorizer.fit_transform(corpus)  # 对模型进行训练,返回一个带有所有值坐标和对应TF-IDF值的稀疏矩阵
wordlist = vectorizer.get_feature_names()   # 获取所有的特征值,即所有的词组df = pd.DataFrame(tfidf.T.todense(),index=wordlist)   # 将上述的稀疏矩阵和特征值合并,转换成二维数组,行代表每个词组在每篇文章的TF-IDF的值,列表示每篇文章的所有词组for i in range(0,len(corpus)):   # 遍历出来每一卷文章的所有词组featurelist = df.iloc[:,i].to_list()  # 将每篇文章所有词组的TF-IDF的值转换成列表形式resdict = {}   # 设置一个空字典,用来存放每篇文章的词组和其对应的值for j in range(0,len(featurelist)):   # 遍历每一个单词resdict[wordlist[j]] = featurelist[j]  # 这里不停地传入字典新的值,键为每个单词,值为单词对应TF-IDF值resdict = sorted(resdict.items(),key=lambda x:x[1],reverse=True)  # 对每篇文章的TF-IDF值进行排序print(resdict[:10])  # 打印每篇文章的前十TF-IDF值

至此已完成所有内容

得到以下数据:

三、总结

1、关键词提取

        关键词提取是从给定的文本中提取出最具有代表性和重要性的词语。常见的关键词提取方法包括基于频率统计的方法和基于文本特征的方法。

        1)基于频率统计的方法

                通过计算词语在文本中的出现频率,提取出现频率较高的词语作为关键词。常见的方法有词频(TF)和逆文档频率(IDF)。

        2)基于文本特征的方法

                通过考虑词语在上下文中的语义关联性,提取具有语义相关性的词语作为关键词。常见的方法有TextRank算法和LDA主题模型。

2、TF-IDF(Term Frequency-Inverse Document Frequency)

        TF-IDF是一种用于评估文本中词语重要性的统计方法。它是通过计算词语在文本中的词频(TF)和逆文档频率(IDF)来确定一个词语的重要性。具体计算方法如下:

        1)词频(Term Frequency,TF)

                指定词语在文本中出现的频率,计算方法为词语在文本中的出现次数除以文本的总词数。

        2)逆文档频率(Inverse Document Frequency,IDF)

                指定词语在整个文本集合中的重要程度,计算方法为文本集合中文档总数除以包含该词语的文档数量的对数。

        3)TF-IDF的最终得分为TF和IDF的乘积

                用于衡量一个词语在文本中的重要性。较高的TF-IDF得分表示词语在文本中更重要。

3、总结

         关键词提取是从文本中提取最具有代表性和重要性的词语。TF-IDF是一种常用的关键词提取方法,通过计算词语在文本中的词频和逆文档频率来评估词语的重要性。这些方法在文本数据分析中有广泛的应用,可以帮助我们理解和处理大量的文本数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何永久解决 Memory overcommit must be enabled! 警告问题
  • c++单例模式(Singleton)多种实现方式及最优比较
  • 打手机检测算法源码样本展示打手机检测算法实际应用场景介绍
  • sort排序免忘记
  • 云轴科技ZStack产品升级,浙江分公司产品发布会成功举办
  • chrome cookie编辑
  • 如何选择适合海外直播的网络?
  • 万亿生成式AI市场,商汤迎来“长坡厚雪”
  • 【React原理 - 任务调度和时间分片详解】
  • Maui的xaml中的换行符
  • Linux--IO模型_多路转接
  • k8s的组件以及安装
  • 【Linux】 理解 Linux 中的 `dup2` 函数
  • 关于一个早期对电子辐射的小讨论
  • 回调与观察者模式区分
  • js继承的实现方法
  • Koa2 之文件上传下载
  • PAT A1017 优先队列
  • php ci框架整合银盛支付
  • Python_OOP
  • sessionStorage和localStorage
  • uva 10370 Above Average
  • XForms - 更强大的Form
  • 翻译:Hystrix - How To Use
  • 批量截取pdf文件
  • 时间复杂度与空间复杂度分析
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 《码出高效》学习笔记与书中错误记录
  • Prometheus VS InfluxDB
  • ​MySQL主从复制一致性检测
  • # include “ “ 和 # include < >两者的区别
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $.ajax中的eval及dataType
  • (06)金属布线——为半导体注入生命的连接
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4)logging(日志模块)
  • (C语言)fread与fwrite详解
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (ZT)薛涌:谈贫说富
  • (分布式缓存)Redis持久化
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)、python程序--模拟电脑鼠走迷宫
  • .cn根服务器被攻击之后
  • .NET C# 操作Neo4j图数据库
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET使用存储过程实现对数据库的增删改查
  • .php文件都打不开,打不开php文件怎么办
  • .skip() 和 .only() 的使用
  • @Transaction注解失效的几种场景(附有示例代码)
  • [120_移动开发Android]008_android开发之Pull操作xml文件