咱們都知道進行天然語言處理的第一步就是分詞,下面使用jieba模塊對最近比較熱的電視劇《人民的名義》進行分詞,並對它進行一些簡單的文本分析。html
1、jieba模塊中經常使用的方法說明(github):python
jieba.cut
方法接受三個輸入參數: 須要分詞的字符串;cut_all 參數用來控制是否採用全模式;HMM 參數用來控制是否使用 HMM 模型jieba.cut_for_search
方法接受兩個參數:須要分詞的字符串;是否使用 HMM 模型。該方法適合用於搜索引擎構建倒排索引的分詞,粒度比較細jieba.cut
以及 jieba.cut_for_search
返回的結構都是一個可迭代的 generator,可使用 for 循環來得到分詞後獲得的每個詞語(unicode),或者用jieba.lcut
以及 jieba.lcut_for_search
直接返回 listjieba.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)
下面使用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.詞頻省略時使用自動計算的能保證分出該詞的詞頻函數
基本原理:提取重要的詞條,過濾常見的詞語。TF(team frequency)表示詞頻=(詞語在文章中出現的次數之和)/(文章中的詞語之和);IDF(Inverse document frequency)反文檔頻率=log((語料庫中總文檔之和)/(語料庫中包含該詞語的文檔之和 )).最後它們的乘積爲該詞條的權重。學習
優勢:簡單易實現,但有時精度不高。缺點:不能區分詞條的位置信息,在一篇文章中,有時每每是首段與尾段的權重比中間的詞條權重大一些。沒有反映詞條的分佈狀況。搜索引擎
import jieba.analyse
關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫能夠切換成自定義語料庫的路徑
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)文本語料庫能夠切換成自定義語料庫的路徑
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))
基本思想:
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所用的時間較長。