一、SnowNLP是什么
官方源碼文檔是這樣寫的:
SnowNLP是一個python寫的類庫,可以方便的處理中文文本內容,是受到了TextBlob的啟發而寫的,由於現在大部分的自然語言處理庫基本都是針對英文的,於是寫了一個方便處理中文的類庫,並且和TextBlob不同的是,這里沒有用NLTK,所有的算法都是自己實現的,並且自帶了一些訓練好的字典。注意本程序都是處理的unicode編碼,所以使用時請自行decode成unicode。
簡而言之就是:SnowNLP是一個Python寫的類庫,而且是針對中文的自然語言處理庫。
主要功能有:
- 中文分詞(Character-Based Generative Model)
- 詞性標注(TnT 3-gram 隱馬)
- 情感分析(現在訓練數據主要是買賣東西時的評價,所以對其他的一些可能效果不是很好,待解決)
- 文本分類(Naive Bayes)
- 轉換成拼音(Trie樹實現的最大匹配)
- 繁體轉簡體(Trie樹實現的最大匹配)
- 提取文本關鍵詞(TextRank算法)
- 提取文本摘要(TextRank算法)
- tf,idf
- Tokenization(分割成句子)
- 文本相似(BM25)
- 支持python3
二、如何下載
SnowNLP已經加到了開源源碼庫中,所以可以直接用install的方式下載。
pip install snownlp
(用pip3的可以用:pip3 install snownlp)
下載好的源碼包視圖:
三、如何使用
這里僅針對SnowNLP的主要功能例舉幾個簡單的實例,僅供參考。
1、中文分詞
from snownlp import SnowNLP # 中文分詞 text = '希望本無所謂有,也無所謂無,這就像地上的路,其實地上本沒有路,走的人多了,也便成了路。' s = SnowNLP(text) print(s.words)
結果:
['希望', '本', '無所謂', '有', ',', '也', '無所謂', '無', ',', '這', '就', '像地', '上', '的', '路', ',', '其實地', '上本', '沒有', '路', ',', '走', '的', '人', '多', '了', ',', '也', '便', '成', '了', '路', '。']
這個例子也暴露了SnowNLP分詞方面的局限性,SnowNLP的分詞是基於共19484行句子作為語料庫來訓練分詞的,這些句子可能來自不同的幾個方向,但不太全面,所以在某些詞語的分解上有缺陷。個人感覺SnowNLP的分詞沒有jieba分詞和HanLP分詞好用,jieba分詞功能更多,個人傾向於jieba的分詞。
2、詞性標注
from snownlp import SnowNLP # 詞性標注 text = '哪里有天才,我是把別人喝咖啡的工夫都用在了工作上了。' s = SnowNLP(text) print(list(s.tags))
結果:
[('哪里', 'r'), ('有', 'v'), ('天才', 'n'), (',', 'w'), ('我', 'r'), ('是', 'v'), ('把', 'p'), ('別人', 'r'), ('喝', 'v'), ('咖啡', 'n'), ('的', 'u'), ('工夫', 'n'), ('都', 'd'), ('用', 'v'), ('在', 'p'), ('了', 'u'), ('工作', 'vn'), ('上', 'f'), ('了', 'u'), ('。', 'w')]
3、情感分析
from snownlp import SnowNLP # 情感分析 text1 = '這是我遇見的最棒的一家店,種類多,價格低,更喜歡的是服務質量很好' text2 = '這是我遇到的最差的一家店,種類少,價格貴,更氣人的是服務質量很差' s1 = SnowNLP(text1) s2 = SnowNLP(text2) print(s1.sentiments) print(s2.sentiments)
結果:
0.99509716108733 0.0033869983750457466
情感分析的結果是一個小數,越接近1,說明越偏向積極;越接近0,說明越偏向消極。
SnowNLP的情感分析是基於自帶的兩個積極跟消極的語料文件來進行分析的(neg.txt、pos.txt)。這兩個語料文件是某平台的評論留言,主要有關於書本的、酒店的、電腦及配件的幾個方向的評價留言。由於語料文件比較片面,而且其中有些語句意向不准確,導致情感分析在某些場合中效果並不明顯,推薦訓練自己的語料文件。具體方法請看后面詳細講解的SnowNLP情感分析模塊。
4、轉換成拼音
from snownlp import SnowNLP # 轉換成拼音 text = '哪里有天才,我是把別人喝咖啡的工夫都用在了工作上了。' s = SnowNLP(text) print(s.pinyin)
結果:
['na', 'li', 'you', 'tian', 'cai', ',', 'wo', 'shi', 'ba', 'bie', 'ren', 'he', 'ka', 'fei', 'de', 'gong', 'fu', 'dou', 'yong', 'zai', 'liao', 'gong', 'zuo', 'shang', 'liao', '。']
5、繁體轉簡體
from snownlp import SnowNLP # 繁體轉簡體 text = '希望本無所謂有,也無所謂無,這就像地上的路,其實地上本沒有路,走的人多了,也便成了路。' s = SnowNLP(text) print(s.han)
結果:
希望本無所謂有,也無所謂無,這就像地上的路,其實地上本沒有路,走的人多了,也便成了路。
6、提取文本關鍵詞
原理請查看博客:SnowNLP——獲取關鍵詞(keywords(1))
from snownlp import SnowNLP # 提取文本關鍵詞,總結3個關鍵詞 text = '隨着頂層設計完成,全國政協按下信息化建設快進鍵:建設開通全國政協委員移動履職平台,開設主題議政群、全國政協書院等欄目,建設委員履職數據庫,拓展網上委員履職綜合服務功能;建成網絡議政遠程協商視頻會議系統,開展視頻調研、遠程討論活動,增強網絡議政遠程協商實效;建立修訂多項信息化規章制度,優化電子政務網絡。' s = SnowNLP(text) print(s.keywords(3))
結果:
['全國', '政協', '遠程']
7、提取文本摘要
from snownlp import SnowNLP # 提取文本摘要 text = '隨着頂層設計完成,全國政協按下信息化建設快進鍵:建設開通全國政協委員移動履職平台,開設主題議政群、全國政協書院等欄目,建設委員履職數據庫,拓展網上委員履職綜合服務功能;建成網絡議政遠程協商視頻會議系統,開展視頻調研、遠程討論活動,增強網絡議政遠程協商實效;建立修訂多項信息化規章制度,優化電子政務網絡。' s = SnowNLP(text) print(s.summary(2))# 總結兩條摘要
結果:
['全國政協按下信息化建設快進鍵:建設開通全國政協委員移動履職平台', '建成網絡議政遠程協商視頻會議系統']
8、tf,idf
來百度一下是什么意思:TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的常用加權技術。TF是詞頻(Term Frequency),IDF是逆文本頻率指數(Inverse Document Frequency)。
from snownlp import SnowNLP # tf,idf """ TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。 TF詞頻越大越重要,但是文中會的“的”,“你”等無意義詞頻很大,卻信息量幾乎為0,這種情況導致單純看詞頻評價詞語重要性是不准確的。因此加入了idf IDF的主要思想是:如果包含詞條t的文檔越少,也就是n越小,IDF越大,則說明詞條t越重要 TF-IDF綜合起來,才能准確的綜合的評價一詞對文本的重要性。 """ text = [ ['性格', '善良'], ['溫柔', '善良', '善良'], ['溫柔', '善良'], ['好人'], ['性格', '善良'], ] s = SnowNLP(text) print(s.tf) print(s.idf)
結果:
[{'性格': 1, '善良': 1}, {'溫柔': 1, '善良': 2}, {'溫柔': 1, '善良': 1}, {'好人': 1}, {'性格': 1, '善良': 1}] {'性格': 0.33647223662121295, '善良': -1.0986122886681098, '溫柔': 0.33647223662121295, '好人': 1.0986122886681098}
9、Tokenization
from snownlp import SnowNLP # Tokenization(分割句子) text = '希望本無所謂有,也無所謂無,這就像地上的路;其實地上本沒有路;走的人多了!也便成了路。' s = SnowNLP(text) print(s.sentences)
結果:
['希望本無所謂有', '也無所謂無,這就像地上的路', '其實地上本沒有路;走的人多了', '也便成了路']
注意:返回的結果是一個list,sentences是利用非英文語句分割符號來將語句分割開。就是只以中文逗號、中文分號、中文句號、中文感嘆號、中文問號為分割符將語句分割開。
10、文本相似
from snownlp import SnowNLP # 文本相似度(BM25) s = SnowNLP([['機器學習', '人工智能'], ['深度學習', '自然語言處理'], ['數據挖掘']]) artilc1 = ['自然語言處理'] print(s.sim(artilc1))
結果:
[0, 0.4686473612532025, 0]