一、使用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