情感分析方法之nltk情感分析器和SVM分類器(二)

一、使用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.0kernel='rbf'degree=3gamma='auto'coef0=0.0shrinking=Trueprobability=False,

tol=0.001cache_size=200class_weight=Noneverbose=Falsemax_iter=-1decision_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 :類別的權重,字典形式傳遞。設置第幾類的參數Cweight*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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章