当前位置: 首页 > 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---图书管理系统详细的设计文档和需求文档
  • 【React系列】如何构建React应用程序
  • 【RocksDB】TransactionDB源码分析
  • 2018一半小结一波
  • Angular Elements 及其运作原理
  • Docker下部署自己的LNMP工作环境
  • Intervention/image 图片处理扩展包的安装和使用
  • JAVA之继承和多态
  • Mysql数据库的条件查询语句
  • MySQL用户中的%到底包不包括localhost?
  • 安卓应用性能调试和优化经验分享
  • 测试开发系类之接口自动化测试
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 规范化安全开发 KOA 手脚架
  • 区块链共识机制优缺点对比都是什么
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (11)MSP430F5529 定时器B
  • (day 12)JavaScript学习笔记(数组3)
  • (差分)胡桃爱原石
  • (动态规划)5. 最长回文子串 java解决
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)求1到1亿间的质数或素数
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)四层和七层负载均衡的区别
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net中ListT 泛型转成DataTable、DataSet
  • /tmp目录下出现system-private文件夹解决方法
  • @Autowired和@Resource的区别
  • @Import注解详解
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——