Python数据分析(4):jieba分词详解
文章目錄
- jieba分詞器
- 1. jieba分詞器的分詞模式說明
- (1)精確模式
- (2)全模式
- (3)搜索引擎模式
- (4)Paddle模式
- 2. jieba分詞器的基本用法
- (1)三種模式案例
- (2)詞性標注
- (3)識別新詞:HMM參數
- (4)搜索引擎模式分詞:cut_for_search()函數
- 3. 調整詞典
- (1)使用自定義詞典:load_userdict()函數
- (2)動態修改詞典:add_word()、del_word()函數
- (3)調節詞頻:suggest_freq()函數
- 4. 關鍵詞提取
- (1)基于TF-IDF算法的關鍵詞提取:extract_tags()函數
- (2)基于TextRank算法的關鍵詞提取:textrank()函數
- 5. 停用詞過濾
- 6. 詞頻統計
前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站:人工智能從入門到精通教程
jieba分詞器
1. jieba分詞器的分詞模式說明
jieba分詞器提供4種分詞模式,并且支持簡體/繁體分詞、自定義詞典、關鍵詞提取、詞性標注。
(1)精確模式
該模式會將句子最精確地切分開,適合在文本分析時使用。
(2)全模式
該模式會將句子中所有成詞的詞語都掃描出來,速度也非常快,缺點是不能解決歧義問題,有歧義的詞語也會被掃描出來。
(3)搜索引擎模式
該模式會在精確模式的基礎上對長詞再進行切分,將更短的詞語切分出來。在搜索引擎中,要求輸入詞語的一部分也能檢索到整個詞語相關的文檔,所以該模式適用于搜索引擎分詞。
(4)Paddle模式
該模式利用PaddlePaddle深度學習框架,訓練序列標注網絡模型實現分詞,同時支持詞性標注。該模式在4.0及以上版本的jieba分詞器中才能使用。使用該模式需要安裝paddlepaddle模塊。
2. jieba分詞器的基本用法
在Python中,可以使用jieba模塊的cut()函數進行分詞,返回結果是一個迭代器。
cut()函數有4個參數:
(1)三種模式案例
設置參數cut_all為True:全分詞
import jieba str1 = '我來到了西北皇家理工學院,發現這兒真不錯' seg_list = jieba.cut(str1, cut_all=True) # 使用全模式進行分詞 生成列表 print('全模式分詞結果:', '/'.join(seg_list)) # /拼接列表元素 全模式分詞結果: 我/來到/了/西北/皇家/理工/理工學/理工學院/工學/工學院/學院/,/發現/這兒/真不/真不錯/不錯設置參數cut_all為False:精確分詞
import jieba str1 = '我來到了西北皇家理工學院,發現這兒真不錯' seg_list = jieba.cut(str1, cut_all=False) # 使用精確模式進行分詞 print('精確模式分詞結果:', '/'.join(seg_list)) 精確式分詞結果: 我/來到/了/西北/皇家/理工學院/,/發現/這兒/真不錯cut_all參數不給定時,默認為false,即精確分詞
import jieba str1 = '我來到了西北皇家理工學院,發現這兒真不錯' seg_list = jieba.cut(str1) print('全模式分詞結果:', '/'.join(seg_list)) 精確模式分詞結果: 我/來到/了/西北/皇家/理工學院/,/發現/這兒/真不錯use_paddle參數可以設置開啟paddle模式
import jieba import paddle str1 = '我來到了西北皇家理工學院,發現這兒真不錯' #jieba.enable_paddle() 已經停用 paddle.enable_static() seg_list = jieba.cut(str1, use_paddle=True) #使用paddle模式進行分詞 print('Paddle模式分詞結果:', '/'.join(seg_list)) Paddle模式分詞結果: 我/來到/了/西北/皇家/理工學院/,/發現/這兒/真不錯(2)詞性標注
import jieba import jieba.posseg as pseg #jieba.enable_paddle() str2 = '上海自來水來自海上' seg_list = pseg.cut(str2, use_paddle=True) #使用posseg進行分詞 for seg, flag in seg_list:print(seg, flag) 上海 ns 自來水 l 來自 v 海上 s(3)識別新詞:HMM參數
HMM參數設置為True,可以識別新詞,即詞典中不存在的詞。
詞典為jieba分詞自帶的字典。
如下:他知
import jieba str3 = '他知科技研發有限公司是一家互聯網行業的公司' seg_list = jieba.cut(str3, HMM=True) #HMM默認為True,所以可以不設置 print('精確模式分詞結果:', '/'.join(seg_list)) 精確模式分詞結果: 他知/科技/研發/有限公司/是/一家/互聯網/行業/的/公司(4)搜索引擎模式分詞:cut_for_search()函數
cut_for_search()函數可以進行搜索引擎模式分詞
該函數只有兩個參數:
3. 調整詞典
用戶也可以自己生成一個自定義詞典,包含jieba分詞自帶字典中沒有的詞語,添加到程序中。比如:
注意:詞頻、詞性可省略。
未加載自定義字典時使用精確切分來進行分詞
import jieba seg_list = jieba.cut('心靈感應般地驀然回首,才能撞見那一低頭的溫柔;也最是那一低頭的溫柔,似一朵水蓮花不勝涼風的嬌羞;也最是那一抹嬌羞,才能讓兩人攜手共白首。') print('未加載自定義詞典時的精確模式分詞結果:\n', '/'.join(seg_list)) 未加載自定義詞典時的精確模式分詞結果:心靈感應/般地/驀然回首/,/才能/撞見/那一/低頭/的/溫柔/;/也/最/是/那/一/低頭/的/溫柔/,/似/一朵/水/蓮花/不勝/涼風/的/嬌羞/;/也/最/是/那/一抹/嬌羞/,/才能/讓/兩人/攜手/共/白首/。(1)使用自定義詞典:load_userdict()函數
load_userdict()函數加載用戶自定義字典
import jieba jieba.load_userdict('用戶詞典.txt') seg_list = jieba.cut('心靈感應般地驀然回首,才能撞見那一低頭的溫柔;也最是那一低頭的溫柔,似一朵水蓮花不勝涼風的嬌羞;也最是那一抹嬌羞,才能讓兩人攜手共白首。') print('加載自定義詞典時的精確模式分詞結果:\n', '/'.join(seg_list)) 加載自定義詞典時的精確模式分詞結果:心靈感應/般地/驀然回首/,/才能/撞見/那/一低頭/的/溫柔/;/也/最/是/那/一低頭/的/溫柔/,/似/一朵/水蓮花/不勝/涼風/的/嬌羞/;/也/最/是/那/一抹/嬌羞/,/才能/讓/兩人/攜手/共/白首/。(2)動態修改詞典:add_word()、del_word()函數
1. 動態添加詞:add_word()
import jieba jieba.load_userdict('用戶詞典.txt') jieba.add_word('最是') #添加詞, 但是不會添加到 用戶字典.txt 文件中 seg_list = jieba.cut('心靈感應般地驀然回首,才能撞見那一低頭的溫柔;也最是那一低頭的溫柔,似一朵水蓮花不勝涼風的嬌羞;也最是那一抹嬌羞,才能讓兩人攜手共白首。') print('添加自定義詞時的精確模式分詞結果:\n', '/'.join(seg_list)) 添加自定義詞時的精確模式分詞結果:心靈感應/般地/驀然回首/,/才能/撞見/那/一低頭/的/溫柔/;/也/最是/那/一低頭/的/溫柔/,/似/一朵/水蓮花/不勝/涼風/的/嬌羞/;/也/最是/那/一抹/嬌羞/,/才能/讓/兩人/攜手/共/白首/。2.動態刪除詞:del_word()
import jieba jieba.load_userdict('用戶詞典.txt') jieba.del_word('一低頭') seg_list = jieba.cut('心靈感應般地驀然回首,才能撞見那一低頭的溫柔;也最是那一低頭的溫柔,似一朵水蓮花不勝涼風的嬌羞;也最是那一抹嬌羞,才能讓兩人攜手共白首。') print('刪除自定義詞時的精確模式分詞結果:\n', '/'.join(seg_list)) 刪除自定義詞時的精確模式分詞結果:心靈感應/般地/驀然回首/,/才能/撞見/那一/低頭/的/溫柔/;/也/最/是/那/一/低頭/的/溫柔/,/似/一朵/水蓮花/不勝/涼風/的/嬌羞/;/也/最/是/那/一抹/嬌羞/,/才能/讓/兩人/攜手/共/白首/。(3)調節詞頻:suggest_freq()函數
不修改詞頻前:
#不修改詞頻 import jieba str3 = '他認為未來幾年健康產業在GDP中將占比第一。' seg_list = jieba.cut(str3) print('精確模式分詞結果:\n', '/'.join(seg_list)) 精確模式分詞結果:他/認為/未來/幾年/健康/產業/在/GDP/中將/占/比/第一/。修改詞頻后:
#修改詞頻 import jieba str3 = '他認為未來幾年健康產業在GDP中將占比第一。' jieba.suggest_freq(('中', '將'), True) #修改詞頻 強制“中將” jieba.suggest_freq('占比', True) #強制讓“占比”作為一次詞 seg_list = jieba.cut(str3, HMM=False) print('精確模式分詞結果:\n', '/'.join(seg_list)) 精確模式分詞結果:他/認為/未來/幾年/健康/產業/在/GDP/中/將/占比/第一/。4. 關鍵詞提取
從文本文件中提取關鍵詞的理論方法主要有兩種:
第一種是有監督的學習方法,該方法將關鍵詞的提取視為一個二分類問題,要么是關鍵詞,要么不是
第二種是無監督的學習方法,該方法對候選詞進行打分,大風范最高的候選詞為關鍵詞
常見的打分算法有TF-IDF和TextRank。
(1)基于TF-IDF算法的關鍵詞提取:extract_tags()函數
extract_tags()函數能基于TF-IDF算法提取關鍵詞
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())該函數有四個參數:
基于TF-IDF算法的關鍵詞提取
# 基于TF-IDF算法的關鍵詞提取 from jieba import analyse text = '記者日前從中國科學院南京地質古生物研究所獲悉,該所早期生命研究團隊與美國學者合作,在中國湖北三峽地區的石板灘生物群中,發現了4種形似樹葉的遠古生物。這些“樹葉”實際上是形態奇特的早期動物,它們生活在遠古海洋底部。相關研究成果已發表在古生物學國際專業期刊《古生物學雜志》上。' keywords = analyse.extract_tags(text, topK=10, withWeight=True, allowPOS=('n', 'v')) print(keywords) [('古生物學', 0.783184303024), ('樹葉', 0.6635900468544), ('生物群', 0.43238540794400004), ('古生物', 0.38124919198039997), ('期刊', 0.36554014868720003), ('石板', 0.34699723913040004), ('形似', 0.3288202017184), ('研究成果', 0.3278758070928), ('團隊', 0.2826627565264), ('獲悉', 0.28072960723920004)](2)基于TextRank算法的關鍵詞提取:textrank()函數
textrank()函數能基于TextRank算法提取關鍵字
jieba.analyse.textrank(sentance, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))兩種方法的區別是默認提取的詞性不同
當然算法不同,結果可能有差異
基于TextRank算法的關鍵詞提取
# 基于TextRank算法的關鍵詞提取 from jieba import analyse text = '記者日前從中國科學院南京地質古生物研究所獲悉,該所早期生命研究團隊與美國學者合作,在中國湖北三峽地區的石板灘生物群中,發現了4種形似樹葉的遠古生物。這些“樹葉”實際上是形態奇特的早期動物,它們生活在遠古海洋底部。相關研究成果已發表在古生物學國際專業期刊《古生物學雜志》上。' keywords = analyse.textrank(text, topK=10, withWeight=True, allowPOS=('n', 'v')) print(keywords) [('古生物學', 1.0), ('樹葉', 0.8797803471074045), ('形似', 0.6765568513591282), ('專業', 0.6684901270801065), ('生物', 0.648692596888148), ('發表', 0.6139083953888275), ('生物群', 0.59981945604977), ('期刊', 0.5651065025924439), ('國際', 0.5642917600351786), ('獲悉', 0.5620719278559326)]5. 停用詞過濾
停用詞:“你”、“我”、“的”、“在”及標點符號等大量出現但非關鍵詞的詞。
我們可以把它們過濾掉
啟動停用詞過濾前:
#未啟動停用詞過濾 import jieba text = '商務部4月23日發布的數據顯示,一季度,全國農產品網絡零售額達936.8億元,增長31.0%;電商直播超過400萬場。電商給農民帶來了新的機遇。' seg_list = jieba.cut(text) print('未啟用停用詞過濾時的分詞結果:\n', '/'.join(seg_list)) 未啟用停用詞過濾時的分詞結果:商務部/4/月/23/日/發布/的/數據/顯示/,/一季度/,/全國/農產品/網絡/零售額/達/936.8/億元/,/增長/31.0%/;/電商/直播/超過/400/萬場/。/電商/給/農民/帶來/了/新/的/機遇/。為了過濾停用詞,需要有一個停用詞詞典。
我們可以自己制作停用詞詞典,停用詞詞典的內容是根據NLP的目的變化的。
如果制作太慢,可以百度下載一個停用詞詞典,稍作修改成自己想要的。如下:
啟動停用詞過濾后:
#啟動停用詞過濾 import jieba with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:stopwords = fp.read().split('\n') #將停用詞詞典的每一行停用詞作為列表中的一個元素 word_list = [] #用于存儲過濾停用詞后的分詞結果 text = '商務部4月23日發布的數據顯示,一季度,全國農產品網絡零售額達936.8億元,增長31.0%;電商直播超過400萬場。電商給農民帶來了新的機遇。' seg_list = jieba.cut(text) for seg in seg_list:if seg not in stopwords:word_list.append(seg) print('啟用停用詞過濾時的分詞結果:\n', '/'.join(word_list)) 啟用停用詞過濾時的分詞結果:商務部/4/月/23/日/發布/數據/顯示/一季度/全國/農產品/網絡/零售額/達/936.8/億元/增長/31.0%/電商/直播/超過/400/萬場/電商/農民/帶來/新/機遇注意:我們根據不同的編碼方式,修改encoding參數
6. 詞頻統計
import jieba text = '蒸饃饃鍋鍋蒸饃饃,饃饃蒸了一鍋鍋,饃饃擱上桌桌,桌桌上面有饃饃。' with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:stopwords = fp.read().split('\n') #加載停用詞 word_dict = {} #用于存儲詞頻統計結果的詞典 jieba.suggest_freq(('桌桌'), True) #讓“桌桌”作為一個詞 seg_list = jieba.cut(text) for seg in seg_list:if seg not in stopwords:if seg in word_dict.keys():word_dict[seg] += 1 #存在則詞頻+1else:word_dict[seg] = 1 #不存在則存入鍵值對 print(word_dict) {'蒸': 3, '饃饃': 5, '鍋鍋': 1, '一鍋': 1, '鍋': 1, '擱': 1, '桌桌': 2, '上面': 1}總結
以上是生活随笔為你收集整理的Python数据分析(4):jieba分词详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桌面级linux推荐,七大顶级桌面比较!
- 下一篇: linux下生成源程序控制流图,Linu