一、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]