python第三方库:使用Jieba对抓取的数据进行中文分词
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明CSDN博客源地址!共同學(xué)習(xí),一起進(jìn)步~ https://blog.csdn.net/Eastmount/article/details/50256163
前面講述了很多關(guān)于Python爬取本體Ontology、消息盒InfoBox、虎撲圖片等例子,同時(shí)講述了VSM向量空間模型的應(yīng)用。但是由于InfoBox沒(méi)有前后文和語(yǔ)義概念,所以效果不是很好,這篇文章主要是爬取百度5A景區(qū)摘要信息,再利用Jieba分詞工具進(jìn)行中文分詞,最后提出文本聚類算法的一些概念知識(shí)。一. Selenium爬取百度百科摘要
簡(jiǎn)單給出Selenium爬取百度百科5A級(jí)景區(qū)的代碼: # coding=utf-8 """ Created on 2015-12-10 @author: Eastmount """ import time import re import os import sys import codecs import shutil from selenium import webdriver from selenium.webdriver.common.keys import Keys import selenium.webdriver.support.ui as ui from selenium.webdriver.common.action_chains import ActionChains #Open PhantomJS driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe") #driver = webdriver.Firefox() wait = ui.WebDriverWait(driver,10)#Get the Content of 5A tourist spots def getInfobox(entityName, fileName): try: #create paths and txt filesprint u'文件名稱: ', fileNameinfo = codecs.open(fileName, 'w', 'utf-8') #locate input notice: 1.visit url by unicode 2.write files#Error: Message: Element not found in the cache -# Perhaps the page has changed since it was looked up#解決方法: 使用Selenium和Phantomjsprint u'實(shí)體名稱: ', entityName.rstrip('\n') driver.get("http://baike.baidu.com/") elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input") elem_inp.send_keys(entityName) elem_inp.send_keys(Keys.RETURN) info.write(entityName.rstrip('\n')+'\r\n') #codecs不支持'\n'換行 #load content 摘要elem_value = driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")for value in elem_value:print value.textinfo.writelines(value.text + '\r\n')#爬取文本信息#爬取所有段落<div class='para'>的內(nèi)容 class='para-title'為標(biāo)題 [省略]time.sleep(2) except Exception,e: #'utf8' codec can't decode byte print "Error: ",e finally: print '\n' info.close() #Main function def main():#By function get informationpath = "BaiduSpider\\"if os.path.isdir(path):shutil.rmtree(path, True)os.makedirs(path)source = open("Tourist_spots_5A_BD.txt", 'r')num = 1for entityName in source: entityName = unicode(entityName, "utf-8") if u'故宮' in entityName: #else add a '?' entityName = u'北京故宮'name = "%04d" % numfileName = path + str(name) + ".txt"getInfobox(entityName, fileName)num = num + 1print 'End Read Files!' source.close() driver.close()if __name__ == '__main__':main()內(nèi)容如下圖所示,共204個(gè)國(guó)家5A級(jí)景點(diǎn)的摘要信息。
二. Jieba中文分詞
Python中分分詞工具很多,包括盤古分詞、Yaha分詞、Jieba分詞等。 中文分詞庫(kù):<http://www.oschina.net/project/tag/264/segment> 其中它們的基本用法都相差不大,但是Yaha分詞不能處理如“黃琉璃瓦頂”或“圜丘壇”等詞,所以使用了結(jié)巴分詞。 **1.安裝及入門介紹** 參考地址:<http://www.oschina.net/p/jieba> 下載地址:<https://pypi.python.org/pypi/jieba/> Python 2.0我推薦使用"pip install jieba"或"easy_install jieba"全自動(dòng)安裝,再通過(guò)import jieba來(lái)引用(第一次import時(shí)需要構(gòu)建Trie樹(shù),需要等待幾秒時(shí)間)。 安裝時(shí)如果出現(xiàn)錯(cuò)誤"unknown encoding: cp65001",輸入"chcp 936"將編碼方式由utf-8變?yōu)楹?jiǎn)體中文gbk。[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-PxIRM34L-1649638502672)(/images/kuxue/fetch/csdn/1537004629.75.jpeg)]
結(jié)巴中文分詞涉及到的算法包括: (1) 基于Trie樹(shù)結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無(wú)環(huán)圖(DAG); (2) 采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合; (3) 對(duì)于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法。 結(jié)巴中文分詞支持的三種分詞模式包括: (1) 精確模式:試圖將句子最精確地切開(kāi),適合文本分析; (2) 全模式:把句子中所有的可以成詞的詞語(yǔ)都掃描出來(lái), 速度非常快,但是不能解決歧義問(wèn)題; (3) 搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。 同時(shí)結(jié)巴分詞支持繁體分詞和自定義字典方法。 #encoding=utf-8 import jieba#全模式 text = "我來(lái)到北京清華大學(xué)" seg_list = jieba.cut(text, cut_all=True) print u"[全模式]: ", "/ ".join(seg_list) #精確模式 seg_list = jieba.cut(text, cut_all=False) print u"[精確模式]: ", "/ ".join(seg_list)#默認(rèn)是精確模式 seg_list = jieba.cut(text) print u"[默認(rèn)模式]: ", "/ ".join(seg_list) #新詞識(shí)別 “杭研”并沒(méi)有在詞典中,但是也被Viterbi算法識(shí)別出來(lái)了 seg_list = jieba.cut("他來(lái)到了網(wǎng)易杭研大廈") print u"[新詞識(shí)別]: ", "/ ".join(seg_list)#搜索引擎模式 seg_list = jieba.cut_for_search(text) print u"[搜索引擎模式]: ", "/ ".join(seg_list)輸出如下圖所示:[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-saeKFnyC-1649638502673)(/images/kuxue/fetch/csdn/1537004631.22.jpeg)]
代碼中函數(shù)簡(jiǎn)單介紹如下: jieba.cut():第一個(gè)參數(shù)為需要分詞的字符串,第二個(gè)cut_all控制是否為全模式。 jieba.cut_for_search():僅一個(gè)參數(shù),為分詞的字符串,該方法適合用于搜索引擎構(gòu)造倒排索引的分詞,粒度比較細(xì)。 其中待分詞的字符串支持gbk\utf-8\unicode格式。返回的結(jié)果是一個(gè)可迭代的generator,可使用for循環(huán)來(lái)獲取分詞后的每個(gè)詞語(yǔ),更推薦使用轉(zhuǎn)換為list列表。 **2.添加自定義詞典** 由于"國(guó)家5A級(jí)景區(qū)"存在很多旅游相關(guān)的專有名詞,舉個(gè)例子:[輸入文本] 故宮的著名景點(diǎn)包括乾清宮、太和殿和黃琉璃瓦等
[精確模式] 故宮/的/著名景點(diǎn)/包括/乾/清宮/、/太和殿/和/黃/琉璃瓦/等
[全 模 式] 故宮/的/著名/著名景點(diǎn)/景點(diǎn)/包括/乾/清宮/太和/太和殿/和/黃/琉璃/琉璃瓦/等
顯然,專有名詞"乾清宮"、“太和殿”、“黃琉璃瓦”(假設(shè)為一個(gè)文物)可能因分詞而分開(kāi),這也是很多分詞工具的又一個(gè)缺陷。但是Jieba分詞支持開(kāi)發(fā)者使用自定定義的詞典,以便包含jieba詞庫(kù)里沒(méi)有的詞語(yǔ)。雖然結(jié)巴有新詞識(shí)別能力,但自行添加新詞可以保證更高的正確率,尤其是專有名詞。
基本用法:jieba.load_userdict(file_name) #file_name為自定義詞典的路徑
詞典格式和dict.txt一樣,一個(gè)詞占一行;每一行分三部分,一部分為詞語(yǔ),另一部分為詞頻,最后為詞性(可省略,ns為地點(diǎn)名詞),用空格隔開(kāi)。
強(qiáng)烈推薦一篇詞性標(biāo)注文章,鏈接如下:
http://www.hankcs.com/nlp/part-of-speech-tagging.html
輸出結(jié)果如下所示,其中專有名詞連在一起,即"乾清宮"和"黃琉璃瓦"。
3.關(guān)鍵詞提取
在構(gòu)建VSM向量空間模型過(guò)程或者把文本轉(zhuǎn)換成數(shù)學(xué)形式計(jì)算中,你需要運(yùn)用到關(guān)鍵詞提取的技術(shù),這里就再補(bǔ)充該內(nèi)容,而其他的如詞性標(biāo)注、并行分詞、獲取詞位置和搜索引擎就不再敘述了。
基本方法:jieba.analyse.extract_tags(sentence, topK)
需要先import jieba.analyse,其中sentence為待提取的文本,topK為返回幾個(gè)TF/IDF權(quán)重最大的關(guān)鍵詞,默認(rèn)值為20。
輸出結(jié)果如下,其中"午門"出現(xiàn)3次、"乾清宮"出現(xiàn)2次、"著名景點(diǎn)"出現(xiàn)1次,按照順序輸出提取的關(guān)鍵詞。如果topK=5,則輸出:“午門 乾清宮 著名景點(diǎn) 太和殿 向陽(yáng)”。
>>> 分詞結(jié)果: 故宮/的/著名景點(diǎn)/包括/乾清宮/、/太和殿/和/午門/等/。/其中/乾清宮/非常/精美/,/午門/是/紫禁城/的/正門/,/午門/居中/向陽(yáng)/。 關(guān)鍵詞: 午門 乾清宮 著名景點(diǎn) >>>4.對(duì)百度百科獲取摘要分詞
從BaiduSpider文件中讀取0001.txt~0204.txt文件,分別進(jìn)行分詞處理再保存。
5.去除停用詞
在信息檢索中,為節(jié)省存儲(chǔ)空間和提高搜索效率,在處理自然語(yǔ)言數(shù)據(jù)(或文本)之前或之后會(huì)自動(dòng)過(guò)濾掉某些字或詞,這些字或詞即被稱為Stop Words(停用詞)。這些停用詞都是人工輸入、非自動(dòng)化生成的,生成后的停用詞會(huì)形成一個(gè)停用詞表。但是,并沒(méi)有一個(gè)明確的停用詞表能夠適用于所有的工具。甚至有一些工具是明確地避免使用停用詞來(lái)支持短語(yǔ)搜索的。[參考百度百科]
三. 基于VSM的文本聚類算法
這部分主要參考2008年上海交通大學(xué)姚清壇等《基于向量空間模型的文本聚類算法》的論文,因?yàn)槲业膶?shí)體對(duì)齊使用InfoBox存在很多問(wèn)題,發(fā)現(xiàn)對(duì)齊中會(huì)用到文本內(nèi)容及聚類算法,所以簡(jiǎn)單講述下文章一些知識(shí)。
文本聚類的主要依據(jù)聚類假設(shè)是:同類的文檔相似度較大,而非同類文檔相似度較小。同時(shí)使用無(wú)監(jiān)督學(xué)習(xí)方法,聚類不需要訓(xùn)練過(guò)程以及不需要預(yù)先對(duì)文檔手工標(biāo)注類別,因此具有較高的靈活性和自動(dòng)化處理能力。主要分為以下部分:
(1) 預(yù)處理常用方法
文本信息預(yù)處理(詞性標(biāo)注、語(yǔ)義標(biāo)注),構(gòu)建統(tǒng)計(jì)詞典,對(duì)文本進(jìn)行詞條切分,完成文本信息的分詞過(guò)程。
(2) 文本信息的特征表示
采用方法包括布爾邏輯型、概率型、混合型和向量空間模型。其中向量空間模型VSM(Vector Space Model)是將文檔映射成向量的形式,(T1, T2, …, Tn)表示文檔詞條,(W1, W2, …, Wn)文檔詞條對(duì)應(yīng)權(quán)重。建立文本特征主要用特征項(xiàng)或詞條來(lái)表示目標(biāo)文本信息,構(gòu)造評(píng)價(jià)函數(shù)來(lái)表示詞條權(quán)重,盡最大限度區(qū)別不同的文檔。
(3) 文本信息特征縮減
VSM文檔特征向量維數(shù)眾多。因此,在文本進(jìn)行聚類之前,應(yīng)用文本信息特征集進(jìn)行縮減,針對(duì)每個(gè)特征詞的權(quán)重排序,選取最佳特征,包括TF-IDF。推薦向量稀疏表示方法,提升聚類的效果,其中(D1, D2, …, Dn)表示權(quán)重不為0的特征詞條。
(4) 文本聚類
文本內(nèi)容表示成數(shù)學(xué)課分析形勢(shì)后,接下來(lái)就是在此數(shù)學(xué)基礎(chǔ)上進(jìn)行文本聚類。包括基于概率方法和基于距離方法。其中基于概率是利用貝葉斯概率理論,概率分布方式;基于聚類是特征向量表示文檔(文檔看成一個(gè)點(diǎn)),通過(guò)計(jì)算點(diǎn)之間的距離,包括層次聚類法和平面劃分法。
總結(jié)
以上是生活随笔為你收集整理的python第三方库:使用Jieba对抓取的数据进行中文分词的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSS的历史与工作原理
- 下一篇: 递归算法经典实例python-pytho