jieba中文分詞

本文編程基於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)) # 保存
相關文章
相關標籤/搜索