python情感分析:基于jieba的分词及snownlp的情感分析!

Posted Python 集中营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python情感分析:基于jieba的分词及snownlp的情感分析!相关的知识,希望对你有一定的参考价值。

情感分析(sentiment analysis)是2018年公布的计算机科学技术名词。

它可以根据文本内容判断出所代表的含义是积极的还是负面的,也可以用来分析文本中的意思是褒义还是贬义。

一般应用场景就是能用来做电商的大量评论数据的分析,比如好评率或者差评率的统计等等。

我们这里使用到的情感分析的模块是snownlp,为了提高情感分析的准确度选择加入了jieba模块的分词处理。

由于以上的两个python模块都是非标准库,因此我们可以使用pip的方式进行安装。

pip install jieba

pip install snownlp

jieba是一个强大的中文分词处理库,能够满足大多数的中文分词处理,协助snownlp的情感分析。

# Importing the jieba module and renaming it to ja.
import jieba as ja
from snownlp import SnowNLP

# Importing the snownlp module and renaming it to nlp.

为了避免大家使用过程中出现的版本冲突问题,这里将python的内核版本展示出来。

python解释器版本:3.6.8

接下来首先创建一组需要进行情感分的数据源,最后直接分析出该文本代表的是一个积极情绪还是消极情绪。

# Creating a variable called analysis_text and assigning it the value of a string.
analysis_text = '这个实在是太好用了,我非常的喜欢,下次一定还会购买的!'

定义好了需要分析的数据来源语句,然后就是分词处理了。这里说明一下为什么需要分词处理,是因为snownlp这个情感分析模块它的中文分词结果不太标准。

比如说,‘不好看’,这个词如果使用snownlp来直接分词的话大概率的就会分为’不’和’好看’这两个词。

这样的明明是一个带有负面情绪的中文词汇可能就直接被定义为正面情绪了,这也就是为什么这里需要先使用jieba进行分词处理了。

# Using the jieba module to cut the analysis_text into a list of words.
analysis_list = list(ja.cut(analysis_text))

# Printing the list of words that were cut from the analysis_text.
print(analysis_list)

# ['这个', '实在', '是', '太', '好', '用', '了', ',', '我', '非常', '的', '喜欢', ',', '下次', '一定', '还会', '购买', '的', '!']

根据上面分词以后的结果来看,分词的粒度还是比较细致的,每个词都是最多两个字符串的长度。

使用jieba提供的cut()函数,关键词已经分割完成了,接着就是提取主要的关键字。

一般情况下我们做情感分析都会提取形容词类型的关键字,因为形容词能够代表该文本所表现出来的情绪。

# Importing the `posseg` module from the `jieba` module and renaming it to `seg`.
import jieba.posseg as seg

# This is a list comprehension that is creating a list of tuples. Each tuple contains the word and the flag.
analysis_words = [(word.word, word.flag) for word in seg.cut(analysis_text)]

# Printing the list of tuples that were created in the list comprehension.
print(analysis_words)

# [('这个', 'r'), ('实在', 'v'), ('是', 'v'), ('太', 'd'), ('好用', 'v'), ('了', 'ul'), (',', 'x'), ('我', 'r'), ('非常', 'd'), ('的', 'uj'), ('喜欢', 'v'), (',', 'x'), ('下次', 't'), ('一定', 'd'), ('还', 'd'), ('会', 'v'), ('购买', 'v'), ('的', 'uj'), ('!', 'x')]

根据上面的python推导式,将分词以后的关键字和该关键自对应的词性提取出来。

下面是一份jieba模块使用过程中对应的词性表,比如词性标记a代表的就是形容词。

# This is a list comprehension that is creating a list of tuples. Each tuple contains the word and the flag.
keywords = [x for x in analysis_words if x[1] in ['a', 'd', 'v']]

# Printing the list of tuples that were created in the list comprehension.
print(keywords)

# [('实在', 'v'), ('是', 'v'), ('太', 'd'), ('好用', 'v'), ('非常', 'd'), ('喜欢', 'v'), ('一定', 'd'), ('还', 'd'), ('会', 'v'), ('购买', 'v')]

根据关键词的标签提取出关键字以后,这个时候可以将情感标记去除只保留关键字就可以了。

# This is a list comprehension that is creating a list of words.
keywords = [x[0] for x in keywords]

# Printing the list of keywords that were created in the list comprehension.
print(keywords)

# ['实在', '是', '太', '好用', '非常', '喜欢', '一定', '还', '会', '购买']

到现在为至,分词的工作已经处理完了,接下来就是情感分析直接使用snownlp分析出结果。

# Creating a variable called `pos_num` and assigning it the value of 0.
pos_num = 0

# Creating a variable called `neg_num` and assigning it the value of 0.
neg_num = 0

# This is a for loop that is looping through each word in the list of keywords.
for word in keywords:
    # Creating a variable called `sl` and assigning it the value of the `SnowNLP` function.
    sl = SnowNLP(word)
    # This is an if statement that is checking to see if the sentiment of the word is greater than 0.5.
    if sl.sentiments > 0.5:
        # Adding 1 to the value of `pos_num`.
        pos_num = pos_num + 1
    else:
        # Adding 1 to the value of `neg_num`.
        neg_num = neg_num + 1
    # This is printing the word and the sentiment of the word.
    print(word, str(sl.sentiments))

下面就是对原始文本提取关键词以后的每个词的情感分析结果,0-1之间代表情绪越接近于1代表情绪表现的越是积极向上。

# 实在 0.3047790802524796
# 是 0.5262327818078083
# 太 0.34387502381406
# 好用 0.6558628208940429
# 非常 0.5262327818078083
# 喜欢 0.6994590939824207
# 一定 0.5262327818078083
# 还 0.5746682977321914
# 会 0.5539033457249072
# 购买 0.6502590673575129

为了使得关键词的分析结果更加的符合我们的想法也可以对负面和正面的关键词进行统计得到一个结果。

# This is a string that is using the `format` method to insert the value of `pos_num` into the string.
print('正面情绪关键词数量:'.format(pos_num))

# This is a string that is using the `format` method to insert the value of `neg_num` into the string.
print('负面情绪关键词数量:'.format(neg_num))

# This is a string that is using the `format` method to insert the value of `pos_num` divided by the value of `pos_num`
# plus the value of `neg_num` into the string.
print('正面情绪所占比例:'.format(pos_num/(pos_num + neg_num)))

# 正面情绪关键词数量:8
# 负面情绪关键词数量:2
# 正面情绪所占比例:0.8
往期精彩

python数据保存:记录pandas数据分析完成后的轻量级数据保存!
知识记录:python如何通过反射机制处理对象?
如何使用Selenium IDE浏览器插件轻松完成脚本录制,轻松搞定自动化测试!

自然语言处理之中文分词器-jieba分词器详解及python实战

(转https://blog.csdn.net/gzmfxy/article/details/78994396)

中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自然语言处理时,通常需要先进行分词。本文详细介绍现在非常流行的且开源的分词器结巴jieba分词器,并使用python实战介绍。

jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。(这里面很多概念小修之前的文章都有陆续讲过哦)

jieba分词支持三种分词模式:

1. 确模式, 试图将句子最精确地切开,适合文本分析:

2. 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;

3. 搜索引擎模式,在精确模式的基础上,对长词再词切分,提高召回率,适合用于搜索引擎分词。

jiaba分词还支持繁体分词和支持自定义分词

1jieba分词器安装

在python2.x和python3.x均兼容,有以下三种:

1. 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba

2. 半自动安装: 先下载,网址为: http://pypi.python.org/pypi/jieba, 解压后运行: python setup.py install

3. 手动安装: 将jieba目录放置于当前目录或者site-packages目录,

jieba分词可以通过import jieba 来引用

 

2jieba分词主要功能

先介绍主要的使用功能,再展示代码输出。jieba分词的主要功能有如下几种:

1. jieba.cut:该方法接受三个输入参数:需要分词的字符串; cut_all 参数用来控制是否采用全模式;HMM参数用来控制是否适用HMM模型

2. jieba.cut_for_search:该方法接受两个参数:需要分词的字符串;是否使用HMM模型,该方法适用于搜索引擎构建倒排索引的分词,粒度比较细。

3. 待分词的字符串可以是unicode或者UTF-8字符串,GBK字符串。注意不建议直接输入GBK字符串,可能无法预料的误解码成UTF-8,

4. jieba.cut 以及jieba.cut_for_search返回的结构都是可以得到的generator(生成器), 可以使用for循环来获取分词后得到的每一个词语或者使用

5. jieb.lcut 以及 jieba.lcut_for_search 直接返回list

6. jieba.Tokenizer(dictionary=DEFUALT_DICT) 新建自定义分词器,可用于同时使用不同字典,jieba.dt为默认分词器,所有全局分词相关函数都是该分词器的映射。

 

代码演示:

技术分享图片

其中下面的是输出结果。

 

3jieba分词器添加自定义词典

jieba分词器还有一个方便的地方是开发者可以指定自己的自定义词典,以便包含词库中没有的词,虽然jieba分词有新词识别能力,但是自行添加新词可以保证更高的正确率。

使用命令:

jieba.load_userdict(filename) # filename为自定义词典的路径

在使用的时候,词典的格式和jieba分词器本身的分词器中的词典格式必须保持一致,一个词占一行,每一行分成三部分,一部分为词语,一部分为词频,最后为词性(可以省略),用空格隔开。下面其中userdict.txt中的内容为小修添加的词典,而第二部分为小修没有添加字典之后对text文档进行分词得到的结果,第三部分为小修添加字典之后分词的效果。

 

技术分享图片

4利用jieba进行关键词抽取

这里介绍基于TF-IDF算法的关键词抽取(干货|详解自然语言处理之TF-IDF模型和python实现), 只有关键词抽取并且进行词向量化之后,才好进行下一步的文本分析,可以说这一步是自然语言处理技术中文本处理最基础的一步

jieba分词中含有analyse模块,在进行关键词提取时可以使用下列代码

技术分享图片

当然也可以使用基于TextRank算法的关键词抽取:

技术分享图片

这里举一个例子,分别使用两种方法对同一文本进行关键词抽取,并且显示相应的权重值。

技术分享图片

5jieba分词的词性标注

jieba分词还可以进行词性标注,标注句子分词后每个词的词性,采用和ictclas兼容的标记法,这里知识简单的句一个列子。

技术分享图片

6jieba分词并行分词

jieba分词器如果是对于大的文本进行分词会比较慢,因此可以使用jieba自带的并行分词功能进行分词,其采用的原理是将目标文本按照行分割后,把各行文本分配到多个Python进程并行分词,然后归并结果,从而获得分词速度可观的提升。

 

该过程需要基于python自带的multiprocessing模块,而且目前暂时不支持windows. 在使用的时候,只需要在使用jieba分词导入包的时候同时加上下面任意一个命令:

 

技术分享图片

在第五步进行关键词抽取并且计算相应的TF-iDF就可以进行后续的分类或者预测,推荐的相关步骤,后面小修会陆续介绍。

 

参考内容:

[1] jieba分词github介绍文档:https://github.com/fxsjy/jieba

中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自然语言处理时,通常需要先进行分词。本文详细介绍现在非常流行的且开源的分词器结巴jieba分词器,并使用python实战介绍。

jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。(这里面很多概念小修之前的文章都有陆续讲过哦)

jieba分词支持三种分词模式:

1. 确模式, 试图将句子最精确地切开,适合文本分析:

2. 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;

3. 搜索引擎模式,在精确模式的基础上,对长词再词切分,提高召回率,适合用于搜索引擎分词。

jiaba分词还支持繁体分词和支持自定义分词

1jieba分词器安装

在python2.x和python3.x均兼容,有以下三种:

1. 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba

2. 半自动安装: 先下载,网址为: http://pypi.python.org/pypi/jieba, 解压后运行: python setup.py install

3. 手动安装: 将jieba目录放置于当前目录或者site-packages目录,

jieba分词可以通过import jieba 来引用

 

2jieba分词主要功能

先介绍主要的使用功能,再展示代码输出。jieba分词的主要功能有如下几种:

1. jieba.cut:该方法接受三个输入参数:需要分词的字符串; cut_all 参数用来控制是否采用全模式;HMM参数用来控制是否适用HMM模型

2. jieba.cut_for_search:该方法接受两个参数:需要分词的字符串;是否使用HMM模型,该方法适用于搜索引擎构建倒排索引的分词,粒度比较细。

3. 待分词的字符串可以是unicode或者UTF-8字符串,GBK字符串。注意不建议直接输入GBK字符串,可能无法预料的误解码成UTF-8,

4. jieba.cut 以及jieba.cut_for_search返回的结构都是可以得到的generator(生成器), 可以使用for循环来获取分词后得到的每一个词语或者使用

5. jieb.lcut 以及 jieba.lcut_for_search 直接返回list

6. jieba.Tokenizer(dictionary=DEFUALT_DICT) 新建自定义分词器,可用于同时使用不同字典,jieba.dt为默认分词器,所有全局分词相关函数都是该分词器的映射。

 

代码演示:

技术分享图片

其中下面的是输出结果。

 

3jieba分词器添加自定义词典

jieba分词器还有一个方便的地方是开发者可以指定自己的自定义词典,以便包含词库中没有的词,虽然jieba分词有新词识别能力,但是自行添加新词可以保证更高的正确率。

使用命令:

jieba.load_userdict(filename) # filename为自定义词典的路径

在使用的时候,词典的格式和jieba分词器本身的分词器中的词典格式必须保持一致,一个词占一行,每一行分成三部分,一部分为词语,一部分为词频,最后为词性(可以省略),用空格隔开。下面其中userdict.txt中的内容为小修添加的词典,而第二部分为小修没有添加字典之后对text文档进行分词得到的结果,第三部分为小修添加字典之后分词的效果。

 

技术分享图片

4利用jieba进行关键词抽取

这里介绍基于TF-IDF算法的关键词抽取(干货|详解自然语言处理之TF-IDF模型和python实现), 只有关键词抽取并且进行词向量化之后,才好进行下一步的文本分析,可以说这一步是自然语言处理技术中文本处理最基础的一步

jieba分词中含有analyse模块,在进行关键词提取时可以使用下列代码

技术分享图片

当然也可以使用基于TextRank算法的关键词抽取:

技术分享图片

这里举一个例子,分别使用两种方法对同一文本进行关键词抽取,并且显示相应的权重值。

技术分享图片

5jieba分词的词性标注

jieba分词还可以进行词性标注,标注句子分词后每个词的词性,采用和ictclas兼容的标记法,这里知识简单的句一个列子。

技术分享图片

6jieba分词并行分词

jieba分词器如果是对于大的文本进行分词会比较慢,因此可以使用jieba自带的并行分词功能进行分词,其采用的原理是将目标文本按照行分割后,把各行文本分配到多个Python进程并行分词,然后归并结果,从而获得分词速度可观的提升。

 

该过程需要基于python自带的multiprocessing模块,而且目前暂时不支持windows. 在使用的时候,只需要在使用jieba分词导入包的时候同时加上下面任意一个命令:

 

技术分享图片

在第五步进行关键词抽取并且计算相应的TF-iDF就可以进行后续的分类或者预测,推荐的相关步骤,后面小修会陆续介绍。

 

参考内容:

[1] jieba分词github介绍文档:https://github.com/fxsjy/jieba



以上是关于python情感分析:基于jieba的分词及snownlp的情感分析!的主要内容,如果未能解决你的问题,请参考以下文章

浅谈文本分析分词及关系图

jieba分词(R vs. python)

Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析

自然语言处理之中文分词器-jieba分词器详解及python实战

jieba 分词库(python)

jieba分词器(应用及字典的补充)及文档高频词提取实战