2021SC@SDUSC
系列文章目录
(四)任务一数据集统计代码分析
目录
前言
回顾前文,我们的任务一如下:
任务一:数据集爬取与统计
- 从百度学术 - 保持学习的态度上爬取至少5000个中文论文摘要、标题和关键词,将爬取到的内容存放到execl表格中或数据库中。
- 需要统计数据集中文档的平均长度、文档中平均关键词的个数、关键词在文中存在比,并补充完整下面表格。
表1数据集描述表
数据集 | 文档总数 | 文档平均长度 | 文档平均关键字个数 | 关键词在文中存在比 |
Baiduxueshu |
系列文章(二)任务一爬虫部分代码分析(上)和(三)任务一爬虫部分代码分析(下)中完成了任务一的前半部分:数据集爬取,本次博客将对数据集进行统计的代码进行分析
一、程序结构
二、使用的python库
import pandas as pd
import jieba
(1)使用了pandas库:
Pandas 是Python的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。
Pandas 适用于处理以下类型的数据:
与 SQL 或 Excel 表类似的,含异构列的表格数据;
有序和无序(非固定频率)的时间序列数据;
带行列标签的矩阵数据,包括同构或异构型数据;
任意其它形式的观测、统计数据集, 数据转入 Pandas
(2)使用了jieba库
Jieba库是优秀的中文分词第三方库,中文文本需要通过分词获得单个的词语。
Jieba库的分词原理:利用一个中文词库,确定汉字之间的关联概率,汉字间概率大的组成词组,形成分词结果。除了分词,用户还可以添加自定义的词组。
Jieba库分词有3种模式
1)精确模式:就是把一段文本精确地切分成若干个中文单词,若干个中文单词之间经过组合,就精确地还原为之前的文本。其中不存在冗余单词。
2)全模式:将一段文本中所有可能的词语都扫描出来,可能有一段文本它可以切分成不同的模式,或者有不同的角度来切分变成不同的词语,在全模式下,Jieba库会将各种不同的组合都挖掘出来。分词后的信息再组合起来会有冗余,不再是原来的文本。
3)搜索引擎模式:在精确模式基础上,对发现的那些长的词语,我们会对它再次切分,进而适合搜索引擎对短词语的索引和搜索。也有冗余。
三、核心代码
总体思路:因为这个代码是为了对数据集进行统计,而之前我们爬取下来的数据已经存放在本地的csv文件中了,在wps中可以很简单的统计数据集中文档总数和文档的平均长度,当然既然已经写了python程序,就顺手写了一下统计这两列的代码,但它肯定称不上核心代码。核心部分在于统计文档中平均关键词的个数以及关键词在文中存在比,这一部分主要使用了3个函数,接下来一一分析其重要部分
(一)def columnOflist(datas, cName):
本函数的作用是读取csv文件的一列,转为list
第一行使用了pandas库的data.loc[index,column]函数,使用.loc[ ]第一个参数是行索引,第二个参数是列索引
info = datas.loc[:, cName]
之后使用.tolist()函数转为list,最后返回即可
info = info.tolist()
(二)def stripWord(info):
本函数的作用是对列表数据进行分词操作并返回一个分词后的list
首先使用jieba库进行分词,jieba分词有三种模式:全模式、精确模式、搜索引擎模式。全模式和精确模式通过jieba.cut实现,搜索引擎模式对应cut_for_search,且三者均可以通过参数HMM决定是否使用新词识别功能。这里使用的是精确模式:
for input in info:
seg_list = jieba.cut(input, cut_all=False)
之后在循环中进行处理
for key in seg_list:
if (len(key.strip()) > 1) and not (key.strip() in wordlist):
wordlist.append(key)
分词成功后返回wordlists
(三)def compare(keylist_0,keylist_1):
本函数主要是对比摘要和关键词中的词,实现计算关键词在文中占比
主要使用了循环来实现
for i in range(0,len(keylist_1)):
num = 0
for key in keylist_0[i]:
if(key in keylist_1[i]):
num+=1
rate=num/len(keylist_0[i])
rates.append(rate)
(四) 最后的main函数负责生成所需数据
if __name__ == "__main__":
cName_0 = 'key_words'# 列名
file="data.csv"
datas_0 = pd.read_csv(file)
inputlist_0 = columnOflist(datas_0, cName_0)
keylist_0 = stripWord(inputlist_0)
#saveCsv(datas_0, cName_0, keylist_0, file)
cName_1 = 'abstract' # 列名
datas_1 = pd.read_csv(file)
inputlist_1 = columnOflist(datas_1, cName_1)
keylist_1 = stripWord(inputlist_1)
#saveCsv(datas_1, cName_1, keylist_1, file)
print("文档总数",len(inputlist_1))
print("文档平均长度",totallength(datas_1, cName_1)/len(inputlist_1))
print("文档平均关键词个数" , total_key(datas_0, cName_0) /len(inputlist_0))
print("关键词在文中存在比", compare(keylist_0, keylist_1))
由程序所示:
文档总数=csv文件行数
文档平均长度=所有摘要长度总和/文档总数
文档平均关键词个数=所有关键词个数/文档总数
关键词在文中占比:
例如数据库有3个文档:
文档1:我爱山东大学的小树林 关键词1:小树林 我
文档2:公司拥有国家计算机信息系统集成一级资质 关键词2:公司 资质
文档3:进一步提升企业核心竞争力 关键词3:企业 竞争力
第一步:分词
文档1:我/爱/山东大学/的/小树林 关键词1:小树林 他
文档2:公司/拥有/国家/计算机/信息系统/集成/一级/资质 关键词2:公司 资质
文档3:进一步/提升/企业/核心/竞争力 关键词3:学校 日历
第二步:统计关键词占比数=关键词在文档中存在的个数/关键词总数
文档1 中,小树林在文中出现了,他没在文中出现,所以关键词存在比为:1/2
文档2 中,公司在文中出现了,资质在文中出现,所以关键词存在比为:2/2
文档3 中,学校没在文中出现了,日历也没在文中出现,所以关键词存在比为:0/2
总的关键词占比为:每一个文档的关键词占比数之和/文档总数
即:(0.5+1+0)/3 = 0.5
四、最终结果
在测试阶段,我将分词结果保存了下来
原数据集
分词后的数据集
统计数据集的程序运行结果,可以看到已经得到表中所有所需数据(这里使用的是存有671条数据的csv文件进行测试)
总结
本篇文章分析了统计任务一数据集的核心代码,至此,任务一这一阶段完成,下一篇博客将会开始下一阶段的任务二