当前位置:   article > 正文

Python之自然语言处理库snowNLP_python snownlp

python snownlp

一、介绍

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

GitHub - isnowfy/snownlp: Python library for processing Chinese text

二、snowNLP操作详解

2.1 安装

pip install snownlp 

2.2 功能详解

1)中文分词(Character-Based Generative Model)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.words)

2)词性标注(TnT 3-gram 隐马)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. for i in s.tags:
  7. print(i)

3)情感分析(朴素贝叶斯算法)

现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好。

情感分析的结果是一个0~1之间的数字,数字越大表示这句话越偏向于肯定的态度,数字越小表示越偏向于否定的态度。

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.sentiments)

 4)文本分类(Naiv eBayes)

模型训练(若是想要利用新训练的模型进行情感分析,可修改 snownlp/seg/__init__.py 里的data_path指向刚训练好的文件)

  1. #coding:UTF-8
  2. from snownlp import sentiment
  3. if __name__ == "__main__":
  4. # 重新训练模型
  5. sentiment.train('./neg.txt', './pos.txt')
  6. # 保存好新训练的模型
  7. sentiment.save('sentiment.marshal')

5)转换成拼音(Trie树实现的最大匹配)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.pinyin)

6)繁体转简体(Trie树实现的最大匹配)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文學的海洋中,有一部名為《薄霧》的小說,它猶如一顆閃耀的明珠,讓人過目難忘。 這部作品講述了一段發生在上世紀初的跨越階級的愛情故事。 在這篇文學短評中,我們將探討這部小說所展現的情感與人性,以及它在文學史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.han)

7)提取文本关键词(TextRank算法)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.keywords(5))

8)提取文本摘要(TextRank算法)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.summary(5))

10)Tokenization(分割成句子)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. txt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''
  5. s = SnowNLP(txt)
  6. print(s.sentences)

 9)tf(词频),idf(逆文档频率:可以用于tf-idf关键词提取)

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. s = SnowNLP([[u'这篇', u'文章'],
  5. [u'那篇', u'论文'],
  6. [u'这个']])
  7. print("tf:")
  8. print(s.tf)
  9. print("\n")
  10. print("idf:")
  11. print(s.idf)

11)文本相似(BM25)

1. 文本的相似度是通过上面的tf和idf来计算的,这里给出的也是词的相似度分析。

  1. # -*- coding:utf-8 -*-
  2. import sys
  3. from snownlp import SnowNLP
  4. s = SnowNLP([[u'这篇', u'文章'],
  5. [u'那篇', u'论文'],
  6. [u'这个']])
  7. print(s.sim([u'文章']))

2. 用 sklearn库的句子相似度的计算方法,计算 TF 矩阵中两个向量的相似度,实际上就是求解两个向量夹角的余弦值:点乘积除以二者的模长,公式如下

cosθ=a·b/|a|*|b|

  1. from sklearn.feature_extraction.text import CountVectorizer
  2. import numpy as np
  3. from scipy.linalg import norm
  4. def tf_similarity(s1, s2):
  5. def add_space(s):
  6. return ' '.join(s)
  7. # 将字中间加入空格
  8. s1, s2 = add_space(s1), add_space(s2)
  9. # 转化为TF矩阵
  10. cv = CountVectorizer(tokenizer=lambda s: s.split())
  11. corpus = [s1, s2]
  12. vectors = cv.fit_transform(corpus).toarray()
  13. # 计算TF系数
  14. return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))
  15. s1 = '我出生在中国'
  16. s2 = '我生于中国'
  17. print(tf_similarity(s1, s2)) # 结果:0.7302967433402214

2.3 情感分析源码解析

  1. class Sentiment(object):
  2. def __init__(self):
  3. self.classifier = Bayes() # 使用的是Bayes的模型
  4. def save(self, fname, iszip=True):
  5. self.classifier.save(fname, iszip) # 保存最终的模型
  6. def load(self, fname=data_path, iszip=True):
  7. self.classifier.load(fname, iszip) # 加载贝叶斯模型
  8. # 分词以及去停用词的操作
  9. def handle(self, doc):
  10. words = seg.seg(doc) # 分词
  11. words = normal.filter_stop(words) # 去停用词
  12. return words # 返回分词后的结果
  13. def train(self, neg_docs, pos_docs):
  14. data = []
  15. # 读入负样本
  16. for sent in neg_docs:
  17. data.append([self.handle(sent), 'neg'])
  18. # 读入正样本
  19. for sent in pos_docs:
  20. data.append([self.handle(sent), 'pos'])
  21. # 调用的是Bayes模型的训练方法
  22. self.classifier.train(data)
  23. def classify(self, sent):
  24. # 1、调用sentiment类中的handle方法
  25. # 2、调用Bayes类中的classify方法
  26. ret, prob = self.classifier.classify(self.handle(sent)) # 调用贝叶斯中的classify方法
  27. if ret == 'pos':
  28. return prob
  29. return 1-probclass Sentiment(object):
  30. def __init__(self):
  31. self.classifier = Bayes() # 使用的是Bayes的模型
  32. def save(self, fname, iszip=True):
  33. self.classifier.save(fname, iszip) # 保存最终的模型
  34. def load(self, fname=data_path, iszip=True):
  35. self.classifier.load(fname, iszip) # 加载贝叶斯模型
  36. # 分词以及去停用词的操作
  37. def handle(self, doc):
  38. words = seg.seg(doc) # 分词
  39. words = normal.filter_stop(words) # 去停用词
  40. return words # 返回分词后的结果
  41. def train(self, neg_docs, pos_docs):
  42. data = []
  43. # 读入负样本
  44. for sent in neg_docs:
  45. data.append([self.handle(sent), 'neg'])
  46. # 读入正样本
  47. for sent in pos_docs:
  48. data.append([self.handle(sent), 'pos'])
  49. # 调用的是Bayes模型的训练方法
  50. self.classifier.train(data)
  51. def classify(self, sent):
  52. # 1、调用sentiment类中的handle方法
  53. # 2、调用Bayes类中的classify方法
  54. ret, prob = self.classifier.classify(self.handle(sent)) # 调用贝叶斯中的classify方法
  55. if ret == 'pos':
  56. return prob
  57. return 1-prob

从上述的代码中,classify函数和train函数是两个核心的函数,其中,train函数用于训练一个情感分类器,classify函数用于预测。在这两个函数中,都同时使用到的handle函数,handle函数的主要工作为对输入文本分词去停用词。

情感分类的基本模型是贝叶斯模型 Bayes,对于贝叶斯模型,这里就先介绍一下机器学习算法—朴素贝叶斯的公式,详细说明可查看 python版 朴素贝叶斯-基础 - 简书。对于有两个类别c1和c2的分类问题来说,其特征为w1,⋯,wn,特征之间是相互独立的,属于类别c1的贝叶斯模型的基本过程为:

其中: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/347257
推荐阅读
相关标签
  

闽ICP备14008679号