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

时间:2022-10-21 16:52:35

一、使用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情感分析器和SVM分类器(二)

对于日常的普通句子,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