中文情感分析 - SnowNLP
情感分析(Sentiment analysis,SA),又稱傾向性分析、意見抽取(Opinion extraction)、意見挖掘(Opinion mining)、情感挖掘(Sentiment mining)、主觀分析(Subjectivity analysis)
情感分析是對帶有情感色彩的主觀性文本進(jìn)行分析、處理、歸納和推理的過程
情感分析的目的是為了找出說話者/作者在某些話題上或者針對一個文本兩極觀點(diǎn)的態(tài)度。這個態(tài)度或許是他或她的個人判斷或是評估,也許是他當(dāng)時的情感狀態(tài)(就是說,作者在做出這個言論時的情緒狀態(tài)),或是作者有意向的情感交流(就是作者想要讀者所體驗(yàn)的情緒)
文本情感分析的應(yīng)用非常廣泛,如網(wǎng)絡(luò)輿情風(fēng)險分析,信息預(yù)測等。如通過Twitter用戶情感預(yù)測股票走勢,電影票房、選舉結(jié)果等,均是將公眾情緒與社會事件對比,發(fā)現(xiàn)一致性,并用于預(yù)測
首先安裝SnowNLP中文情感分析庫:
pip install snownlp
SnowNLP(Simplified Chinese Text Processing),是一個python語言編寫的類庫,可以方便的處理中文文本內(nèi)容,其開發(fā)受到了TextBlob的啟發(fā)
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
from snownlp import SnowNLP
數(shù)據(jù)載入
In [2]:
df = pd.read_excel('data/飯店留言數(shù)據(jù).xlsx')
df
Out[2]:
comments | date | |
---|---|---|
0 | 這輩子最愛吃的火鍋,一星期必吃一次啊!最近才知道他家還有免費(fèi)雞蛋羹………………炒雞好吃炒雞嫩... | 2017-05-14 16:00:00 |
1 | 第N次來了,還是喜歡?…… 從還沒上A餐廳的樓梯開始,服務(wù)員已經(jīng)在那迎賓了,然... |
2017-05-10 16:00:00 |
2 | 大姨過生日,姐姐定的這家A餐廳的包間,服務(wù)真的是沒得說,A餐廳的服務(wù)也是讓我由衷的欣賞,很久... | 2017-04-20 16:00:00 |
3 | A餐廳的服務(wù)哪家店都一樣,體貼入微。這家店是我吃過的排隊(duì)最短的一家,當(dāng)然也介于工作日且比較晚... | 2017-04-25 16:00:00 |
4 | 因?yàn)橄挛缫ヌ旖蛘窘尤耍缓笪屹磺皫滋炀驼f想吃A餐廳,然后正好這有,就來這吃了。 來的... |
2017-05-21 16:00:00 |
5 | A餐廳是我們的定點(diǎn)單位,單位大聚小聚都來這,所以享受VIP待遇,來了不用等位。這的菜品新鮮,... | 2017-05-05 16:00:00 |
6 | 這兩天風(fēng)特別大,家里也沒什么可吃的,外賣也不知道吃什么!又懶得出去,發(fā)現(xiàn)好久沒吃火鍋啦!靈機(jī)... | 2017-04-22 16:00:00 |
7 | A餐廳真的是天津每一個店我都來過無數(shù)次了! 今天覺得我拍的圖很好看hhhh于是就來發(fā)條... |
2017-05-20 16:00:00 |
8 | 今天又來到新開路的A餐廳,食材還是非常新鮮,羔羊肉味道鮮美,墨魚滑味道新鮮!我們一家三口吃的... | 2017-05-12 16:00:00 |
9 | 服務(wù)態(tài)度一如既往的好,看我東西多,主動幫忙提東西,所有的服務(wù)員都主動打招呼,非常熱情。我點(diǎn)的... | 2017-05-07 16:00:00 |
10 | 服務(wù)好贊!外送小哥實(shí)際A餐廳自己配的,送之前一個電話說別急已經(jīng)在送的路上,送到后也一個電話說... | 2017-04-10 16:00:00 |
11 | 服務(wù)一如既往的這么贊、論食材是火鍋中的精粹,論服務(wù)也絕對是龍頭老大!人多最愛來吃A餐廳了、每... | 2017-04-23 16:00:00 |
12 | 一直特別特別特別愛A餐廳真的服務(wù)太貼心了細(xì)節(jié)決定一切呀用餐的時候接了個電話無意中跟朋友說今天... | 2017-05-07 16:00:00 |
13 | 服務(wù)沒的說啊,非常的周到啊,從始至終不用自己喊服務(wù)員,主動的倒飲料,幫我們下肉,吃完還給我們... | 2017-05-14 16:00:00 |
14 | 口味還不錯?點(diǎn)了一份蛋炒飯,加荷包蛋?溏心的。撈派撈面?還不錯,菌湯番茄?的都好吃。炸饅頭一... | 2017-05-14 16:00:00 |
15 | 話說我真的很久很久沒有吃A餐廳了,朋友想吃,我倆就過來了。她喜歡番茄鍋,所以我們點(diǎn)了牛油麻辣... | 2017-04-25 16:00:00 |
16 | 提前預(yù)訂的因?yàn)楹⒆由蘸⒆觽冇窒矚g那的口味服務(wù)我就不都說了一如既往的優(yōu)質(zhì)每位服務(wù)員態(tài)度都是那... | 2017-04-27 16:00:00 |
17 | A餐廳新開路店是在天津所有A餐廳門店當(dāng)中,我最愿意光臨的,因?yàn)檫@里停車方便,排隊(duì)人也不像其他... | 2017-03-17 16:00:00 |
18 | 再次來享受A餐廳的服務(wù),真是好,等位的時候可以下棋等餐,而且有美甲做,需要排隊(duì)很久,檸檬水不... | 2017-05-06 16:00:00 |
19 | 服務(wù)和味道一如既往的好,主要最愛吃他家DIY的小料!這次還用手機(jī)掃了個公眾平臺用一樓的照片打... | 2017-04-14 16:00:00 |
20 | A餐廳的服務(wù)一直很好,光顧很多次了,這次去是小伙伴們幫忙預(yù)定,為我慶生,A餐廳的工作人員還提... | 2017-05-21 16:00:00 |
21 | 今天下班,和朋友說好去吃A餐廳?,到那沒有排隊(duì)就可以直接進(jìn)去吃??,點(diǎn)了它這新品,紅皮土豆,... | 2017-04-14 16:00:00 |
22 | 1.環(huán)境還好,算中等。 2.服務(wù)不錯,越來越好,有生日布置,原來送小蛋糕,現(xiàn)在改果盤中... |
2017-05-04 16:00:00 |
23 | A餐廳火鍋 上周五帶對象去吃的,我本人對火鍋不是特別愛吃,吃不了辣,對象喜歡吃辣的,就... |
2017-03-16 16:00:00 |
24 | 這次是在情人節(jié)當(dāng)天過去的,以前從來沒在情人節(jié)正日子出來過,不是因?yàn)闆]有男朋友,而是感覺哪哪人... | 2017-02-20 16:00:00 |
25 | 一直喜歡A餐廳,去過其他店,這次陪父母來他家體驗(yàn)。排隊(duì)等待時服務(wù)員很貼心的送來小吃,很溫馨。... | 2017-05-22 16:00:00 |
26 | 家門口經(jīng)常去服務(wù)沒的說環(huán)境也挺好的 | 2017-05-24 01:50:00 |
數(shù)據(jù)預(yù)處理
In [3]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 27 entries, 0 to 26
Data columns (total 2 columns):
comments 27 non-null object
date 27 non-null datetime64[ns]
dtypes: datetime64[ns](1), object(1)
memory usage: 512.0+ bytes
In [4]:
text = df.loc[0, 'comments']
text
Out[4]:
'這輩子最愛吃的火鍋,一星期必吃一次啊!最近才知道他家還有免費(fèi)雞蛋羹………………炒雞好吃炒雞嫩啊!!新出的紅皮土豆也好好吃,還有炸酥肉,秒殺任何火鍋店啊!服務(wù)員太可愛,告訴我們半份豆花是4塊兒,一份豆花是6塊兒,點(diǎn)兩個半份比較合適,太實(shí)在了哈哈哈,每次媽媽說開心果好吃服務(wù)員都給我們打包帶走??希望A餐廳早日出咖喱鍋,期待ing……'
In [7]:
a = SnowNLP(text)
a.sentiments
Out[7]:
0.4244401030222834
將所有數(shù)據(jù)打分
In [9]:
def aaa(x):
return SnowNLP(x).sentiments
grade = df['comments'].apply(aaa)
grade # 科學(xué)計(jì)數(shù)法
Out[9]:
0 4.244401e-01
1 4.506914e-01
2 1.000000e+00
3 1.182003e-01
4 8.712261e-01
5 9.980202e-01
6 9.820584e-01
7 6.392747e-03
8 4.267672e-02
9 6.235047e-01
10 1.965386e-04
11 9.999997e-01
12 9.999998e-01
13 9.999515e-01
14 9.999862e-01
15 1.215408e-03
16 1.000000e+00
17 9.827555e-01
18 8.931110e-01
19 9.998846e-01
20 1.000000e+00
21 9.100772e-01
22 9.270364e-01
23 9.999957e-01
24 6.334066e-08
25 9.999988e-01
26 6.348401e-01
Name: comments, dtype: float64
將分?jǐn)?shù)合并會原表格
In [11]:
df['grade'] = grade
df.head()
Out[11]:
comments | date | grade | |
---|---|---|---|
0 | 這輩子最愛吃的火鍋,一星期必吃一次啊!最近才知道他家還有免費(fèi)雞蛋羹………………炒雞好吃炒雞嫩... | 2017-05-14 16:00:00 | 0.424440 |
1 | 第N次來了,還是喜歡?…… 從還沒上A餐廳的樓梯開始,服務(wù)員已經(jīng)在那迎賓了,然... |
2017-05-10 16:00:00 | 0.450691 |
2 | 大姨過生日,姐姐定的這家A餐廳的包間,服務(wù)真的是沒得說,A餐廳的服務(wù)也是讓我由衷的欣賞,很久... | 2017-04-20 16:00:00 | 1.000000 |
3 | A餐廳的服務(wù)哪家店都一樣,體貼入微。這家店是我吃過的排隊(duì)最短的一家,當(dāng)然也介于工作日且比較晚... | 2017-04-25 16:00:00 | 0.118200 |
4 | 因?yàn)橄挛缫ヌ旖蛘窘尤耍缓笪屹磺皫滋炀驼f想吃A餐廳,然后正好這有,就來這吃了。 來的... |
2017-05-21 16:00:00 | 0.871226 |
計(jì)算指標(biāo)
In [12]:
# 平均值
df['grade'].mean()
Out[12]:
0.6987503312852683
In [13]:
# 中位數(shù)
df['grade'].median()
Out[13]:
0.9270364310550024
In [14]:
# 快速統(tǒng)計(jì)
df['grade'].describe()
Out[14]:
count 2.700000e+01
mean 6.987503e-01
std 4.008801e-01
min 6.334066e-08
25% 4.375657e-01
50% 9.270364e-01
75% 9.999909e-01
max 1.000000e+00
Name: grade, dtype: float64
基礎(chǔ)結(jié)論:中位數(shù)比平均值高很多,說明有少量異常低的評分拉低了均值
可視化
In [16]:
df2 = df[['date', 'grade']].set_index('date').sort_index()
df2.head()
Out[16]:
grade | |
---|---|
date | |
2017-02-20 16:00:00 | 6.334066e-08 |
2017-03-16 16:00:00 | 9.999957e-01 |
2017-03-17 16:00:00 | 9.827555e-01 |
2017-04-10 16:00:00 | 1.965386e-04 |
2017-04-14 16:00:00 | 9.998846e-01 |
看分?jǐn)?shù)分布情況,直方圖最合適
In [17]:
df2.plot.hist()
Out[17]:
<matplotlib.axes._subplots.AxesSubplot at 0x25f235f8>
少量數(shù)據(jù),柱狀圖也可以
In [18]:
df2.plot.bar()
Out[18]:
<matplotlib.axes._subplots.AxesSubplot at 0x260e9e10>
In [19]:
plt.scatter(df2.index, df2['grade'])
Out[19]:
<matplotlib.collections.PathCollection at 0x2621dba8>
In [20]:
plt.boxplot(
df['grade'], # 數(shù)據(jù)
showmeans = True, # 是否顯示平均值,默認(rèn)不顯示
widths = 0.5, # 柱子寬度
vert = True, # 默認(rèn)True縱向,F(xiàn)alse橫向
patch_artist = True, # 是否填充顏色
boxprops = {'facecolor':'#ffff00','color':'green'}, # 箱體樣式
)
plt.grid(linewidth=0.2)
以分?jǐn)?shù)排序,查看打分準(zhǔn)確率
In [22]:
df3 = df.sort_values(by='grade', ascending=False)
df3
Out[22]:
comments | date | grade | |
---|---|---|---|
2 | 大姨過生日,姐姐定的這家A餐廳的包間,服務(wù)真的是沒得說,A餐廳的服務(wù)也是讓我由衷的欣賞,很久... | 2017-04-20 16:00:00 | 1.000000e+00 |
20 | A餐廳的服務(wù)一直很好,光顧很多次了,這次去是小伙伴們幫忙預(yù)定,為我慶生,A餐廳的工作人員還提... | 2017-05-21 16:00:00 | 1.000000e+00 |
16 | 提前預(yù)訂的因?yàn)楹⒆由蘸⒆觽冇窒矚g那的口味服務(wù)我就不都說了一如既往的優(yōu)質(zhì)每位服務(wù)員態(tài)度都是那... | 2017-04-27 16:00:00 | 1.000000e+00 |
12 | 一直特別特別特別愛A餐廳真的服務(wù)太貼心了細(xì)節(jié)決定一切呀用餐的時候接了個電話無意中跟朋友說今天... | 2017-05-07 16:00:00 | 9.999998e-01 |
11 | 服務(wù)一如既往的這么贊、論食材是火鍋中的精粹,論服務(wù)也絕對是龍頭老大!人多最愛來吃A餐廳了、每... | 2017-04-23 16:00:00 | 9.999997e-01 |
25 | 一直喜歡A餐廳,去過其他店,這次陪父母來他家體驗(yàn)。排隊(duì)等待時服務(wù)員很貼心的送來小吃,很溫馨。... | 2017-05-22 16:00:00 | 9.999988e-01 |
23 | A餐廳火鍋 上周五帶對象去吃的,我本人對火鍋不是特別愛吃,吃不了辣,對象喜歡吃辣的,就... |
2017-03-16 16:00:00 | 9.999957e-01 |
14 | 口味還不錯?點(diǎn)了一份蛋炒飯,加荷包蛋?溏心的。撈派撈面?還不錯,菌湯番茄?的都好吃。炸饅頭一... | 2017-05-14 16:00:00 | 9.999862e-01 |
13 | 服務(wù)沒的說啊,非常的周到啊,從始至終不用自己喊服務(wù)員,主動的倒飲料,幫我們下肉,吃完還給我們... | 2017-05-14 16:00:00 | 9.999515e-01 |
19 | 服務(wù)和味道一如既往的好,主要最愛吃他家DIY的小料!這次還用手機(jī)掃了個公眾平臺用一樓的照片打... | 2017-04-14 16:00:00 | 9.998846e-01 |
5 | A餐廳是我們的定點(diǎn)單位,單位大聚小聚都來這,所以享受VIP待遇,來了不用等位。這的菜品新鮮,... | 2017-05-05 16:00:00 | 9.980202e-01 |
17 | A餐廳新開路店是在天津所有A餐廳門店當(dāng)中,我最愿意光臨的,因?yàn)檫@里停車方便,排隊(duì)人也不像其他... | 2017-03-17 16:00:00 | 9.827555e-01 |
6 | 這兩天風(fēng)特別大,家里也沒什么可吃的,外賣也不知道吃什么!又懶得出去,發(fā)現(xiàn)好久沒吃火鍋啦!靈機(jī)... | 2017-04-22 16:00:00 | 9.820584e-01 |
22 | 1.環(huán)境還好,算中等。 2.服務(wù)不錯,越來越好,有生日布置,原來送小蛋糕,現(xiàn)在改果盤中... |
2017-05-04 16:00:00 | 9.270364e-01 |
21 | 今天下班,和朋友說好去吃A餐廳?,到那沒有排隊(duì)就可以直接進(jìn)去吃??,點(diǎn)了它這新品,紅皮土豆,... | 2017-04-14 16:00:00 | 9.100772e-01 |
18 | 再次來享受A餐廳的服務(wù),真是好,等位的時候可以下棋等餐,而且有美甲做,需要排隊(duì)很久,檸檬水不... | 2017-05-06 16:00:00 | 8.931110e-01 |
4 | 因?yàn)橄挛缫ヌ旖蛘窘尤耍缓笪屹磺皫滋炀驼f想吃A餐廳,然后正好這有,就來這吃了。 來的... |
2017-05-21 16:00:00 | 8.712261e-01 |
26 | 家門口經(jīng)常去服務(wù)沒的說環(huán)境也挺好的 | 2017-05-24 01:50:00 | 6.348401e-01 |
9 | 服務(wù)態(tài)度一如既往的好,看我東西多,主動幫忙提東西,所有的服務(wù)員都主動打招呼,非常熱情。我點(diǎn)的... | 2017-05-07 16:00:00 | 6.235047e-01 |
1 | 第N次來了,還是喜歡?…… 從還沒上A餐廳的樓梯開始,服務(wù)員已經(jīng)在那迎賓了,然... |
2017-05-10 16:00:00 | 4.506914e-01 |
0 | 這輩子最愛吃的火鍋,一星期必吃一次啊!最近才知道他家還有免費(fèi)雞蛋羹………………炒雞好吃炒雞嫩... | 2017-05-14 16:00:00 | 4.244401e-01 |
3 | A餐廳的服務(wù)哪家店都一樣,體貼入微。這家店是我吃過的排隊(duì)最短的一家,當(dāng)然也介于工作日且比較晚... | 2017-04-25 16:00:00 | 1.182003e-01 |
8 | 今天又來到新開路的A餐廳,食材還是非常新鮮,羔羊肉味道鮮美,墨魚滑味道新鮮!我們一家三口吃的... | 2017-05-12 16:00:00 | 4.267672e-02 |
7 | A餐廳真的是天津每一個店我都來過無數(shù)次了! 今天覺得我拍的圖很好看hhhh于是就來發(fā)條... |
2017-05-20 16:00:00 | 6.392747e-03 |
15 | 話說我真的很久很久沒有吃A餐廳了,朋友想吃,我倆就過來了。她喜歡番茄鍋,所以我們點(diǎn)了牛油麻辣... | 2017-04-25 16:00:00 | 1.215408e-03 |
10 | 服務(wù)好贊!外送小哥實(shí)際A餐廳自己配的,送之前一個電話說別急已經(jīng)在送的路上,送到后也一個電話說... | 2017-04-10 16:00:00 | 1.965386e-04 |
24 | 這次是在情人節(jié)當(dāng)天過去的,以前從來沒在情人節(jié)正日子出來過,不是因?yàn)闆]有男朋友,而是感覺哪哪人... | 2017-02-20 16:00:00 | 6.334066e-08 |
好評
In [23]:
df3.iloc[0, 2]
Out[23]:
0.9999999999992604
In [24]:
df3.iloc[0, 0]
Out[24]:
'大姨過生日,姐姐定的這家A餐廳的包間,服務(wù)真的是沒得說,A餐廳的服務(wù)也是讓我由衷的欣賞,很久沒吃A餐廳了,發(fā)現(xiàn)很多肉的價錢確實(shí)是不便宜,底料也都是很全面的,鍋底點(diǎn)了四種,商家很聰明,為了怕鍋底沸了串味,就那個白蘿卜擋在鍋底的拼縫中間,真的是很聰明,最愛吃的還是番茄鍋底,菌湯也很好喝,但選了一個麻辣鍋來涮鴨血、鴨舌,麻辣可以有效地來調(diào)和鴨肉的腥味。中途工作人員推著蛋糕過來唱生日歌送祝福,還為我們布置了生日快樂我的房間,擺了氣球,真的是讓老人家很感動也很開心,真的很贊!'
差評
In [25]:
df3.iloc[-1, 2]
Out[25]:
6.334065716373516e-08
In [26]:
df3.iloc[-1, 0]
Out[26]:
'這次是在情人節(jié)當(dāng)天過去的,以前從來沒在情人節(jié)正日子出來過,不是因?yàn)闆]有男朋友,而是感覺哪哪人都多,所以特意錯開,這次實(shí)在是饞A餐廳了,所以趕在正日子也出來了,從下午四點(diǎn)多的時候我看排號就排到一百多了,我從家開車過去得堵的話一個小時,我一看提前兩個小時就在網(wǎng)上先排著號了,差不多我們是六點(diǎn)半到的,到那的時候我看號碼前面還有才三十多號,我想著肯定沒問題了,等一會就能吃上的,沒想到悲劇了,就從我們到那坐到等位區(qū)開始,大約是十分二十分一叫號,中途多次我都想走了,哈哈,哎,等到最后早上九點(diǎn)才吃上的,服務(wù)員感覺也沒以前清閑時周到了,不過這肯定的,一人負(fù)責(zé)好幾桌,今天節(jié)日這么多人,肯定是很累的,所以大多也都是我自己跑腿,沒讓服務(wù)員給弄太多,就蝦滑讓服務(wù)員下的,然后環(huán)境來說感覺衛(wèi)生方面是不錯,就是有些太吵了,味道還是一如既往的那個味道,不過A餐廳最人性化的就是看我們等了兩個多小時,上來送了我們一張打折卡,而且當(dāng)次就可以使用,這點(diǎn)感覺還是挺好的,不愧是A餐廳,就是比一般的要人性化,不過這次就是選錯日子了,以后還是得提前預(yù)約,要不就別趕節(jié)日去,太火爆了!'
In [27]:
df3.iloc[-2, 2]
Out[27]:
0.0001965386178448547
In [28]:
df3.iloc[-2, 0]
Out[28]:
'服務(wù)好贊!外送小哥實(shí)際A餐廳自己配的,送之前一個電話說別急已經(jīng)在送的路上,送到后也一個電話說用餐時服務(wù)需要依然可以隨時聯(lián)系,簡直不能再贊了!!幫做好一切開餐前準(zhǔn)備工作,坐等鍋開涮著吃?<br>除了點(diǎn)的麻醬,備注的需要辣油和蒜泥也一一滿足,其中點(diǎn)的蝦滑也提供了搭配蘸料,鴨血提供了搭配干料,另外送來涼菜和新鮮水果。各種滿足。'
In [29]:
df3.iloc[-3, 2]
Out[29]:
0.0012154080772626141
In [30]:
df3.iloc[-3, 0]
Out[30]:
'話說我真的很久很久沒有吃A餐廳了,朋友想吃,我倆就過來了。她喜歡番茄鍋,所以我們點(diǎn)了牛油麻辣和番茄雙拼,現(xiàn)在真是貴啊,鍋底就要84元,然后又點(diǎn)了牛肉羊肉各半分,還有一些蔬菜,吃的飽飽的。<br>自助的小菜沒有吃,但是西瓜不錯很甜。工作日的中午人不多,服務(wù)太熱情了有點(diǎn)受不了,其實(shí)就想和朋友聊聊天,服務(wù)員不停加水,哎!!!'
結(jié)論
準(zhǔn)確率比瞎猜高,但達(dá)不到人工打分準(zhǔn)確率
SnowNLP庫的訓(xùn)練基準(zhǔn)數(shù)據(jù)是基于電商銷售產(chǎn)品訓(xùn)練的,對飯店留言數(shù)據(jù)的打分準(zhǔn)確率一般
做情感分析最好用戶自行實(shí)現(xiàn)(網(wǎng)站增加打分功能,用戶自行打分)