本文編程基於python2.7版本python
參考來源:算法
https://blog.csdn.net/qq_34337272/article/details/79554772編程
https://blog.csdn.net/u012052268/article/details/77825981python2.7
1.jieba三種分詞模式以及其應用
jieba提供了三種分詞模式:函數
- 精確模式:試圖將句子最精確地切開,適合文本分析;cut_all=True
- 全模式:把句子中全部能夠成詞的詞語都掃描出來, 速度很是快,可是不能解決歧義;cut_all=False
- 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提升召回率,適合用於搜索引擎分詞。jieba.cut_for_search()
例子代碼:搜索引擎
1 # -*- coding: utf-8 -*- 2 #jieba_分詞 3 #Python join() 方法用於將序列中的元素以指定的字符鏈接生成一個新的字符串。 4 import jieba 5 seg_list = jieba.cut("我來到北京清華大學", cut_all=True) 6 print("Full Mode: " + "/ ".join(seg_list)) # 全模式 7 8 seg_list = jieba.cut("我來到北京清華大學", cut_all=False) 9 print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 10 11 seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式 12 print(", ".join(seg_list)) 13 14 seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造") # 搜索引擎模式 15 print(", ".join(seg_list))
輸出爲結果:編碼
Full Mode: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學雲計算
Default Mode: 我/ 來到/ 北京/ 清華大學
他, 來到, 了, 網易, 杭研, 大廈
小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, ,, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造spa
2.jieba加強功能-加載自定義詞典
2.1 載入新自定義詞典
讀入的txt文件須是utf-8格式。解決方案:txt文件「另存爲」設置編碼格式爲「utf-8」.net
開發者能夠指定本身自定義的詞典,以便包含 jieba 詞庫裏沒有的詞。雖然 jieba 有新詞識別能力,可是自行添加新詞能夠保證更高的正確率
- 用法: jieba.load_userdict(file_name) # file_name 爲文件類對象或自定義詞典的路徑
- 詞典格式和 dict.txt 同樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若爲路徑或二進制方式打開的文件,則文件必須爲 UTF-8 編碼。
- 詞頻省略時使用自動計算的能保證分出該詞的詞頻
例子:
新建詞典2.txt
代碼以下:
# -*- coding: utf-8 -*- #jieba_添加自定義詞典 import jieba jieba.load_userdict("2.txt") print jieba.suggest_freq('雲計算', tune=False) test_sent = "李小福是創新辦主任也是雲計算方面的專家" words = jieba.cut(test_sent) print('/'.join(words))
結果:李小福/是/創新辦/主任/也/是/雲計算/方面/的/專家。
若沒有載入新詞典,則結果是:李小福/是/創新/辦/主任/也/是/雲/計算/方面/的/專家。
調整詞典:使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中動態修改詞典。
代碼:
# -*- coding: utf-8 -*- #jieba_添加自定義詞典 import jieba jieba.add_word('雲計算') jieba.add_word('創新辦') print jieba.suggest_freq('雲計算', tune=False) test_sent = "李小福是創新辦主任也是雲計算方面的專家" words = jieba.cut(test_sent) print('/'.join(words))
結果爲:李小福/是/創新辦/主任/也/是/雲計算/方面/的/專家。
2.2 載入停用詞表
主要思想是分詞事後,遍歷一下停用詞表,去掉停用詞。
解決Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode異常錯誤。加入如下代碼在程序中:
1 import sys 2 reload(sys) 3 sys.setdefaultencoding('utf-8')
代碼:
1 # -*- coding: utf-8 -*- 2 #載入停頓詞 3 4 import sys 5 import jieba 6 # jieba.load_userdict('userdict.txt') 7 # 建立停用詞list 8 def stopwordslist(filepath): 9 #Python strip() 方法用於移除字符串頭尾指定的字符(默認爲空格或換行符)或字符序列。 10 #'r'表示只讀文件 11 #readlines() 方法用於讀取全部行(直到結束符 EOF)並返回列表,該列表能夠由 Python 的 for... in ... 結構進行處理。 12 stopwords = [line.strip() for line in open(filepath, 'r').readlines()] 13 return stopwords 14 15 # 對句子進行分詞 16 def seg_sentence(sentence): 17 sentence_seged = jieba.cut(sentence.strip()) 18 stopwords = stopwordslist('stopword.txt') # 這裏加載停用詞的路徑 19 outstr = '' 20 for word in sentence_seged: 21 if word not in stopwords: 22 if word != '\t': 23 outstr += word 24 outstr += " " 25 return outstr 26 27 inputs = open('input.txt', 'r') 28 #打開一個文件只用於寫入。 29 # 若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。 30 outputs = open('output.txt', 'w') 31 for line in inputs: 32 reload(sys) 33 sys.setdefaultencoding('utf-8') 34 print line 35 line_seg = seg_sentence(line) # 這裏的返回值是字符串 36 outputs.write(line_seg + '\n') 37 outputs.close() 38 inputs.close()
3.jieba分詞的其餘應用
3.1 關鍵詞提取
jieba還實現了TF-IDF和TextRank這兩種關鍵詞提取算法,直接調用便可
代碼以下:
1 # -*- coding: utf-8 -* 2 #關鍵詞提取 3 import jieba.analyse 4 # 字符串前面加u表示使用unicode編碼 5 content = u'中國特點社會主義是咱們黨領導的偉大事業,全面推動黨的建設新的偉大工程,是這一偉大事業取得勝利的關鍵所在。黨堅強有力,事業才能興旺發達,國家才能繁榮穩定,人民才能幸福安康。黨的十八大以來,咱們黨堅持黨要管黨、從嚴治黨,凝心聚力、直擊積弊、扶正祛邪,黨的建設開創新局面,黨風政風呈現新氣象。總書記圍繞從嚴管黨治黨提出一系列新的重要思想,爲全面推動黨的建設新的偉大工程進一步指明瞭方向。' 6 # 第一個參數:待提取關鍵詞的文本 7 # 第二個參數:返回關鍵詞的數量,重要性從高到低排序 8 # 第三個參數:是否同時返回每一個關鍵詞的權重 9 # 第四個參數:詞性過濾,爲空表示不過濾,若提供則僅返回符合詞性要求的關鍵詞 10 keywords = jieba.analyse.extract_tags(content, topK=10, withWeight=True, allowPOS=()) 11 # 訪問提取結果 12 for item in keywords: 13 # 分別爲關鍵詞和相應的權重 14 print item[0], item[1] 15 print"#########"*4 16 17 # 一樣是四個參數,但allowPOS默認爲('ns', 'n', 'vn', 'v') 18 # 即僅提取地名、名詞、動名詞、動詞 19 keywords = jieba.analyse.textrank(content, topK=10, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v')) 20 # 訪問提取結果 21 for item in keywords: 22 # 分別爲關鍵詞和相應的權重 23 print item[0], item[1]
結果以下:
3.2 詞性標註
jieba在進行中文分詞的同時,還能夠完成詞性標註任務。根據分詞結果中每一個詞的詞性,能夠初步實現命名實體識別,即將標註爲nr的詞視爲人名,將標註爲ns的詞視爲地名等。全部標點符號都會被標註爲x,因此能夠根據這個去除分詞結果中的標點符號。
代碼以下:
1 # 加載jieba.posseg並取個別名,方便調用 2 import jieba.posseg as pseg 3 words = pseg.cut("我愛北京天安門") 4 for word, flag in words: 5 # 格式化模版並傳入參數 6 print('%s, %s' % (word, flag))
結果:
我, r
愛, v
北京, ns
天安門, ns
4.用jieba分詞實戰(含文件的讀取與存儲)
1 # -*- coding: utf-8 -*- 2 import jieba 3 import sys 4 import os 5 #用jieba分詞實戰(含文件的讀取與存儲) 6 7 # 保存文件的函數 8 def savefile(savepath,content): 9 reload(sys) 10 sys.setdefaultencoding('utf-8') 11 fp = open(savepath,'w') 12 fp.write(content) 13 fp.close() 14 15 # 讀取文件的函數 16 def readfile(path): 17 fp = open(path, "r") 18 content = fp.read() 19 fp.close() 20 return content 21 22 ## 去除停用詞的2個函數 23 # 建立停用詞list 24 def stopwordslist(filepath): 25 stopwords = [line.strip() for line in open(filepath, 'r').readlines()] 26 return stopwords 27 28 # 對句子去除停用詞 29 def movestopwords(sentence): 30 stopwords = stopwordslist('stopword.txt') # 這裏加載停用詞的路徑 31 outstr = '' 32 for word in sentence: 33 if word not in stopwords: 34 if word != '\t'and'\n': 35 outstr += word 36 # outstr += " " 37 return outstr 38 39 40 corpus_path = "train/" # 未分詞分類預料庫路徑 41 seg_path = "train_seg/" # 分詞後分類語料庫路徑 42 43 catelist = os.listdir(corpus_path) # 獲取未分詞目錄下全部子目錄 44 for mydir in catelist: 45 class_path = corpus_path + mydir + "/" # 拼出分類子目錄的路徑 46 seg_dir = seg_path + mydir + "/" # 拼出分詞後預料分類目錄 47 if not os.path.exists(seg_dir): # 是否存在,不存在則建立 48 os.makedirs(seg_dir) 49 50 file_list = os.listdir(class_path) # 列舉當前目錄全部文件 51 for file_path in file_list: 52 fullname = class_path + file_path # 路徑+文件名 53 print("當前處理的文件是: ",fullname) # 語料/train/pos/pos1.txt 54 # 語料/train/neg/neg1.txt 55 56 content = readfile(fullname).strip() # 讀取文件內容 57 content = content.replace("\n", "").strip() # 刪除換行和多餘的空格 58 content_seg = jieba.cut(content) # jieba分詞 59 print("jieba分詞後:",content_seg) 60 listcontent = '' 61 for i in content_seg: 62 listcontent += i 63 listcontent += " " 64 print(listcontent[0:10]) 65 listcontent = movestopwords(listcontent) # 去除停用詞 66 print("去除停用詞後:", listcontent[0:10]) 67 listcontent = listcontent.replace(" ", " ").replace(" ", " ") 68 savefile(seg_dir + file_path, "".join(listcontent)) # 保存