天天看點

淺析文本挖掘——jieba子產品的應用

作者:AI小李

一,文本挖掘

1.1 什麼是文本挖掘

  文本挖掘是指從大量文本資料中抽取事先未知的,可了解的,最終可用的知識的過程,同時運用這些知識更好的組織資訊以便将來參考。

  簡單的說,文本挖掘是從大量文本中,比如微網誌評論,知乎評論,淘寶評論等文本資料中抽取出有價值的知識,并利用這些知識創造出價值。

1.2,文本挖掘基本流程

淺析文本挖掘——jieba子產品的應用
  • 收集資料
    • 資料集。如果是已經被人做成資料集了,這就省去了很多麻煩事
    • 抓取。這個是 Python 做得最好的事情,優秀的包有很多,比如 scrapy,beautifulsoup等等。
  • 預處理(對這裡的高品質讨論結果的修改,下面的順序僅限英文)
  1. 去掉抓來的資料中不需要的部分,比如 HTML TAG,隻保留文本。結合 beautifulsoup 和正規表達式就可以了。pattern.web 也有相關功能。
  2. 處理編碼問題。沒錯,即使是英文也需要處理編碼問題!由于 Python2 的曆史原因,不得不在程式設計的時候自己處理。英文也存在 unicode 和 utf-8 轉換的問題,中文以及其他語言就更不用提了。這裡有一個讨論,可以參考,當然網上也有很多方案,找到一個适用于自己的最好。
  3. 将文檔分割成句子。
  4. 将句子分割成詞。專業的叫法是 tokenize。
  5. 拼寫錯誤糾正。pyenchant可以幫你!
  6. POS Tagging。nltk 是不二選擇,還可以使用 pattern。
  7. 去掉标點符号。使用正規表達式就可以。
  8. 去掉長度過小的單詞。len<3 的是通常選擇。
  9. 去掉 non-alpha 詞。同樣,可以用正規表達式完成 \W 就可以。
  10. 轉換成小寫。
  11. 去掉停用詞。Matthew L. Jockers 提供了一份比機器學習和自然語言進行中常用的停詞表更長的停詞表。中文的詞停表 可以參考這個。
  12. lemmatization/stemming。nltk 裡面提供了好多種方式,推薦用 wordnet 的方式,這樣不會出現把詞過分精簡,導緻詞丢掉原型的結果,如果實在不行,也用 snowball 吧,别用 porter,porter 的結果我個人太難接受了,弄出結果之後都根本不知道是啥詞了。MBSP也有相關功能。
  13. 重新去掉長度過小的詞。是的,再來一遍。
  14. 重新去停詞。上面這兩部完全是為了更幹淨。
  15. 到這裡拿到的基本上是非常幹淨的文本了。如果還有進一步需求,還可以根據 POS 的結果繼續選擇某一種或者幾種詞性的詞。

1.3,文本挖掘的應用

  • 基于内容的推薦,例如基于小說内容相似度的小說的推薦
  • 資訊自動分類
  • 資訊自動抽取
  • 自動問答、機器翻譯

二,jieba子產品

  jieba中文分詞:做最好的Python中文分詞元件

2.1,jieba子產品的安裝

安裝在cmd中直接輸入如下内容,即可安裝

pip install jieba           

2.2,檔案結構與解析情況

淺析文本挖掘——jieba子產品的應用

我們可以打開jieba子產品的安裝包,然後注意到上面的圖檔,裡面有一個dict.txt檔案,這個就是jieba子產品的基礎字典,也就是其分詞的基礎,打開字典後有如下圖,分别表示詞語,詞頻,詞性:

淺析文本挖掘——jieba子產品的應用

其中對于詞性的對照具體參考:http://www.360doc.cn/article/597197_346584378.html

2.3,分詞模式

在jieba分詞中支援三種分詞模式(其中預設模式為精準模式)

————2.3.1精準模式:試圖将句子最精确的切開,适合文本分析

import jieba
sentence = "李飛非常喜歡古城西安"
#精準模式
words1 = jieba.cut(sentence,cut_all=False)
for item in words1:
    print(item)
print(words1)
print("----------------------------")           

結果:

李飛
非常
喜歡
古城
西安
  <generator object Tokenizer.cut at 0x000001A006AB2FC0>
    ----------------------------           

————2.3.2全模式:把句子中所有的可能成詞語都掃描出來,速度非常快,但是不能解決歧義

#開啟全模式
words = jieba.cut(sentence,cut_all=True)
for item in words:
    print(item)
print(words)
print("----------------------------")           

結果:

李
飛
非常
喜歡
古城
城西
西安
  <generator object Tokenizer.cut at 0x000001A00697B620>----------------------------           

————2.3.3搜尋引擎模式 :在精準模式的基礎上,對長詞再次切分,提高招呼率,适合用于搜尋引擎分詞

#搜尋引擎模式
words3 = jieba.cut_for_search(sentence)
for item in words3:
    print(item)
print("----------------------------")           

結果:

李飛
非常
喜歡
古城
西安
<generator object Tokenizer.cut at 0x000001A006AB2FC0>
----------------------------           

————預設情況下,支援的是精确模式(下面舉個例子)

#預設的話  是使用精準模式
words4 = jieba.cut(sentence)
for item in words4:
    print(item)
print("----------------------------")           

結果:

李飛
非常
喜歡
古城
西安
<generator object Tokenizer.cut at 0x000001A006AB2FC0>
----------------------------           

2.4,檢視詞性(詞性标注)

常見的詞性如下:
a:形容詞
c:連詞
d:副詞
e:歎詞
f:方位詞
i:成語
m:數詞
n:名詞
nr:人名
ns:地名
nt:機構團體
nz:其他專有名詞
p:介詞
r:代詞
t:時間
u:助詞
v:動詞
vn:名動詞
w:标點符号
un:未知詞語           

下面舉個例子:

print("----------------------------")
sentence2 = "西安交通大學是一個很好的大學"
words6 =jieba.posseg.cut(sentence2)
for item in words6:
    print(item.flag+"---------"+item.word)           

結果:

----------------------------
nt---------西安交通大學
v---------是
m---------一個
a---------很好
uj---------的
n---------大學           

2.5,詞典加載(即自定義添加詞典)

  在分詞過程中我們會遇到一些jieba自帶的詞典中沒有的詞這時候我們需要不斷完善dict.txt中的内容,比如随意構造“仲英學院是一個宿舍的名稱”

  我們在添加字典的時候注意将txtx文檔儲存為utf-8編碼格式,

淺析文本挖掘——jieba子產品的應用

不然會出現錯誤如下:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
raise ValueError('dictionary file %s must be utf-8' % f_name)

ValueError: dictionary file D:\python3\Lib\site-packages\jieba/dict2.txt must be utf-8           

舉個例子

import jieba.posseg

sentences = "仲英學院是一個宿舍的名稱"
print("------------------------------")
words7 =jieba.posseg.cut(sentences)
for item in words7:
    print(item.flag+"---------"+item.word)

jieba.load_userdict("D:\python3\Lib\site-packages\jieba/dict2.txt")
print("------------------------------")
words7 =jieba.posseg.cut(sentences)
for item in words7:
    print(item.flag+"---------"+item.word)           

結果:

nr---------仲英
n---------學院
v---------是
m---------一個
n---------宿舍
uj---------的
n---------名稱
------------------------------
ns---------仲英
n---------學院
v---------是
m---------一個
n---------宿舍
uj---------的
n---------名稱           

2.6,更改詞頻

——2.6.1隻能調高詞頻,不能調低詞頻

格式如下:

add_word(word, freq=None, tag=None)
suggest_freq(segment, tune=True)           

舉個例子:

#更改詞頻
import jieba
sentence8 = "我喜歡上海東方明珠"
words8 = jieba.cut(sentence8)
for item in words8:
    print(item)
print("----------------")
jieba.add_word("上海東方")
words9 = jieba.cut(sentence8)
for item in words9:
    print(item)
print("----------------")
jieba.suggest_freq("上海東方",tune = True)
words10 = jieba.cut(sentence8)
for item in words10:
    print(item)           

結果:

我
喜歡
上海
東方明珠
----------------
我
喜歡
上海
東方明珠
----------------
我
喜歡
上海
東方明珠           

————2.6.2隻能降低詞頻,不能調高詞頻

格式:

del_word(word)
suggest_freq(("segmentPart1","segmentPart2"),True)           

舉個例子:

print("----------------")
jieba.suggest_freq(("東方","明珠"),True)
words11 = jieba.cut(sentence8)
for item in words11:
    print(item)           

結果:

----------------
我
喜歡
上海東方
明珠           

2.7,分詞分析

進一步我們需要對文本資訊進行相關分析,如傳回詞語所在位置、傳回關鍵詞等等。

————2.7.1提取文本中的關鍵詞

其結果是結合文中出現的詞頻與字典中的詞頻進行排序

舉個例子:

import jieba.analyse
sentence8 = "我喜歡上海東方明珠"
sentence9 = "我非常喜歡上海東方明珠"

tag1 = jieba.analyse.extract_tags(sentence8,3)
tag2 = jieba.analyse.extract_tags(sentence9,3)
print(tag1)
print(tag2)           

結果:

['東方明珠', '喜歡', '上海']
['東方明珠', '喜歡', '非常']           

————2.7.2傳回詞語的所在位置

舉個例子:

#傳回詞語的位置
import jieba.analyse

sentence8 = "我喜歡上海東方明珠"
words10 = jieba.tokenize(sentence8)
for item in words10:
    print(item)
words11 = jieba.tokenize(sentence8,mode="search")
for item in words11:
    print(item)           

結果:

('我', 0, 1)
('喜歡', 1, 3)
('上海', 3, 5)
('東方明珠', 5, 9)
----------------
('我', 0, 1)
('喜歡', 1, 3)
('上海', 3, 5)
('東方', 5, 7)
('方明', 6, 8)
('明珠', 7, 9)
('東方明珠', 5, 9)           

傳回的資料格式為:[('詞語',開始位置,結束位置),...,()]

三,實戰

————3.1我們先做一個小例子,分析一下血屍的詞頻

血屍的txt檔案内容我傳到下面:

50年前,長沙镖子嶺。

  四個土夫子正蹲在一個土丘上,所有人都不說話,直勾勾地盯着地上那把洛陽鏟。

  鏟子頭上帶着剛從地下帶出的舊土,離奇的是,這一壞土正不停地向外滲着鮮紅的液體,就像剛剛在血液裡蘸過一樣。http://seputu.com/

  “這下子麻煩大喽。”老煙頭把他的旱煙在地上敲了敲,接着道,“下面是個血屍嘎,弄不好我們這點兒當當,都要撂在下面噢。”

  “下不下去喃?要得要不得,一句話,莫七裡八裡的!”獨眼的小夥子說,“你說你個老人家腿腳不友善,就莫下去了,我和我弟兩個下去,管他什麼東西,直接給他來一梭子。”

  老煙頭不怒反笑,對邊上的一個大胡子說:“你屋裡二伢子海式撩天的,指不定什麼時候就給翻蓋子了,你得多教育教育,咱這買賣,不是有隻匣子炮就能喔荷西天。”

  那大胡子瞪了那年輕人一眼:“你崽子,怎麼這麼跟老太爺講話,老太爺淘土的時候你他媽的還在你娘肚子裡吃屎咧。”

  “我咋說……說錯了,老祖宗不說了嘛,那血屍就是個好東西,下面寶貝肯定不少,不下去,走嘎一爐鍋湯。”

  “你還敢頂嘴!”大胡子舉手就打,被老煙頭用煙槍擋了回去。

  “打不得,你做伢那時候不還是一樣,這叫上梁不正下梁歪!”

  那獨眼的小夥子看他老爸被數落了,低下頭偷笑,老煙頭咳嗽了一聲,又敲了那獨眼的少年一記頭棍:“你笑個啥?碰到血屍,可大可小,上次你二公就是在洛陽挖到這東西,結果現在還瘋瘋癫癫的,都不知道着了什麼道。等一下我先下去,你跟在我後面,二伢子你帶個土耗子殿後,三伢子你就别下去了,四個人都下去,想退都來不及退,你就拉着土耗子的尾巴,我們在裡面一吆喝你就把東西拉出來。”

  年紀最小的那少年不服氣了:“我不依,你們偏心,我告訴我娘去!”

  老煙頭大笑:“你看你看,三伢子還怯不得子了,别鬧,等一下給你摸把金刀刀。”

  “我不要你摸,我自己會摸。”

  那獨眼老二就火了,一把揪住老三的耳朵:“你這雜家夥跟我尋事覓縫啰,招呼老子發寶氣喃?!”

  那年紀最小的少年看樣子平日挨過不少揍,一看他二哥真火了,就吓得不敢吭聲了,直望着他爹求救,怎料他爹已經去收拾家夥去了。他二哥這下得意了:“你何什咯樣不帶愛相啰,這次老頭子也不幫你,你要再吆喝,我擰你個花麻雞吧!”

  老煙頭拍拍老二的肩膀,大叫一聲:“小子們,操家夥啰!”說完一把旋風鏟已經舞開了。

  半個小時候後,盜洞已經打得見不到底了,除了老二不時上來透氣,洞裡連聲音都聽不清楚了,老三等得不耐煩起來,就朝洞裡大叫:“大爺爺,挖穿沒有?”

  隔了有好幾秒,裡面才傳來一陣模糊的聲音:“不……知道,你……待在上面,拉好……好繩子!”

  是他二哥的聲音,然後聽到他那老煙頭咳嗽了一聲:“輕點聲……聽!有動靜!”

  然後就是死一般的沉寂。

  老三知道下面肯定有什麼變故,吓得也不敢說話了,突然他聽到一陣讓人毛骨悚然的咯咯聲,好像蛤蟆叫一樣的從洞裡發出來。

  然後他二哥在下面大吼了一聲:“三伢子,拉!”

  他不敢怠慢,一蹬地猛地拽住土耗子的尾巴,就往外拉,剛拉了幾下,突然下面好像有什麼東西咬住了,竟然有一股反力把繩子向盜洞裡拉去,老三根本沒想過還會有這種情況,差點就被拉到洞裡去,他急中生智,一下子把尾巴綁在自己腰上,然後全身向後倒去,後背幾乎和地面成了30度角,這個是他在村裡和别的男孩子拔河的時候用的招數,這樣一來他的體重就全部吃在繩子上,就算是匹騾子,他也能頂一頂。

  果然,這樣一來他就和洞裡的東西對峙住了,雙方都各自吃力,但是都拉不動分毫,僵持了有十幾秒,就聽到洞裡一聲盒子炮響,然後聽到他爹大叫:“三伢子,快跑!!!!!!”就覺得繩子一松,土耗子嗖一聲從洞裡彈了出來,好像上面還挂了什麼東西!那時候老三也顧不得那麼多了,他知道下面肯定出了事情了,一把接住土耗子,扭頭就跑!

  他一口七跑出有二裡多地,才敢停下來,掏出他懷裡的土耗子一看,吓得大叫了一聲,原來土耗子上勾着一隻血淋淋的斷手。他認得那手的模樣,不由哭了出來,這手是分明是他二哥的。看樣子他二哥就算不死也殘廢了。想到這裡,他不由一咬牙,想回去救他二哥和老爹,剛一回頭,卻看見背後蹲着個血紅血紅的東西,正直勾勾地看着他。

  這老三也不是個二流貨色,平日裡跟着他老爹大浪淘沙,離奇的事情見過不少,知道這地底下的,什麼事情都有可能發生,最重要的不是大驚小怪,而是随機應變,要知道再兇險的鬼也強不過一活人,這什麼黑兇白兇的,也得遵守實體定律,一梭子子彈打過去,打爛了也就沒什麼好怕的了。

  想到這裡,他把心一橫,一邊後退,一邊腰上别着的一支匣子炮已經拽在手裡,開了連發,隻要那血紅的東西有什麼動靜,就先給他劈頭來個暴雨梨花。誰知道這時候那血紅的東西竟然站起來了,老三仔細一看,頓覺得頭皮發麻,胃裡一陣翻騰,那分明是一個被剝了皮的人!混身上下血淋淋的,好像是自己整個兒從人皮裡擠了出來一樣。可是這樣的一個人,竟然還能走動,那真是奇迹了,難道這就是血屍的真面目?

  想着,那血屍一個弓身,突然就撲了過來,一下子老三就和他對上眼了,那血淋淋的臉一下子就貼着他的鼻子,一股酸氣撲面而來,老三順勢向後一倒,同時匣子炮整一梭子子彈全部近距離打在了那東西胸膛上,距離過近,子彈全部都穿了過去,把那東西打的血花四濺,向後退了好幾步。老三心中暗喜,再一回手對準那東西的腦袋就一扣扳機,就聽喀嚓一聲,槍竟然卡殼了!

  這把老匣子炮是當年他二爺爺從一個軍閥墓裡挖出來的,想來也沒用了多少年月,可惜這幾年跟着他爹爹到處跑,也沒工夫保養,平時候開槍的機會也少之又少,誰知道竟然在這節骨眼上卡殼了。那老三也真不簡單,一看槍不好使喚,輪圓了胳膊用吃奶的力氣把槍給砸了過去,也不管砸沒砸到,扭頭就跑。這次他連頭也不敢回,看準前面一顆大樹就奔了過去,尋思着怎麼着它也不會爬樹吧,突然腳下一絆,他一個狗吃屎,整張臉磕在一樹墩上,頓時鼻子嘴巴裡全是血。

  老三狠狠一巴掌拍在地上,心裡那個氣啊,媽的怎麼就這麼背。

  這時候聽到後面風聲響起,知道閻王爺來點名了,心一橫,死就死吧,索性就趴在地上不起來了。沒成想,那具血屍好像沒看到他一樣,竟然從他身上踩了過去,那血淋淋的腳闆馬上在他背後印下一個印子,這血屍出奇的重,一腳下去,老三就覺得嗓子一甜,隻覺膽汁都被像踩吐了出來,而且背上那被踩過地方馬上一陣奇癢,眼前馬上朦胧起來,他馬上意識到自己可能中毒了,而且毒性還非常的猛烈,恍惚間他看到不遠處的地方,他二哥的那隻手裡好像還握着什麼東西。

  他用力眨了眨眼睛,仔細一看,原來是一塊古帛片。他心想,自家二哥拼了命都要帶出來的東西,肯定不是尋常東西,現在又不知道他們怎麼樣了,我好歹得把東西收好,萬一我真的死了,他們找到我的屍體,也能從我身上找得着,那二哥的這隻手也不算白斷了,我也不至于白死。他一邊這麼想着,一邊艱難地爬過去,用力掰開二哥緊握的手把那帛片從掌心裡拿出來,塞進了自己袖子裡。

  這個時候他的耳朵也開始蜂鳴了,眼睛就像蒙了一層紗一樣,手腳都開始涼起來。按他以往的經驗,現在他褲裆裡肯定大小便一大堆,中屍毒的人都死得很難看,他現在最希望的是不要給隔壁村的二丫頭看見自己這個樣子。

  他就這麼混混着胡想,腦子已經不怎麼聽他使喚了,這時候他又開始隐隐約約地聽到他在盜洞口聽到的那種咯咯怪聲。www.seputu.com

  老三隐約覺得一絲不對,剛才和血屍搏鬥了這麼些時候,也沒聽它叫過一聲,現在怎麼又叫起來了?難道剛才的那隻并不是血屍?那剛才看到的又是什麼東西呢?可惜這個時候他已經基本無法做思考了,他條件反射地擡起頭看了一下,隻見一張巨大的怪臉正俯下身子看着他,兩隻沒有瞳孔的眼睛裡空蕩蕩地毫無生氣。           

代碼:

#分析血屍的詞頻
import jieba.analyse

data = open("D:/pycode/血屍.txt").read()
tag = jieba.analyse.extract_tags(data,15)
print(tag)           

結果:

['老三', '二哥', '東西', '伢子', '煙頭', '耗子', '血屍', '洞裡', '下面', '獨眼', '一聲', '聽到', '知道', '下去', '時候']           

————3.2盜墓筆記實戰

代碼:

#盜墓筆記的關鍵詞提取
import jieba.analyse

data = open("D:/pycode/盜墓筆記.TXT").read()
tag = jieba.analyse.extract_tags(data,20)           

然後會出現如下錯誤:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence           

這時候我們對盜墓筆記檔案做如下修改:

淺析文本挖掘——jieba子產品的應用

代碼也做如下操作:

#盜墓筆記的關鍵詞提取
import jieba.analyse

data = open("D:/pycode/盜墓筆記.txt",encoding = 'utf-8').read()
tag = jieba.analyse.extract_tags(data,20)           

這時候就得到如下結果:

['三叔', '我們', '胖子', '油瓶', '潘子', '什麼', '東西', '知道', '這裡', '但是', '沒有', '一個', '看到', '老癢', '事情', '時候', '一下', '感覺', '阿甯', '已經']           

結語

喜歡人工智能學習的小夥伴們,記得點贊關注哦~

繼續閱讀