Python中文分词 jieba 十五分钟入门与进阶
文章目錄
- 整體介紹
- 三種分詞模式與一個(gè)參數(shù)
- 關(guān)鍵詞提取
- 中文歧義測(cè)試與去除停用詞
- 三種可以讓分詞更準(zhǔn)確的方法
- 并行計(jì)算
整體介紹
jieba 基于Python的中文分詞工具,安裝使用非常方便,直接pip即可,2/3都可以,功能強(qiáng)悍,博主十分推薦
github:https://github.com/fxsjy/jieba
開源中國(guó)地址:http://www.oschina.net/p/jieba/?fromerr=LRXZzk9z
寫這篇文章花費(fèi)兩個(gè)小時(shí)小時(shí),閱讀需要十五分鐘,讀完本篇文章后您將能上手jieba
下篇博文將介紹將任意中文文本生成中文詞云
同時(shí)如果你希望使用其它分詞工具,那么你可以留意我之后的博客,我會(huì)在接下來的日子里發(fā)布其他有關(guān)內(nèi)容.
三種分詞模式與一個(gè)參數(shù)
以下代碼主要來自于jieba的github,你可以在github下載該源碼
import jiebaseg_list = jieba.cut("我來到北京清華大學(xué)", cut_all=True, HMM=False) print("Full Mode: " + "/ ".join(seg_list)) # 全模式seg_list = jieba.cut("我來到北京清華大學(xué)", cut_all=False, HMM=True) print("Default Mode: " + "/ ".join(seg_list)) # 默認(rèn)模式seg_list = jieba.cut("他來到了網(wǎng)易杭研大廈", HMM=False) print(", ".join(seg_list))seg_list = jieba.cut_for_search("小明碩士畢業(yè)于中國(guó)科學(xué)院計(jì)算所,后在日本京都大學(xué)深造", HMM=False) # 搜索引擎模式 print(", ".join(seg_list))# jieba.cut的默認(rèn)參數(shù)只有三個(gè),jieba源碼如下 # cut(self, sentence, cut_all=False, HMM=True) # 分別為:輸入文本 是否為全模式分詞 與是否開啟HMM進(jìn)行中文分詞關(guān)鍵詞提取
from os import path import jieba.analyse as analysed = path.dirname(__file__)text_path = 'txt/lz.txt' #設(shè)置要分析的文本路徑 text = open(path.join(d, text_path)).read()for key in analyse.extract_tags(text,50, withWeight=False): # 使用jieba.analyse.extract_tags()參數(shù)提取關(guān)鍵字,默認(rèn)參數(shù)為50print key.encode('utf-8')# 設(shè)置輸出編碼為utf-8不然在因?yàn)閣in下控制臺(tái)默認(rèn)中文字符集為gbk,所以會(huì)出現(xiàn)亂碼# 當(dāng)withWeight=True時(shí),將會(huì)返回number類型的一個(gè)權(quán)重值(TF-IDF)運(yùn)行結(jié)果如圖所示,但是同樣的我們也發(fā)現(xiàn)了一些問題,比如:
問題一:
分詞錯(cuò)誤,在運(yùn)行結(jié)果中中"路明非"(龍族男主)被分成了"路明"和"明非"啷個(gè)中文詞語,這是因?yàn)閖ieba的詞庫(kù)中并不含有該詞的原因,同樣的原因以及jieba詞庫(kù)比較老,因而在許多文本分詞時(shí)都會(huì)產(chǎn)生這種情況,而這個(gè)問題我們將在第五個(gè)模塊"三種可以讓分詞更準(zhǔn)確的方法"解決
問題二:
出現(xiàn)非實(shí)意詞語,無論在哪種語言中,都會(huì)存在大量的非實(shí)意單詞,這一類詞云我們需要在進(jìn)行中文分詞時(shí)進(jìn)行去除停用詞,這個(gè)問題將在下一個(gè)模塊中解決
中文歧義測(cè)試與去除停用詞
本段代碼主要來自于《機(jī)器學(xué)習(xí)實(shí)踐指南(第二版))》,其作者為麥好,ps:這是一本好書
找停用詞點(diǎn)這里:多版本中文停用詞詞表 + 多版本英文停用詞詞表 + python詞表合并程序
import jieba TestStr = "2010年底部隊(duì)友誼籃球賽結(jié)束" # 因?yàn)樵跐h語中沒有空格進(jìn)行詞語的分隔,所以經(jīng)常會(huì)出現(xiàn)中文歧義,比如年底-底部-部隊(duì)-隊(duì)友 # jieba 默認(rèn)啟用了HMM(隱馬爾科夫模型)進(jìn)行中文分詞,實(shí)際效果不錯(cuò)seg_list = jieba.cut(TestStr, cut_all=True) print "Full Mode:", "/ ".join(seg_list) # 全模式seg_list = jieba.cut(TestStr, cut_all=False) print "Default Mode:", "/ ".join(seg_list) # 默認(rèn)模式 # 在默認(rèn)模式下有對(duì)中文歧義有較好的分類方式seg_list = jieba.cut_for_search(TestStr) # 搜索引擎模式 print "cut for Search","/".join(seg_list)去除文本中的停用詞
# - * - coding: utf - 8 -*- # # 作者:田豐(FontTian) # 創(chuàng)建時(shí)間:'2017/5/27' # 郵箱:fonttian@163.com # CSDN:http://blog.csdn.net/fontthroneimport sys import jieba from os import pathd = path.dirname(__file__) stopwords_path = 'stopwords\stopwords1893.txt' # 停用詞詞表text_path = 'txt/lz.txt' #設(shè)置要分析的文本路徑 text = open(path.join(d, text_path)).read()def jiebaclearText(text):mywordlist = []seg_list = jieba.cut(text, cut_all=False)liststr="/ ".join(seg_list)f_stop = open(stopwords_path)try:f_stop_text = f_stop.read( )f_stop_text=unicode(f_stop_text,'utf-8')finally:f_stop.close( )f_stop_seg_list=f_stop_text.split('\n')for myword in liststr.split('/'):if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:mywordlist.append(myword)return ''.join(mywordlist)text1 = jiebaclearText(text) print text1三種可以讓分詞更準(zhǔn)確的方法
方案一,在jieba中添加中文詞語:
這種方法可以有效的解決之前龍族男主"路明非"被分為"路明"和"明非"兩個(gè)詞的情況
運(yùn)行效果如下:
方案二,添加自定義詞庫(kù):
下面的代碼主要來自于jieba的github源碼,你可以在github下載該例子
下面這段代碼主要來自于jieba的github,你可以在github下載該源碼
print('='*40) print('添加自定義詞典/調(diào)整詞典') print('-'*40)print('/'.join(jieba.cut('如果放到post中將出錯(cuò)。', HMM=False))) #如果/放到/post/中將/出錯(cuò)/。 # 調(diào)整詞典使 中將 變?yōu)橹?將 print(jieba.suggest_freq(('中', '將'), True)) #494 print('/'.join(jieba.cut('如果放到post中將出錯(cuò)。', HMM=False))) #如果/放到/post/中/將/出錯(cuò)/。 print('/'.join(jieba.cut('「臺(tái)中」正確應(yīng)該不會(huì)被切開', HMM=False))) #「/臺(tái)/中/」/正確/應(yīng)該/不會(huì)/被/切開 print(jieba.suggest_freq('臺(tái)中', True)) print(jieba.suggest_freq('臺(tái)中', True)) #69 # 調(diào)整詞典使 臺(tái)中 不被分詞為臺(tái)/中 print('/'.join(jieba.cut('「臺(tái)中」正確應(yīng)該不會(huì)被切開', HMM=False))) #「/臺(tái)中/」/正確/應(yīng)該/不會(huì)/被/切開并行計(jì)算
下面這段代碼主要來自于jieba的github,你可以在github下載該源碼
原理:將目標(biāo)文本按行分隔后,把各行文本分配到多個(gè)python進(jìn)程并行分詞,然后歸并結(jié)果,從而獲得分詞速度的可觀提升
基于python自帶的multiprocessing模塊,目前暫不支持windows
import sys import time sys.path.append("../../") import jiebajieba.enable_parallel() # 關(guān)閉并行分詞 jieba.enable_parallel(4) # 開啟并行分詞模式,參數(shù)為并行進(jìn)程數(shù) url = sys.argv[1] content = open(url,"rb").read() t1 = time.time() words = "/ ".join(jieba.cut(content))t2 = time.time() tm_cost = t2-t1log_f = open("1.log","wb") log_f.write(words.encode('utf-8'))print('speed %s bytes/second' % (len(content)/tm_cost))實(shí)驗(yàn)結(jié)果:在4核3.4GHz Linux機(jī)器上,對(duì)金庸全集進(jìn)行精確分詞,獲得了1MB/s的速度,是單進(jìn)程版的3.3倍。
總結(jié)
以上是生活随笔為你收集整理的Python中文分词 jieba 十五分钟入门与进阶的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python词云 wordcloud 十
- 下一篇: Python + wordcloud +