项目六 爬虫与数据分析_第1页
项目六 爬虫与数据分析_第2页
项目六 爬虫与数据分析_第3页
项目六 爬虫与数据分析_第4页
项目六 爬虫与数据分析_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目六

爬虫与数据分析通过对本章的学习,了解文本分词的特点,理解文本数据处理方式,理解数据清洗的原理与应用,理解数据分析的基本操作,熟悉Python爬虫的排序算法。了解文本分词的特点。理解文本数据处理方式。理解数据清洗的原理与应用。理解数据分析的基本操作。熟悉Python爬虫的排序算法。随着计算机技术的普及,基于机器语言的文本处理方法开始应用到各个领域。从大量的文本中提取出有用的信息,并结合统计学、计量经济学等学科知识,将这些有用的信息进行进一步组织并挖掘其中的价值,逐渐成为各领域展开研究的一门利器。6.1文本分析

在做文本挖掘的时候,首先要做的预处理就是分词。文本分词是将字符串划分为有意义的单词的过程,如词语、句子或主题等。英文单词天然有空格隔开,容易按照空格分词,但有时候也需要把多个单词做为一个分词,比如“NewYork”等名词,需要做为一个词看待。而中文由于没有空格,分词就是一个需要专门去解决的问题了。在Python中常用的分词包有jieba分词、SnowNLP、THULAC、NLPIR、NLTK等。(1)jieba分词。jieba分词是国内使用人数最多的中文分词工具。该工具可以对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。(2)SnowNLP。SnowNLP是一个Python写的类库,可以方便地处理中文文本内容,该库是受到了TextBlob的启发而写的。SnowNLP的最大特点是容易上手,用其处理中文文本时能够得到不少有意思的结果,但不少功能比较简单,还有待进一步完善。(3)THULAC。THULAC是由清华大学研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。处理文本数据的常用如下方法。(1)去除数字数字在文本分析中一般没有意义,所以在进一步分析前需要去除它们。(2)去除链接地址链接地址也需要在进一步分析前被去掉,可以使用正则表达式达到这个目的。(3)去除停用词停用词是在每个句子中都很常见,但对分析没有意义的词。比如英语中的“is”“but”“shall”“by”,汉语中的“的”“是”“但是”等。语料中的这些词可以通过匹配文本处理程序包中的停用词列表来去除。(4)词干化词干化,指的是将单词的派生形式缩减为其词干的过程,已经有许多词干化的方法。词干化主要使用在英文中,如“programming”“programmer”“programmed”“programmable”等词可以词干化为“program”,目的是将含义相同、形式不同的词归并,方便词频统计。(5)后缀丢弃后缀丢弃算法可以丢弃一个单词的后缀部分。如上文提到的“programming”“programmer”“programmed”“programmable”等词可以词干化为词根“program”,但像“rescuing”“rescue”“rescued”这样的词则被词干化为“rescu”,其并非一个单词或词根,而是将后缀丢弃后得到的形式。(1)jieba的安装为了能够在Python3中显示中文字符,还需要下载安装jieba库,jieba库也是一个Python第三方库,用于中文分词。

安装jieba库的命令如下:pipinstalljieba

在下载并安装jieba库后,在Windows7命令提示符中输入以下命令:importjieba

如果运行没报错,则表示已经成功安装jieba库。jieba涉及的算法包括:基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG);采用了动态规划查找最大概率路径,找出基于词频的最大切分组合;对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。

[例6-1]使用jieba运行精确模式、全模式和搜索引擎模式。代码如下:importjiebaseg_str="好好学习,天天向上。"print("/".join(jieba.lcut(seg_str)))print("/".join(jieba.lcut(seg_str,cut_all=True)))print("/".join(jieba.lcut_for_search(seg_str)))语句含义:print("/".join(jieba.lcut(seg_str))):精确模式,返回一个列表类型的结果print("/".join(jieba.lcut(seg_str,cut_all=True))):全模式,使用'cut_all=True'指定print("/".join(jieba.lcut_for_search(seg_str))):搜索引擎模式运行该例如图6-1所示。[例6-2]使用jieba中的词性标注和关键词提取。代码如下:importjiebaimportjieba.possegaspsegimportjieba.analyseasanlsseg_list=jieba.lcut_for_search("他毕业于重庆大学机电系,后来一直在重庆机电科学研究所工作")print("【返回列表】:{0}".format(seg_list))

语句含义:importjieba.possegaspseg:词性标注importjieba.analyseasanls:关键词提取

运行该例如图6-2所示。[例6-3]使用jieba中的HMM模型。代码如下:importjiebaimportjieba.possegaspsegimportjieba.analyseasanlsseg_list=jieba.cut("他来到了北京天安门")print("【识别新词】:"+"/".join(seg_list))

语句含义如下:importjieba.possegaspseg:词性标注importjieba.analyseasanls:关键词提取seg_list=jieba.cut("他来到了北京天安门"):默认精确模式和启用HMM,jieba.cut返回的结构是一个可迭代的generator,可使用for循环来获得分词后得到的每一个词语。

运行该例如图6-3所示。数据清洗的原理为:利用相应技术方法,如统计方法、数据挖掘方法、模式规则方法等将“脏”数据转换为满足数据质量要求的数据。数据清洗按照实现方式与范围,可分为手工清洗和自动清洗。6.2数据清洗

数据清洗的过程主要包括4个,分别是移除不必要的数据、解决结构性错误问题、筛选不必要的异常值以及处理缺失数据。numpy库是Python做数据处理的底层库,是高性能科学计算和数据分析的基础,比如著名的Python机器学习库SKlearn就需要numPy的支持。掌握numPy的基础数据处理能力是利用Python做数据运算及机器学习的基础。(1)安装numpy库在Windows7下安装Python扩展库,常用pip命令来实现,如输入命令“pipinstall

numpy”安装numpy库。安装完成后,可在Windows命令行中输入“Python”,并在进入Python界面后输入以下命令:import

numpy(2)numpy库的使用①数组的创建与查看在numpy库中创建数组可以使用如下语法:numpy.array该语句表示通过引入numpy库创建了一个ndarray对象。[例6-4]创建数组对象。代码如下:importnumpyasnpa=np.array([1,2,3])print(a)该例首先引入了numpy库,接着定义了一个一维数组a,最后将数组输出显示。运行该程序结果如图6-4所示。[例6-5]创建数组对象并查看属性。代码如下:importnumpyasnpa=np.array([10,20,30])print(a)a.shapea.dtype[例6-6]根据给定维度随机生成[0,1)之间的数据,包含0,不包含1。代码如下:importnumpyasnpa=np.random.rand(3,2)print(a)

该例随机生成的数值均在[0,1),rand(3,2)表示3行2列,运行该程序如图6-6所示。pandas数据清洗pandas是Python下的一个集数据处理、分析、可视化于一身的扩展库,使用pandas可以轻松实现数据分析与数据可视化。(1)安装pandas库在Windows7下安装Python扩展库,常用pip命令来实现,如输入命令“pipinstall

numpy”来安装pandas库。安装完成后,可在Windows命令行中输入Python,并在进入Python界面后输入以下命令:import

pandas(2)pandas库的使用在pandas库有两个最基本的数据类型,分别是Series和DataFrame。其中Series数据类型表示一维数组,与numpy中的一维array类似,并且二者与Python基本的数据结构List也很相近。而DataFrame数据类型则代表二维的表格型数据结构,也可以将DataFrame理解为Series的容器。Series是能够保存任何类型的数据(整数、字符串、浮点数、Python对象等)的一维标记数组,并且每个数据都有自己的索引。在pandas库中仅由一组数据即可创建最简单的Series。DataFrame是一个表格型的数据类型。它含有一组有序的列,每列可以是不同的类型(数值、字符串等)。DataFrame类型既有行索引又有列索引,因此它可以被看作是由Series组成的字典。[例6-13]创建Series。代码如下:importnumpyasnpx=pd.Series([-1,3,5,8])x运行如图6-13所示。[例6-14]创建Series并自定义索引。代码如下:importnumpyasnpx=pd.Series([-1,3,5,8],index=[‘a’,’b’,’c’,’d’])x运行如图6-14所示。[例6-15]使用常数创建一个Series。代码如下:importnumpyasnpx=pd.Series(10,index=[0,1,2,3])x运行如图6-15所示。使用pandas可以轻松实现数据分析与数据可视化。(1)pandas处理csv文件使用pandas处理csv文件的方法主要为read_csv()和to_csv()这两个,其中read_csv()表示读取csv文件的内容并返回DataFrame,to_csv()则是read_csv()的逆过程。

[例6-22]Pandas读取csv文件。在pandas中读取csv文件语法如下:pd.read_csv("filename")

其中,filename表示要读取的csv文件的名称。使用pandas读取该文件,代码如下:importnumpyasnpimportpandasaspddf=pd.read_csv("farequote.csv")print(df.head())print(df.responsetime.describe())该例首先读取了farequote.csv,代码如下:df=pd.read_csv("farequote.csv")显示数据集的前5行内容,代码如下:print(df.head())显示数据集中responsetime的统计结果,代码如下:print(df.responsetime.describe())此外,在读取数据集的时候,还可以查看数据集的特征信息,代码如下:print(())运行如图6-28所示。[例6-23]pandas读取json文件。在Python中如要读取json文件,需要添加json模块,代码如下:json.load(file,encoding=”utf-8”)在这里flie表示要读取的文件名称。该例首先将json数据写入到文件中,再用Python来读取,代码如下:importjsondata=[{'id':'001','name':'owen','score':'85'}]file=open('e:/json/json1.txt','w')json.dump(data,file)file.close()file=open('e:/json/json1.txt')data=json.load(file,encoding="utf-8")print(data)在这里使用json.dump来存储文件,json.load来读取文件,运行如图6-29所示.(3)pandas绘图分析Matplotlib是一个

Python

的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,在使用Matplotlib之前,首先要将Matplotlib安装在系统中。使用Matplotlib库可以绘制各种图形,其中最基本的是线性图形,主要由线条组成。

[例6-24]Matplotlib绘制柱状图。代码如下:importmatplotlib.pyplotaspltfrommatplotlib.font_managerimportFontPropertiesfont_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=15)#导入宋体字体文件x=[0,1,2,3,4,5]y=[1,2,3,2,4,3]plt.bar(x,y)#竖的条形图plt.title("柱状图",FontProperties=font_set);#图标题plt.xlabel("x轴",FontProperties=font_set);plt.ylabel("y轴",FontProperties=font_set);plt.show()该例绘制了6个柱状形状,用函数plt.bar()来实现,其中参数为x,y,该程序运行如图6-30所示。[例6-25]在pandas中使用Series绘制线性图。代码如下:frompandasimportDataFrame,Seriesimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplts=pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))s.plot()plt.show()

该例首先在Python中导入了pandas库、numpy库和Matplotlib库,并引入了来自pandas库的DataFrame以及Series数组,接着将Series对象的索引传给Matplotlib来绘制图形。语句“np.random”表示随机抽样,“np.random.randn(10)”用于返回一组随机数据,该数据具有标准正态分布。“cumsum()”用于返回累加值。语句“np.arange(0,100,10)”用于返回一个有终点和起点的固定步长的排列以显示刻度值,其中0为起点,100为终点,10为步长,运行该例如图6-31所示。[例6-26]pandas绘制散点图检测异常值。首先构造数据集,代码如下:s=pd.DataFrame(np.random.randn(1000)+10,columns=['value'])接着显示数据前几行:s.head()绘制散点图:plt.scatter(s.index,s.values)plt.show()运行结果如图6-32所示,可以观察到图6-32中没有明显的异常值。Matplotlib是Python中用于数据可视化的图形库,该任务绘制的是折线图。快速排序思想如下:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。[例6-22]快速排序。代码如下:defquick_sort(lists,left,right):ifleft>=right:returnlistskey=lists[left]low=lefthigh=rightwhileleft<right:whileleft<rightandlists[right]>=key:right-=1lists[left]=lists[right]whileleft<rightandlists[left]<=key:left+=1lists[right]=lists[left]lists[right]=keyquick_sort(lists,low,left-1)quick_sort(lists,left+1,high)returnlistsarr=[2,645,1,344,546,442,89,99,76,90,25,100]print(quick_sort(arr,0,len(arr)-1))排序结果如下。[1,2,25,76,89,90,99,100,344,442,546,645]6.3Python爬虫排序算法

[例6-23]冒泡排序。代码如下:defbubble_sort(lists):count=len(lists)foriinrange(0,count):forjinrange(i+1,count):iflists[i]>lists[j]:lists[i],lists[j]=lists[j],lists[i]returnlistsarr=[2,645,1,344,546,442,89,99,76,90,100,41]print(bubble_sort(arr))

运行结果如下。[1,2,41,76,89,90,99,100,344,442,546,645][例6-24]选择排序。代码如下:defselect_sort(lists):length=len(lists)foriinrange(0,length):min=iforjinrange(i+1,length):iflists[min]>lists[j]:min=jlists[min],lists[i]=lists[i],lists[min]returnlistsarr=[2,645,1,344,546,442,89,99,76,90,3,45,31]print(select_sort(arr))运行结果如下。[1,2,3,31,45,76,89,90,99,344,442,546,645][例6-25]归并排序。代码如下:defmerge(arr,l,m,r):n1=m-l+1n2=r-m#创建临时数组L=[0]*(n1)R=[0]*(n2)#拷贝数据到临时数组arraysL[]和R[]foriinrange(0,n1):L[i]=arr[l+i]forjinrange(0,n2):R[j]=arr[m+1+j]#归并临时数组到arr[l..r]i=0#初始化第一个子数组的索引

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论