一、使用NLTK Vader SentimentAnalyser分析
NLTK附帶了一個內置的情感分析器模塊——nltk.sentiment.vader,參考1,參考2。它可以分析一段文字或句子下情緒的正面、負面和中性極性分類。其中,compound表示複雜程度,neu表示中性,neg表示負面情緒,pos表示正面情緒。
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# nltk.download('vader_lexicon')
view = ["Great place to be when you are in Bangalore",
"The place was being renovated when I visited so the seating was limited",
"Loved the ambience, loved the food",
"The place is not easy to locate"]
sid = SentimentIntensityAnalyzer()
for sen in view:
print(sen)
ss = sid.polarity_scores(sen)
for k in ss:
print('{0}:{1},'.format(k, ss[k]), end='')
print()
對於日常的普通句子,nltk的情感強度分析器已經可以很準確地分類。
“情感分析模型的準確程度,往往取決於數據量。如果一種表達情感的語言方式被普遍應用,那麼在極大的數據庫中,一些基本的統計規律(即使是最基礎的n-gram之類)也會有意想不到的精確度。比如,“呵呵”一詞原本是中性,但是作爲貶義被用得多了,統計模型也會自動發現它的負面含義。
諷刺和反語的難點在於,它們是更高層次的語意抽象。同時,識別出諷刺還需要現實世界的常識,畢竟諷刺的核心在於“預期”與“現實”的不符合”。
二、使用分類器進行分類分析
目前實現的例子是中文酒店評論的情感分析,參考1。
數據處理部分略~(工作量佔絕大多數時間)分類器的部分使用SVM,準確率有0.86。
# -*- coding: utf-8 -*-
# 對數據進行降維:PCA,文本分類:SVM
import sys
import numpy as np
import pandas as pd
from sklearn.decomposition import pca
from sklearn import svm
from sklearn import metrics
# 數據準備
datapath = r'D:\file_download\BaiduNetdiskDownload\PyCharm_File\senti_analysis\data\ChnSentiCorp_htl_ba_2000\2000_data.csv'
df = pd.read_csv(datapath)
x = df.iloc[:, 2:]
y = df.iloc[:, 1]
# PCA降維。計算全部貢獻率
n_components = 400
pca_model = pca.PCA(n_components)
pca_model.fit(x)
# pca作圖
# 取100維作爲分類器輸入
x_pca = pca.PCA(n_components=100).fit_transform(x) # 先擬合數據再標準化
# SVM分類
clf = svm.SVC(C=2.0, probability=True)
clf.fit(x_pca, y)
print('Test Accuracy is: %.2f' % clf.score(x_pca, y))
附帶sklearn.svm.SVC參數說明
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,
tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
參數:
l C:C-SVC的懲罰參數C,默認值是1.0
C越大,相當於懲罰鬆弛變量,希望鬆弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。
kernel :核函數,默認是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 線性:u'v
1 – 多項式:(gamma*u'*v + coef0)^degree
2 – RBF函數:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(gamma*u'*v + coef0)
degree :多項式poly函數的維度,默認是3,選擇其他核函數時會被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函數參數。默認是’auto’,則會選擇1/n_features
coef0 :核函數的常數項。對於‘poly’和 ‘sigmoid’有用。
probability :是否採用概率估計?.默認爲False
shrinking :是否採用shrinking heuristic方法,默認爲true
tol :停止訓練的誤差值大小,默認爲1e-3
cache_size :核函數cache緩存大小,默認爲200
class_weight :類別的權重,字典形式傳遞。設置第幾類的參數C爲weight*C(C-SVC中的C)
verbose :允許冗餘輸出?
max_iter :最大迭代次數。-1爲無限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
random_state :數據洗牌時的種子值,int值
主要調節的參數有:C、kernel、degree、gamma、coef0