《人民的名义》—简单的文本分析

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

《人民的名义》—简单的文本分析

我们都知道进行自然语言处理的第一步就是分词,下面使用jieba模块对最近比较热的电视剧《人民的名义》进行分词,并对它进行一些简单的文本分析。

一、jieba模块中常用的方法说明( github ):

1.分词:

  • jieba.cut  方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  • jieba.cut_for_search  方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut  以及  jieba.cut_for_search  返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
  • jieba.lcut  以及  jieba.lcut_for_search  直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT)  新建自定义分词器,可用于同时使用不同词典。 jieba.dt  为默认分词器,所有全局分词相关函数都是该分词器的映射。

最近学习python爬虫,为了练习一下,在 书本网 上爬去《人民的名义》,代码如下:

					# -*- coding: utf-8 -*-
					"""
					Created on Sun Apr 16 16:24:32 2017
					python爬去小说--人民的名义
					@author: whb
					"""
					import urllib2 as p
					import re
					from bs4 import BeautifulSoup
					#得到每个章节的url与标题
					def find_html(url):
					html=p.urlopen(url).read()
					reg=re.compile(r'<li class="n"><a href="(.*?)">(.*?)</a></li>')
					cont=re.findall(reg,html)
					url=[x[0] for x in cont]
					name=[x[1] for x in cont]
					return [name,url]
					# 提取小说正文
					def search_content(url_list):
					html=p.urlopen(url_list).read()
					soup=BeautifulSoup(html)
					content=soup.find_all('p')
					return content
					#将内容保存文件中。
					def save_content(url):
					name,url=find_html(url)
					for i in xrange(len(url)):
					try:
					print u'正在下载:'+str(name[i])
					f=open(str(name[i])+'.txt','w')
					url_list='http://www.bookben.com/'+str(url[i])
					content=search_content(url_list)
					print dir(content)
					for x in xrange(len(content)-1):
					txt=content[x].string
					f.write(txt.encode("gbk",'ignore'))#
					f.close()
					except IOError:
					print 'open error'+str(name[i])
					if __name__=='__main__':
					url='http://www.bookben.com/read/107_107305/'
					save_content(url)
					python爬去小说--人民的名义
				

下面使用jieba.cut()方法对小说进行分词,结果发现一些小说中的名词的分词不如愿,例如如下:

print '/'.join(jieba.cut("str"))

/侯亮/平/代表/反贪/总局/发出/的/抓捕/令/不能/忽视/,/万一出/问题/,/责任/在/我们/省/反贪局/啊/!/季/昌明/却/坚持/向/省委/副/书记/兼/政法委/书记/高育良/汇报/。

原因在于 :在分词原理是按照 最大概率法 来分词,因为单字有一定概率,而“没有侯亮平,季昌明”等这些名词不含词典中,所以会被切割成单字。

提高分词的精准度的方法:自定义添加词典 :jieba.load_userdict(file_name)

注:file_name的格式:1.每一行有三部分组成:1词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。2.file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码(在保存user_dict.txt文件时,另存为UTF-8编码格式即可)。3.词频省略时使用自动计算的能保证分出该词的词频

二、关键词提取的算法

1.基于 TF-IDF 算法

      基本原理: 提取重要的词条,过滤常见的词语。TF(team frequency)表示词频=(词语在文章中出现的次数之和)/(文章中的词语之和);IDF(Inverse document frequency)反文档频率=log((语料库中总文档之和)/(语料库中包含该词语的文档之和 )).最后它们的乘积为该词条的权重。

     优点: 简单易实现,但有时精度不高。 缺点 :不能区分词条的位置信息,在一篇文章中,有时往往是首段与尾段的权重比中间的词条权重大一些。没有反映词条的分布情况。

  import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

  • 用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
  • 							1 content = open(file_name, 'rb').read()
    							2 jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
    							3 tags = jieba.analyse.extract_tags(content, topK=topK)
    							4 print(",".join(tags))
    						

关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

  • 用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
					1 content = open(file_name, 'rb').read()
					2 jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")
					3 jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
					4 tags = jieba.analyse.extract_tags(content, topK=topK)
					5 print(",".join(tags))
				

2.基于 TextRank 算法

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例

基本思想:

  1. 将待抽取关键词的文本进行分词
  2. 词性标注
  3. 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
  4. 计算图中节点的PageRank,注意是无向带权图
					1 import jieba.posseg as pseg
					2 words = pseg.cut("我爱北京天安门")
					3 for word, flag in words:
					4 ...  print('%s %s' % (word, flag))
					5 ...
					6 我 r
					7 爱 v
					8 北京 ns
					9 天安门 ns
				

三、可视化

1.云词图(使用wordcloud模块)

     分别使用算法TF-IDF和TextRank,提取权重排名在前200个关键字,然后通过wordcloud模块给出如下两张云词图。

《人民的名义》—简单的文本分析 《人民的名义》—简单的文本分析

从云词图中从内容上看,这两张词条中侯亮平,高育良,李达康,祁同伟等这些词条都较大,从而说明这些人物的占戏比例较大,符合小说的实际情况。我们也可以发现使用TEXT-RANK算法分词的效果似乎更好一些,但我发现TEXT-RANK所用的时间较长。

转载请注明来自36大数据(36dsj.com): 36大数据 » 《人民的名义》—简单的文本分析

随意打赏

人民的名义全集以人民的名义人民的名义
提交建议
微信扫一扫,分享给好友吧。