結巴分詞
就是前面說的中文分詞,這里需要介紹的是一個分詞效果較好,使用起來像但方便的Python模塊:結巴。
結巴中文分詞采用的算法
-
基于Trie樹結構實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)
-
采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合
-
對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法
結巴中文分詞支持的分詞模式
目前結巴分詞支持三種分詞模式:
使用方法如下:
# -*- coding:utf-8 -*-import jiebatext = '我來到北京清華大學'
default_mode = jieba.cut(text)full_mode = jieba.cut(text,cut_all=True)search_mode = jieba.cut_for_search(text)print("精確模式:","/".join(default_mode))print("全模式:","/".join(full_mode))print("搜索引擎模式:","/".join(search_mode))
返回的數據如下:
上述代碼解釋:
-
cut方法接受兩個輸入參數: 1) 第一個參數為需要分詞的字符串 2)cut_all參數用來控制是否采用全模式,默認不采用。
-
cut_for_search方法接受一個參數:需要分詞的字符串,該方法適合用于搜索引擎構建倒排索引的分詞,粒度比較細
-
注意:待分詞的字符串可以是gbk字符串、utf-8字符串或者unicode
-
cut以及jieba.cut_for_search返回的結構都是一個可迭代的generator,可以使用for循環來獲得分詞后得到的每一個詞語(unicode),也可以用list(jieba.cut(…))轉化為list
結巴中文分詞的其他功能
1、添加或管理自定義詞典
結巴的所有字典內容存放在dict.txt,你可以不斷的完善dict.txt中的內容。
2、關鍵詞抽取
通過計算分詞后的關鍵詞的TF/IDF權重,來抽取重點關鍵詞。
具體示例:
# -*- coding:utf-8 -*-import jieba.analyse
text = "結巴中文分詞模塊是一個非常好的Python分詞組件"tags = jieba.analyse.extract_tags(text,2)print("關鍵詞抽取:","/".join(tags))
更多信息請查看:https://github.com/fxsjy/jieba/
北大pkuseg
pkuseg簡介
pkuseg是由北京大學語言計算與機器學習研究組研制推出的一套全新的中文分詞工具包。pkuseg具有如下幾個特點:
-
多領域分詞。不同于以往的通用中文分詞工具,此工具包同時致力于為不同領域的數據提供個性化的預訓練模型。根據待分詞文本的領域特點,用戶可以自由地選擇不同的模型。我們目前支持了新聞領域,網絡領域,醫藥領域,旅游領域,以及混合領域的分詞預訓練模型。在使用中,如果用戶明確待分詞的領域,可加載對應的模型進行分詞。如果用戶無法確定具體領域,推薦使用在混合領域上訓練的通用模型。各領域分詞樣例可參考txt。
-
更高的分詞準確率。相比于其他的分詞工具包,當使用相同的訓練數據和測試數據,pkuseg可以取得更高的分詞準確率。
-
支持用戶自訓練模型。支持用戶使用全新的標注數據進行訓練。
-
支持詞性標注。
相關測試結果:
| MSRA | Precision | Recall | F-score |
| jieba | 87.01 | 89.88 | 88.42 |
| THULAC | 95.60 | 95.91 | 95.71 |
| pkuseg | 96.94 | 96.81 | 96.88 |
| WEIBO | Precision | Recall | F-score |
| jieba | 87.79 | 87.54 | 87.66 |
| THULAC | 93.40 | 92.40 | 92.87 |
| pkuseg | 93.78 | 94.65 | 94.21 |
| Default | MSRA | CTB8 | PKU | WEIBO | All Average |
| jieba | 81.45 | 79.58 | 81.83 | 83.56 | 81.61 |
| THULAC | 85.55 | 87.84 | 92.29 | 86.65 | 88.08 |
| pkuseg | 87.29 | 91.77 | 92.68 | 93.43 | 91.29 |
pkuseg的使用
1、使用默認配置進行配置
import pkuseg
seg = pkuseg.pkuseg() # 以默認配置加載模型text = seg.cut('我愛北京天安門') # 進行分詞print(text)
2、使用細分領域分詞(如果用戶明確分詞領域,推薦使用細領域模型分詞)
import pkuseg
seg = pkuseg.pkuseg(model_name='medicine') # 程序會自動下載所對應的細領域模型text = seg.cut('我愛北京天安門') # 進行分詞print(text)
3、分詞同時進行詞性標注,各詞性標簽的詳細含義可參考 tags.txt
import pkuseg
seg = pkuseg.pkuseg(postag=True) # 開啟詞性標注功能text = seg.cut('我愛北京天安門') # 進行分詞和詞性標注print(text)
4、對文件分詞
import pkuseg
# 對input.txt的文件分詞輸出到output.txt中# 開8個進程pkuseg.test('input.txt', 'output.txt', nthread=8)
5、額外使用用戶自定義詞典
import pkuseg
seg = pkuseg.pkuseg(user_dict='my_dict.txt') # 給定用戶詞典為當前目錄下的"my_dict.txt"text = seg.cut('我愛北京天安門') print(text)
模型配置:
pkuseg.pkuseg(model_name = "default", user_dict = "default", postag = False) model_name 模型路徑。 "default",默認參數,表示使用我們預訓練好的混合領域模型(僅對pip下載的用戶)。 "news", 使用新聞領域模型。 "web", 使用網絡領域模型。 "medicine", 使用醫藥領域模型。 "tourism", 使用旅游領域模型。 model_path, 從用戶指定路徑加載模型。 user_dict 設置用戶詞典。 "default", 默認參數,使用我們提供的詞典。 None, 不使用詞典。 dict_path, 在使用默認詞典的同時會額外使用用戶自定義詞典,可以填自己的用戶詞典的路徑,詞典格式為一行一個詞。 postag 是否進行詞性分析。 False, 默認參數,只進行分詞,不進行詞性標注。 True, 會在分詞的同時進行詞性標注。
對文件進行分詞:
pkuseg.test(readFile, outputFile, model_name = "default", user_dict = "default", postag = False, nthread = 10) readFile 輸入文件路徑。 outputFile 輸出文件路徑。 model_name 模型路徑。同pkuseg.pkuseg user_dict 設置用戶詞典。同pkuseg.pkuseg postag 設置是否開啟詞性分析功能。同pkuseg.pkuseg nthread 測試時開的進程數。
模型訓練:
pkuseg.train(trainFile, testFile, savedir, train_iter = 20, init_model = None) trainFile 訓練文件路徑。 testFile 測試文件路徑。 savedir 訓練模型的保存路徑。 train_iter 訓練輪數。 init_model 初始化模型,默認為None表示使用默認初始化,用戶可以填自己想要初始化的模型的路徑如init_model='./models/'。
pkuseg實戰
使用pkuseg 分詞+使用wordcloud顯示詞云:
import pkusegfrom collections import Counterimport pprintfrom wordcloud import WordCloudimport matplotlib.pyplot as plt
with open("data/santisanbuqu_liucixin.txt", encoding="utf-8") as f: content = f.read()
with open("data/CNENstopwords.txt", encoding="utf-8") as f: stopwords = f.read()
lexicon = ['章北海', '汪淼', '葉文潔']seg = pkuseg.pkuseg(user_dict=lexicon)text = seg.cut(content)
new_text = []for w in text: if w not in stopwords: new_text.append(w)counter = Counter(new_text)pprint.pprint(counter.most_common(50))
cut_text = " ".join(new_text)
wordcloud = WordCloud(font_path="font/FZYingXueJW.TTF", background_color="white", width=800, height=600).generate( cut_text)
plt.imshow(wordcloud, interpolation="bilinear")plt.axis("off")plt.show()
參考鏈接:https://github.com/lancopku/pkuseg-python
?
總結
以上是生活随笔為你收集整理的Python自然语言处理工具包推荐的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。