首頁 > 軟體

Python基於jieba分詞實現snownlp情感分析

2023-02-01 18:01:19

情感分析(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基於jieba分詞實現snownlp情感分析的詳細內容,更多關於Python snownlp情感分析的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com