《人民的名義》---簡單的文本分析

     咱們都知道進行天然語言處理的第一步就是分詞,下面使用jieba模塊對最近比較熱的電視劇《人民的名義》進行分詞,並對它進行一些簡單的文本分析。html

1、jieba模塊中經常使用的方法說明(github):python

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爬蟲,爲了練習一下,在書本網上爬去《人民的名義》,代碼以下:git

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Sun Apr 16 16:24:32 2017
 4 python爬去小說--人民的名義
 5 @author: whb
 6 """
 7 import urllib2 as p
 8 import re
 9 from bs4 import BeautifulSoup
10 #獲得每一個章節的url與標題
11 def find_html(url):
12     html=p.urlopen(url).read() 
13     reg=re.compile(r'<li class="n"><a href="(.*?)">(.*?)</a></li>')
14     cont=re.findall(reg,html) 
15     url=[x[0] for x in cont]
16     name=[x[1] for x in cont]
17     return [name,url]   
18 # 提取小說正文     
19 def search_content(url_list):
20     html=p.urlopen(url_list).read()
21     soup=BeautifulSoup(html)
22     content=soup.find_all('p') 
23     return content
24 #將內容保存文件中。
25 def save_content(url):
26     name,url=find_html(url)
27     for i in xrange(len(url)):
28         try:
29             print u'正在下載:'+str(name[i])
30             f=open(str(name[i])+'.txt','w')
31             url_list='http://www.bookben.com/'+str(url[i])
32             content=search_content(url_list)
33             print dir(content)
34             for x in xrange(len(content)-1):
35                 txt=content[x].string
36                 f.write(txt.encode("gbk",'ignore'))#
37             f.close()
38         except IOError:  
39              print 'open error'+str(name[i])             
40 if __name__=='__main__':
41      url='http://www.bookben.com/read/107_107305/'
42      save_content(url)
python爬去小說--人民的名義

下面使用jieba.cut()方法對小說進行分詞,結果發現一些小說中的名詞的分詞不如願,例如以下:github

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

/侯亮/平/表明/反貪/總局/發出/的/抓捕/令/不能/忽視/,/萬一出/問題/,/責任/在/咱們/省/反貪局/啊/!/季/昌明/卻/堅持/向/省委/副/書記/兼/政法委/書記/高育良/彙報/。算法

緣由在於:在分詞原理是按照最大機率法來分詞,由於單字有必定機率,而「沒有侯亮平,季昌明」等這些名詞不含詞典中,因此會被切割成單字。python爬蟲

提升分詞的精準度的方法:自定義添加詞典:jieba.load_userdict(file_name)ide

注:file_name的格式:1.每一行有三部分組成:1詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。2.file_name 若爲路徑或二進制方式打開的文件,則文件必須爲 UTF-8 編碼(在保存user_dict.txt文件時,另存爲UTF-8編碼格式便可)。3.詞頻省略時使用自動計算的能保證分出該詞的詞頻函數

2、關鍵詞提取的算法

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

3、可視化

1.雲詞圖(使用wordcloud模塊)

     分別使用算法TF-IDF和TextRank,提取權重排名在前200個關鍵字,而後經過wordcloud模塊給出以下兩張雲詞圖。

 

 

 

 

從雲詞圖中從內容上看,這兩張詞條中侯亮平,高育良,李達康,祁同偉等這些詞條都較大,從而說明這些人物的佔戲比例較大,符合小說的實際狀況。咱們也能夠發現使用TEXT-RANK算法分詞的效果彷佛更好一些,但我發現TEXT-RANK所用的時間較長。

相關文章
相關標籤/搜索