python3.6 抓取网页文本并实现词频统计-自然语言处理小项目

前言
      最近在学习python,看了廖雪峰的入门教程后,想做个小项目来练下手。于是在网上找了一段python 代码。该段代码能实现抓取网页文本,并进行词频分析的功能。
       于是自己对照着一条条敲出来,并且自己添加了注释,最后运行成功时,爽爽滴,看来并不难嘛。
代码
以下代码实现了抓取一个web页面内容,然后对文本内容进行分词统计
备注
相应的python模板要安装好,可参考本博客的另一篇博文https://blog.csdn.net/yeziand01/article/details/80512675

>>> from bs4 import BeautifulSoup
>>> import urllib.request                                                       #使用urllib模块来抓取web页面    
>>> response =urllib.request.urlopen(' http://php.net/')     
>>> html=response.read()                                                    #结果包含许多需要清理的HTML标签
>>> soup = BeautifulSoup(html,"html5lib")                           #BeautifulSoup模块来清洗这样的文字
>>> text=soup.get_text(strip=True)                                      #从抓取的网页中得到了一个干净的文本
>>> tokens = [t for t in text.split()]                                         #将文本转换为tokens
>>> for key,val in freq.items():                                              #以键值的形式打印
...      print(str(key)+':'+str(val))
>>>freq = nltk.FreqDist(tokens)                                              #词频统计
>>> freq.plot(20,cumulative=False)                                        #绘图

可以看到,统计结果是有of,a,an等没价值的单词,这些词都属于停用词,可以用下面的代码剔除。

>>> from nltk.corpus import stopwords                                   #导入语料库中的停用词
>>> stopwords.words('english')                                               #英文停用词
>>> clean_tokens = list()                                                         #创建一个list
>>> sr = stopwords.words('english')                                        #创建停用词列表
>>> for token in tokens:                                                              
... if token not in sr:                                                                  #剔除停用词
... clean_tokens.append(token)                         
>>>freq = nltk.FreqDist(clean_tokens)                                     #词频统计
>>> freq.plot(20,cumulative=False)                                          #绘图


参考引用
神级程序员花了三个礼拜来整理的资料!带来Python NLP入门教程!

https://baijiahao.baidu.com/s?id=1581694569881462392&wfr=spider&for=pcp


续集

     单单是重敲一遍代码,价值还是有限的。为了能修改代码,本菜鸡便一条条来弄懂代码背后的知识点。

>>> from bs4 import BeautifulSoup          #导入 BeautifulSoup模块
知识点:
该模块的库文件夹名称是bs4,安装完后被移入python3的lib库中,所以识别到的库文件就是bs4

>>> import urllib.request                        #导入urllib模块中的request                                   
知识点:导入
     导入=某个模块可用于当前命名空间和当前python解释程序进程 
     有两种方法,import, from   import 。from  import可能会造成命名空间冲突,import不会造成命名空间冲突
from Module import  other        # 直接导入模块中某 类、函数或变量,直接other()就可用
from   Module import *                #导入Module模块中所有'公开'的内容,内容直接可用
import Module                           #导入 Module 模块, 对于模块中的函数,每次调用需要“模块.函数”来用
import Module.other                  #导入Module模块中的某类,函数或变量

>>> response =urllib.request.urlopen(' http://php.net/')       # 使用 urllib模块 request类 urlopen函数 来抓                                                                                            取web页面php.net     
>>> html=response.read()                                                   # 结果包含许多需要清理的HTML标签
知识点:read()方法
read方法可以指定一个参数读取多少,如果不指定的话,会一直读取到文件末尾,也就是一次性读取完。如果再次调用read方法,则什么也读取不到,因为文件指针已经移动到了文件末,没有内容。

>>> soup = BeautifulSoup(html,"html5lib")                        # BeautifulSoup模块来清洗这样的文字
知识点:Beautiful Soup4
Beautiful Soup   是一个可以从   HTML     XML   文件中提取数据的   Python   库;
不仅支持   HTML   解析器,还支持一些第三方的解析器,如, lxml,XML,html5lib   但是需要安装相应的库;
  • 参数1:指出要解析的文档是什么类型,目前支持, html, xml,  html5
  • 参数2:指定使用哪种解析器: 目前支持, lxml, html5lib, 和 html.parser

>>> text=soup.get_text(strip=True)                                     # 从抓取的网页中得到了一个干净的文本
知识点:get_text()
这个方法获取到包含的所有文版内容,strip=True可除去文本前后的空白,并将结果作为 Unicode 字符串返回。

>>> tokens = [t for t in text.split()]                                          # 将文本转换为tokens
知识点:[]  和 split()
[ ]是数据类型-列表
split() 方法通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格、换行(\n)、制表符(\t)等。

>>>freq = nltk.FreqDist(tokens)                                               #词频统计
知识点: FreqDist
nltk库中的函数,接收list后,自动创建字典dict,key是list的元素,value是元素出现的次数

>>> for key,val in freq.items():                                                      #打印key+:+val
...      print(str(key)+':'+str(val))
知识点:for循环
通过for来循环来遍历这个dict的key和value

>>> freq.plot(20,cumulative=False)                                             #绘图
知识点:
matplotlib库 的函数plot()可绘图,20代表x轴绘制的单词个数,cumulative=False表示非累积分布函数

>>> from nltk.corpus import stopwords                                       #导入语料库中的停用词stopwords
>>> clean_tokens = list()                                                              #创建一个空list,存放清洗后的数据
>>> sr = stopwords.words('english')                                             #创建英文停用词列表
>>> for token in tokens:                                                              
... if token not in sr:                                                                       #剔除停用词
... clean_tokens.append(token)                         
>>>freq = nltk.FreqDist(clean_tokens)                                         #词频统计
>>> freq.plot(20,cumulative=False)                                             #重新绘图

进阶
      试验当然不会就模仿,了解就完了。要会修改,迁移才是目标。
      以上抓取的是    http://php.net/,换个格式 http://php.net  ,仍能抓取成功。
      那换个英文网站试下? 抓取:https://www.mysql.com/downloads/。(如下图所示) 得到的结果和观察的有差距,比如说网页上显示MySQL这个词汇应该是最多的,但抓取的结果却是Enterprise最多。而且, 网页上根本没有EditionMySQL这个词汇,但却被抓取出来。为何会如此呢?是参数问题么?这个有待继续研究。


展望
        那中文网站怎么抓取并统计词频?英文的单词能够通过空格来区分,但中文单词并没有空格呀。
于是本项目的下一步就准备研究如何抓取中文网页并实现词频统计。

猜你喜欢

转载自blog.csdn.net/yeziand01/article/details/80513812
今日推荐