实验目的:贝叶斯分类方法对微博语句进行情感倾向分类:正面情感和负面情感
实 验 数 据 : …\ 实 验 数 据 集 \sentiv\ 微 博 情 感 分 析 评 测 数 据 集 \ 原 始 未 标 注 数 据
微博情感分类实验
\fei_jun_e_yi_zhuang_ji.xml
实验方法:贝叶斯分类方法。设有属性变量
,它们即可以是离散的也可
以是 连续 的变 量, C 是类 变量 , D 是实 例集 。每 个数 据样本 用一 个 n 维特 征向 量
X
表示,分别描述对 n 个属性的度量值。
XX
nX
,
2
1
,
,
,
0
2
0
1
0
nX
,...,
XX
{
由贝叶斯公式可知数据 X 属于类 jC 的概率为:
}
(
XCP
|
j
)
(
CXPCP
|
j
)
(
(
XP
)
)
j
(
CXPCP
(
)
|
j
)
(
CP
j
j
n
)
i
1
(
CXP
|
0
i
)
j
通过训练集 D 获取
)
,
(
CXP
|
0
1
),
,
j
(
CXP
|
0
n
)
j
的估计值,对给定的属性值
(
jCP
n
)
i
1
X ,使
0
nX
0
1
,
,
(
CP
j
(
CXP
|
0
i
)
最大的C 值便是
j
X 所属的分类,即
0
nX
0
1
,
,
C
Naive
arg
max
CC
j
(
CP
)
j
n
i
1
(
CXP
|
0
i
)
j
程序流程图如下:
本实验将微博文本文件的没条语句处理为四维属性的数据加一维分类标志,利用贝叶斯
分类方法,得到测试分类与分类标志比较,得到结果矩阵,分析分类的精度和召回率。
实验过程:
1) 分词:利用中科院 NLPR 分词系统(java 版),得到分词后的文档 test_result.txt。如
图 1。
图 1 分词后文档
2) 数据预处理:利用 matlab 程序(toWordcell.m 和 readIn.m)将文本数据处理为 cell
型文件。每行存放一条语句,每单元存放一个词语,忽略标点符号。(结果为
fei_jun_jianwordcell.mat,1509X140,如图 2)
图 2 数据存储结果
3) 标注训练集和测试集:利用 matlab 程序 markCell,每次读入一条语句,人工判别分
类,标注在每行最后一个单元。共标注了 200 条,1 表示属于负面情绪,2 表示正
面情绪。标注的原则是语句表达的意义的积极性与否。忽略主题无关或无意义的语
句。(结构为 afmarked.mat,200X140,如图 3)
图 3 数据标注结果
4) 统计语句各类情感词数(将各语句数值化):正负面情感词语判别标准采用相应的
情感词语分类表(负面情感词语(中文).txt,负面评价词语(中文).txt,正面情
感词语(中文).txt,正面评价词语(中文).txt)。先利用 markCell.m 将分类表处理
为 cell 型数据(wordN&P 结构中的 NP.mat、NQ.mat、PP.mat 和 PQ.mat)。利用
getDatamatrix.m 通过查询词语分类表得到每条语句中正负面词语出现的词数。(结
果为 datamatrix.mat,200X5,前 4 列为对应词语出现的次数,作为数据的四个属性
值,第 5 列为分类标志,如图 4)
图 4 数值化结果
5) 贝叶斯分类:(程序 test5.m)取前 100 条数据作为训练数据,后 100 条数据作为测
试数据。由 bayesResult.m 获取对 100 条测试数据分类结果矩阵,及分类精度和召
回率,如图 5。
实验结果:(test5.m)
测试值
标注值
正面情感
负面情感
图 5 贝叶斯分类结果
正面情感
负面情感
64
28
6
2
精度
p
召回率
64
28
64
6
64
64
r
70.0
91.0
结果分析:分类准确率不理想。
分析主要有以下原因:1.标注的主观性太强,判断分类的标准不严格。2.数据本身缺陷,
数据数量虽可观,但语句太短,可用信息少,统计的分类方法效果不好。3.方法本身的缺陷,
本方法仅考虑了每条语句情感词和评价词的个数,不涉及对情感有影响的否定及程度副词
“不”,“很”等,而且没有考虑评价对象和语气有关的标点。4.程序的缺陷,由于时间和能
力限制,程序没有优化,文本数据数值化的处理过程过长。
程序说明:
function [tempcell]=readIn(sentence,topic)
输入为分词后的一条语句和话题,输出为存储此句的cell型数据,每单元为一个词
function [wordCell]=toWordcell(file,topic)
输入为分词后的文本文件(‘test_result1.txt’)和话题(‘菲军舰恶意撞击’),
输出为存储此文本数据的cell型数据
function [afmarked]=markCell(befmarked,endnum)
输入为cell型数据和要标注句子的数目,输出为标注后的cell型数据,最后一列为类
别标志
function [datamatrix]=getDatamatrix(afmarked,NP,NQ,PP,PQ,num)
输入为标注后的数据,各标准情感词数据以及要存储的数据数目;输出为四维属性值加
一维分类标志的数据。
function [resultmat]=bayesResult(traindata,testdata)
输入为训练数据和一条测试数据,输出为2X2矩阵。(1,1)表示将正例分为正例,(1,2)
表示将正例分为反例,(2,1)表示将反例分为正例,(2,2)表示将反例分为反例。
function [resultmat,precision,recall]=test5()
利用上述得到的datamatrix.mat,以前100条数据作为训练集,后100条数据作为测
试集,得到结果矩阵和精度、召回率。结果矩阵(1,1)表示将正例分为正例的次数,(1,2)
表示将正例分为反例的次数,(2,1)表示将反例分为正例的次数,(2,2)表示将反例分
为反例的次数。
function [resultmat,precision,recall]=mymain(file,topic,num)
输入分词后的文本文件,话题,标注数目,输出为结果矩阵和精度、召回率。