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

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

目录

一、如何进行关键词提取

1、关键词提取步骤

        1)数据收集

        2)数据准备

        3)模型建立

        4)模型结果统计

        5)TF-IDF分析

2、什么是语料库

3、如何进行中文分词

        1)导包

        2)导入分词库

        3)导入停用词库

        4)使用jieba库分词

        5)代码实例

二、核心算法

1、TF-IDF分析

2、TF-IDF算法公式

        1)TF词频公式

        2)IDF逆文档频率公式

        3)TF-IDF公式

        4)举例

3、案例

运行结果:

三、处理红楼梦词库

1、导入红楼梦词库

用法示例:

2、对整篇红楼梦文章进行拆分

完整代码:

运行结果:


一、如何进行关键词提取

1、关键词提取步骤

        1)数据收集

                收集研究需要的数据,建立相应的语料库

        2)数据准备

                导入分词库和通用词库

        3)模型建立

                使用 jieba 库,对语料库进行分词处理

        4)模型结果统计

                根据分类结果,进行词频统计,并绘制词云图

        5)TF-IDF分析

                得到加权后分词结果

2、什么是语料库

        语料库是指用于训练和评估模型的文本数据集。语料库通常包含大量的自然语言文本,例如新闻文章、书籍、网页内容等。

        语料库中存放的是在语言的实际使用中真实出现过的语言材料。

3、如何进行中文分词

        1)导包
pip install jieba
        2)导入分词库

                固定词组,jieba库没有内置的词组

        3)导入停用词库

                没有意义的词

        4)使用jieba库分词

                将文章完全分词即可

        5)代码实例
import jiebastr = '我们在学习python办公自动化'   # 导入词组
jieba.add_word('python办公自动化')  # 指定固定词组
a = jieba.lcut(str)  # 对词组进行分词
print(a)

        此时的运行结果为:

        上述如果没有使用固定词组则会有下列运行结果:

二、核心算法

1、TF-IDF分析

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

        TF指的是某一个给定的词语在该文件中出现的次数,这个数字通常会被归一化(一般是词频除以文章总词数),以防止它偏向长的文件。

        IDF指的是逆文档频率。IDF的主要思想是:如果包含词条 t 的文档越少,IDF越大,则说明词条具有很好的类别区分能力

        TF-IDF倾向于过滤掉常见的词语,保留重要的词语,它的值等于一个词的TF乘以它的IDF值,其大小用于衡量一个词在一个文档中的重要性,相当于加权

2、TF-IDF算法公式

        1)TF词频公式

        2)IDF逆文档频率公式

        3)TF-IDF公式

        4)举例

                以《中国的蜜蜂养殖》为例,假定该文长度1000个词,“中国"、"蜜蜂”、养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数。包含"中国"的网页共有62.3亿张,包含”蜜蜂”的网页为0.484亿张,包含“养殖”的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:

        “中国”、 “密封”、“养殖”的TF值 = 20/1000 = 0.02

        “中国” IDF值 = log(250/62.3+1) = 0.603

        “中国” TF-IDF值 = TF * IDF = 0.0121

        同理即可得到剩余词组的TF-IDF值

3、案例

文档内容:(五行代表五篇文章)

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pdinFile = open('task2_1.txt','r')   # 打开文件
corpus = inFile.readlines()   # 读取所有的文章,此时每篇文章内容存放在一行,返回结果是一个列表类型,每单个元素存放一篇文章vectorizer = TfidfVectorizer()   # 建立TF-IDF模型,转为TF-IDF的向量转换对象
tfidf = vectorizer.fit_transform(corpus)  # 传入数据,进行训练,返回包含TF-IDF的向量值,其对应为每个词的TF-IDF值,每个词用坐标表示为行列号,列号为全篇文档词组的排序值
print(tfidf)wordlist = vectorizer.get_feature_names()  # 获取全篇文档的所有的词组,列表形式传出
print(wordlist)df = pd.DataFrame(tfidf.T.todense(),index=wordlist)  # 将上述转换的包含TF-IDF的数据转换为稀疏矩阵,T为转置,todense是将上述的稀疏矩阵转换成密集矩阵,之后将其转变为二维数组,并设置索引值为所有的单词
print(df)for j in range(0,len(corpus)):   # 遍历次数为文档内的文章数量featurelist = df.iloc[:,j].to_list()  # 通过索引号获取每一列的内容,并转换为列表resdict = {}   # 排序以及看输出结果对不对for i in range(0,len(wordlist)):  # 遍历的次数为词组的总数if df.iloc[i,j]!=0:    # 首先对每一列进行处理,对每一列分别取出每一个单词对应的值,判断如果不等于0的情况该怎么办resdict[wordlist[i]] = featurelist[i]  # 对每一列数据取出其TF-IDF的值,将其存入字典,键的值为相对应的词组resdict = sorted(resdict.items(),key=lambda x:x[1],reverse=True)  #使用items将字典转换成包含键值对的元组列表,sortes对可迭代对象进行排序,使用匿名函数指定排序的依据,x[1]表示元组对应的值,reverse=True表示降序print(resdict)
运行结果:

三、处理红楼梦词库

1、导入红楼梦词库

  词库内有如下内容:

用法示例:
jieba.load_userdict(r'.\红楼梦词库.txt')   # 导入本地词库
str = "螯封嫩玉双双满傲世也因同气味把笔悲伤说世途把芳魂消耗把芳魂消耗望家乡"   # 任意设置一个字符串,内容是词云内的数据,用于测试
a = jieba.lcut(sentence=str)   # 字符串进行切分
print(a)

运行结果为:

2、对整篇红楼梦文章进行拆分

红楼梦.txt 文件内容:(其中包含整篇文章)

现需将其中的每一卷内容保存为一个新的文本文件,并且文件命名也是相应卷名

完整代码:
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 '卷 第' in line:   # 判断每一行是否有这个数值juan_name = line.strip()+'.txt'   # 去除带有上述数值的一行数据左右两边的空白字符,比如空格、制表、换行等,并增加了一个后缀txtpath = os.path.join('.\\红楼梦\\分卷\\',juan_name)  # 将文件名和路径拼接起来,得到新文件的完整路径。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文件
juan_file.close()  # 操作完关闭文件
运行结果:

        共120卷

相关文章:

  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承
  • CCF-CSP 2024 --重塑矩阵1,2c语言题解
  • 网络编程9.3
  • 基础学习之——Kubernetes
  • vscode好用的快捷键整理~
  • 基础学习之——Docker Compose的安装和使用
  • 不管夫妻还是情人,想要长相厮守、生活幸福美满,就这两个字!
  • 宁波银行资产规模首超3万亿,高成长性被机构清一色看好
  • 维度不固定的多维数组形参笔记
  • Swift 运算符
  • spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标
  • HarmonyOS 开发范式、应用模型
  • Electron 项目实战 02:打包和自动更新
  • 有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数
  • 数据库课程设计mysql---图书管理系统详细的设计文档和需求文档
  • [deviceone开发]-do_Webview的基本示例
  • 「面试题」如何实现一个圣杯布局?
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS实用技巧
  • HashMap ConcurrentHashMap
  • in typeof instanceof ===这些运算符有什么作用
  • javascript从右向左截取指定位数字符的3种方法
  • java多线程
  • v-if和v-for连用出现的问题
  • 大快搜索数据爬虫技术实例安装教学篇
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 算法-插入排序
  • 详解NodeJs流之一
  • 移动端唤起键盘时取消position:fixed定位
  • ionic异常记录
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云API、SDK和CLI应用实践方案
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (23)Linux的软硬连接
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (剑指Offer)面试题34:丑数
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)软件性能测试
  • .bat批处理(一):@echo off
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @RequestMapping 的作用是什么?
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [20160807][系统设计的三次迭代]
  • [ACP云计算]易混淆知识点(考题总结)
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BUUCTF 2018]Online Tool(特详解)
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [Flink]三、Flink1.13