0、前言
在之前的文章【編程課堂】詞雲 wordcloud 中,我們曾使用過 jieba 庫,當時並沒有深入講解,所以本次將其單獨列出來詳細講解。
jieba庫是進行中文分詞的利器,根據文檔描述,具有以下特點:
支持三種分詞模式:
支持繁體分詞
支持自定義詞典
本文立足實際需求,提取出部分常用的功能作為講解,內容包括:
1、分詞中文分詞是 jieba 庫的核心,其下包括常用的 cut() 和 cut_for_search() 函數。
cut() 函數傳入待分詞的字符串,返回一個可迭代的生成器,可使用 for 循環提取或者 list 轉為列表形式。
import jiebastring = '今天天氣特別好,很開心'
result = jieba.cut(string)print(list(result))
結果:
['今天天氣', '特別', '好', ',', '很', '開心']
cut() 函數默認採用精確模式,使用全模式需修改 cut_all 參數為 True
代碼如下:
result = jieba.cut(string,cut_all=True)
結果為:
['今天', '今天天氣', '天天', '天氣', '特別', '好', '', '', '很', '開心']
cut_for_search() 分詞函數採用搜尋引擎模式,該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細,通俗來說就是儘可能多的將字符串分割為有效的詞彙。
示例:
string = '今天天氣'res = jieba.cut(string)res2 = jieba.cut_for_search(string)print('使用cut:',list(res))print('使用cut_for_search:',list(res2))
結果:
使用cut: ['今天天氣']使用cut_for_search: ['今天', '天天', '天氣', '今天天氣']
由於採取了不同的分詞策略,所以最後的結果也不一樣,使用哪個需要根據應用場景來選擇。
2、提取詞彙在處理詞彙時,常常我們會提取出現頻率比較高的關鍵詞,jieba.analyse.extract_tags()具有此功能,它接受 4 個參數
sentence 為待提取的文本
topK 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
withWeight 為是否一併返回關鍵詞權重值,默認值為 False
allowPOS 僅包括指定詞性的詞,默認值為空,即不篩選
我們以西遊記為例,提取出權重佔比最高的前20個詞彙,代碼如下:
from jieba.analyse
import extract_tags
with open('西遊記.txt','r',errors='ignore')as f: data = f.read()res = extract_tags(data)print(res)
結果如下:
['行者', '八戒', '師父', '三藏', '唐僧', '大聖',
'沙僧', '妖精', '菩薩', '和尚', '那怪', '那裡',
'長老', '呆子', '徒弟', '怎麼', '不知', '老孫', '國王', '一個']
修改 topK = 10 得到:
['行者', '八戒', '師父', '三藏', '唐僧',
'大聖', '沙僧', '妖精', '菩薩', '和尚']
修改 withWeight = True 得到:
[('行者', 0.14971032916840787), ('八戒', 0.0684495682590684),
('師父', 0.06131338130166949), ('三藏', 0.05296939997015923),
('唐僧', 0.034778382561747076), ('大聖', 0.032424843415734234),
('沙僧', 0.03158331000220929), ('妖精', 0.027699530179843303),
('菩薩', 0.02576333341504996), ('和尚', 0.02426762372832522)]
jieba 只能返回詞彙的權重,而不能返回該詞出現的頻率,所以在一些特定的應用場景下,比如生成詞雲圖,需要頻數時,使用 jieba.cut() 和 collections 下的 Counter 解決起來更方便,關於 Counter參考:【Counter】
3、搜索詞彙位置jieba 庫也包含了定位詞彙位置的功能,jieba.tokenize() 可以實現此功能,該函數接收字符串,返回一個生成器,包含所有分詞結果以及始末位置,基本用法如下:
import jiebastring = '今天天氣特別好,很開心'
result = jieba.tokenize(string)print(list(result))
結果如下:
[('今天天氣', 0, 4), ('特別', 4, 6), ('好', 6, 7),
(',', 7, 8), ('很', 8, 9), ('開心', 9, 11)]
如果我們只是找到某個特定的詞彙在文中的位置,拿之前的西遊記文本為例,我們去尋找詞彙 「行者」 第一次出現的位置
with open('西遊記.txt','r',errors='ignore')as f: data = f.read()result = jieba.tokenize(data)
for i in result:
if '行者' in i: print(i)
break
結果:
('行者', 8593, 8595)
如此,就能很方便的找到特定詞彙在文章中出現的位置。
4、小結以上就是 jieba 庫的常用的方法,該庫還包括詞性標註、並行分詞、命令行分詞、添加字典等等功能。
更詳細的內容參考官方文檔:https://github.com/fxsjy/jieba
對該庫的算法感興趣的同學可參考
jieba分詞的基本思路:
https://segmentfault.com/a/1190000004061791
對Python中文分詞模塊結巴分詞算法過程的理解和分析:http://blog.csdn.net/rav009/article/details/12196623
近期文章推薦閱讀:
喏,你們要的 PyCharm 快速上手指南
給伸手黨的福利:Python 新手引導
只學2個月編程能寫出什麼代碼?他們表示:You can you code!
如何用100行Python代碼做出魔性聲控遊戲「八分音符醬」
數據分析:當趙雷唱民謠時他唱些什麼?
一行代碼掃出「敬業福」
我扒了杜蕾斯的微博
Python 爬蟲爬取美劇網站
今天,你搶到票了嗎?
爆款遊戲《貪吃蛇大作戰》的 Python 實現
歡迎加入
Crossin的編程教室
crossincode.com
新手入門QQ群:522415386
微信請加 crossin11 留言入群(新手/進階)
請把我們分享給身邊愛學習的小夥伴 :)
點擊左下角「閱讀原文」,查看更多學習資源