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)                                          #绘图

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

参考引用 神级程序员花了三个礼拜来整理的资料!带来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这个词汇,但却被抓取出来。为何会如此呢?是参数问题么?这个有待继续研究。
《python3.6 抓取网页文本并实现词频统计-自然语言处理小项目》

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

    原文作者:大奸猫
    原文地址: https://blog.csdn.net/yeziand01/article/details/80513812
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞