资源下载地址:https://download.csdn.net/download/sheziqiong/85734418
资源下载地址:https://download.csdn.net/download/sheziqiong/85734418

情感极性判断

引言

情感极性分析是对带有感情色彩的主观性文本进行分析、处理、归纳和推理的过程。本次实验中,我基于python语言、pytorch深度学习框架,采用规则方法统计方法深度学习方法实现了汉语句子的情感极性判断,最终的测试正确率分别为68.7%88.7%和91.2%。

实验一:基于规则的文本情感极性分析

1.1 基本原理

对语料进行情感打分,若score>0则为positive,反之为negative,其中涉及到情感词、否定词、程度副词、停用词四种词典。整体算法流程图如下图所示:

1.2 数据准备

1.2.1 BosonNLP情感词典

词典下载链接:https://kexue.fm/usr/uploads/2017/09/1922797046.zip。 据了解,此情感词典来源于社交媒体文本,适用于处理社交媒体的情感分析,对于其他种类样本进行分析效果不太好。

其用例展示如下:

词后面的数字表示为情感词的情感分数,正向为positive的词,负向为negative的词。

1.2.2 《知网》情感分析用词语集(beta 版):

词典下载链接:https://download.csdn.net/download/liulangdeyuyu/5729931?utm_source=bbsseo

为了增加情感词典的泛化性,我还选取了来自《知网》统计的情感分析用词作为辅助情感词典。

1.2.3 否定词词典

词典下载链接:https://kexue.fm/usr/uploads/2017/09/1922797046.zip

否定词可以直接将文本的内涵反转,而且还存在“否定之否定”这种叠加效果。常见的否定词如:不、没、无、非、难道 等等。www.biyezuopin.vip

1.2.4 程度副词

该词典来源于《知网》标注语料中的程度副词

基于规则的方法核心是对每个文本进行打分,那么分数的绝对值大小也会表示情感强烈程度。因此,对于程度副词的引入就显得尤为重要。我对每个程度副词程度值进行后处理,数据格式可参考图3。总共两列,第一列为程度副词,第二列为程度数值。规则如下:极其2,超1.8,很1.5,较1.1,稍0.7,欠0.5。这里暂定以上为初始值,后续实验将会探讨该定义对结果影响。

1.2.5 停用词词典

词典参考:https://github.com/isnowfy/snownlp/blob/master/snownlp/normal/stopwords.txt

观察到,停用词中存在很多否定词典和程度副词词典中出现的词,如:不 等,需要提前过滤掉,否则就会导致判断不准确的问题(下文的实验中将会讨论)使用如下方法进行过滤:

# ======================= 生成stopword表,需要去除一些否定词和程度词汇 =======================
stopwords = set()
fr = open('停用词.txt','r',encoding='utf-8')
for word in fr:stopwords.add(word.strip())
# ======================= 读取否定词文件 =======================
not_word_file = open('否定词.txt','r+',encoding='utf-8')
not_word_list = not_word_file.readlines()
not_word_list = [w.strip() for w in not_word_list]
# ======================= 读取程度副词文件 =======================
degree_file = open('程度副词.txt','r+',encoding='utf-8')
degree_list = degree_file.readlines()
degree_list = [item.split(',')[0] for item in degree_list]
# ======================= 生成新的停用词表 =======================
with open('stopwords.txt','w',encoding='utf-8') as f:for word in stopwords:if(word not in not_word_list) and (word not in degree_list):f.write(word+'\n')

同时,读取文本时候出现编码出错,据了解由于一个是gbk格式,一个是utf-8格式,最终通过errors='ignore’解决问题

1.5 实验结果

1.5.1 评价指标

为了评价分类器分类效果,我们采用正确率、准确率、错误率、召回率以及F-socre作为实验的评价指标。计算过程如下:

TP,FN,FP,TN = loss(neg_test,pos_test)
acc = (TP+TN)/(len(neg_test)+len(pos_test))
error = (FN+FP)/(len(neg_test)+len(pos_test))
precision = TP/(TP+FP)
recall = TP/(TP+FN)
F_score = 2*precision*recal/(precision+recall)
print("准确率:{:.3f},错误率:{:.3f},精准率:{:.3f},召回率:{:.3f},F-score:{:.3f}".format(acc,error,precision,recall,F_score))

其中TP、FN、FP、TNTP、FN、FP、TNTP、FN、FP、TN如下图所示:

1.5.2 单句情感计算

我随机选取了两句正例和两句负例进行情感计算,其预测结果如上图所示,有错有对。

1.5.3 酒店评价数据集情感计算

表1-1 数据集情感计算结果

正例(预测) 负例(预测)
正例(真实) 2721 278
负例(真实) 1600 1399

表1-2 补充结果

评价指标 数值
accuracy 0.687
error 0.313
precision 0.630
recall 0.907

1.6 对比实验

1.6.1 使用《知网》用词语集(beta版)

相比于BosonNLP数据集,这里的每个词指被标记为负例为-1,正例为+1,没有了针对每个词特殊的情感量,结果如下:

表1-3 使用《知网》用词语集(beta版)结果

正例(预测) 负例(预测)
正例(真实) 2756 243
负例(真实) 2536 436

表1-4 使用《知网》用词语集(beta版)结果

评价指标 数值
accuracy 0.532
error 0.468
precision 0.518
recall 0.919

由以上两表我们可以发现,使用该数据集后,召回率有近2%的提升,但是正确率却有15%的下降。究其原因,是由于负例预测出现了严重的问题,即竟然有2536个负例被错误预测为正向的情感。而在BosnNLP下的结果中,负例也有55%左右被预测为正向情感,这也说明了对于负向情感的预测才是更有难度的。

1.6.2 调整程度副词标注

  • 去除程度副词

    表1-5 去除程度副词结果

    正例(预测) 负例(预测)
    正例(真实) 2721 278
    负例(真实) 1600 1399

    表1-6 补充结果

    评价指标 数值
    accuracy 0.687
    error 0.313
    precision 0.630
    recall 0.907
  • 微调标注情况

此处调整标注结果为:极其1.8,超1.6,很1.5,较1,稍0.7,欠0.5。

表1-7 微调标注情况结果

正例(预测) 负例(预测)
正例(真实) 2721 278
负例(真实) 1600 1399

表1-8 补充结果

评价指标 数值
accuracy 0.687
error 0.313
precision 0.630
recall 0.907

结果均没变!从该结果可以发现,对于程度副词来说,其大小对结果的影响微乎其微,也就是说改副词的引入只会对表达情感的强烈程度有关,和结果的情感取向无关,说明该引入是成功的!

1.6.3 删去未经修改的停词集

预处理部分应对停词进行再加工,即删去其中的程度副词和否定词,避免在语料中将其删除。这里不进行再加工,结果如下:

表1-9 删去未经修改的停词集结果

正例(预测) 负例(预测)
正例(真实) 2703 296
负例(真实) 1560 1439

表1-10 补充结果

评价指标 数值
accuracy 0.691
error 0.309
precision 0.634
recall 0.901

由以上结果可知,相比于之前的结果,正例的预测总数减少,也就证明了停用词中的否定词对于原文本的情感判断是有影响的,需要进行再加工后使用。

1.7 讨论

由上述实验我们不难发现,基于规则的的模型缺点和局限性很明显,主要体现在:

  • 对于正负向文本的判断,主要取决于情感语料和词库的匹配程度、词库的规模等人工定义上面,判断方法过于简单和直白。
  • 多句话甚至多段落在该模型中被提炼为一句话,并分析其中每个词的正负向得分,加权求和后输出。这种方法显然不符合实际情况,比如文章中每一句话的重要性有大小之分,句中还会出现意思翻转的情况,只进行加权求和每个词的做法显然是不行的。

1.8 总结

在实验一中,我利用基于规则的方法,完成了对酒店评价语料的情感分析,最终的正确率为68.7%


实验二:基于朴素贝叶斯的文本情感极性分析

2.1 基本原理

朴素贝叶斯方法是目前公认的一种简单有效的分类方法,它是一种基于概率的算法。被广泛地用于模式识别、自然语言处理、机器学习等领域。

2.1.1 贝叶斯公式

贝叶斯公式就如下一行:
P(Y∣X)=P(X∣Y)P(Y)P(X)P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)P(Y)​
它其实是由以下的联合概率公式推导出来:
P(Y,X)=P(Y∣X)P(X)=P(X∣Y)P(Y)P(Y,X) = P(Y|X)P(X)=P(X|Y)P(Y) P(Y,X)=P(Y∣X)P(X)=P(X∣Y)P(Y)
其中P(Y)P(Y)P(Y)叫做先验概率,P(Y∣X)P(Y|X)P(Y∣X)叫做后验概率,P(Y,X)P(Y,X)P(Y,X)叫做联合概率。

2.1.2 naive 贝叶斯分类

之所以称为“朴素”,是因为其做了简化假设:属性值在给定实例的分类是条件独立。当该假定成立时,朴素贝叶斯分类器可输出MAP分类。其工作过程如下:

  1. 对每一个语句,用唯一具有n维属性向量X={X1,X2,…,Xn}X=\{X_1,X_2,\dots,X_n\}X={X1​,X2​,…,Xn​}来表示该语句。
  2. 假定共有m个类别C1,C2,…,CmC_1,C_2,\dots,C_mC1​,C2​,…,Cm​,对于给定元组XXX,分类法将把它预测为属于最高后验概率的类,即:

Y=max{P(Ci∣X)}Y =max\{P(C_i|X)\} Y=max{P(Ci​∣X)}

根据上文提到的贝叶斯定理:
P(Ci∣X)=P(X∣Ci)P(Ci)P(X)P(C_i|X)=\frac{P(X|C_i)P(C_i)}{P(X)} P(Ci​∣X)=P(X)P(X∣Ci​)P(Ci​)​

  1. 由于P(X)P(X)P(X)对于所有的类为常量,只需要最大化P(X∣Ci)P(Ci)P(X|C_i)P(C_i)P(X∣Ci​)P(Ci​)即可。如果类的先验概率相等(比如本次实验中利用平衡语料训练),那么最终只需要最大化P(X∣Ci)P(X|C_i)P(X∣Ci​)。
  2. 对于P(X∣Ci)P(X|C_i)P(X∣Ci​)的计算开销非常大,为降低其计算量引入“朴素的概念”,最终简化为:

P(X∣Ci)=∏k=1nP(xk∣Ci)P(X|C_i) = \prod_{k=1}^n P(x_k|C_i) P(X∣Ci​)=k=1∏n​P(xk​∣Ci​)

  1. 因为连乘的话最终结果可能非常小,不好比较,故做log()log()log()处理,如下:
    log(P(X∣Ci))=∑k=1nP(xk∣Ci)log(P(X|C_i))= \sum_{k=1}^n P(x_k|C_i) log(P(X∣Ci​))=k=1∑n​P(xk​∣Ci​)

2.2 数据准备+预处理

大部分同1.2节、1.3节所述。

2.2.1 停词选择

我观察到频度中出现较高的还有一类词——主张词语,如:“认为”、“觉得”、“觉”等等,对于这类词也应该视作为无效词被去除,所以我在停词列表中加入这类主张词语。

2.2.2 划分数据集

这里将数据集打乱后,分为训练集、验证集和测试集,其比例依次为80%、10%和10%。下述所有实验均是在训练集+验证机调试参数,在测试集计算结果。代码如下:

def data_split(pos,neg):'''split the data for training, validating and testing'''lenth_pos = len(pos)random.shuffle(pos)pos_train = pos[:int(0.8*lenth_pos)]pos_val = pos[int(0.8*lenth_pos):int(0.9*lenth_pos)]pos_test = pos[int(0.9*lenth_pos):]lenth_neg = len(neg)random.shuffle(neg)neg_train = neg[:int(0.8*lenth_neg)]neg_val = neg[int(0.8*lenth_neg):int(0.9*lenth_neg)]neg_test = neg[int(0.9*lenth_neg):]return pos_train,pos_test,pos_val,neg_train,neg_test,neg_val

2.4 模型训练

2.4.1 模型选择

据调研,对于重复出现词语的处理共有三种方式,即对应三种模型:多项式模型、伯努利模型、混合模型。这里选择多项式模型,即在计算句子概率,以及统计计算词语的概率P(xi∣Ci)P(x_i|C_i)P(xi​∣Ci​)时,均考虑重复词语的出现次数。

2.4.2 频率计算

“不/喜欢”和“不喜欢”本应是相同结果,但在文本分词结果中,由于句子结构可能出现将词分开结果,而且如“住”、“太”等词难以去除,所以我这里只计算分词结果长度大于1的词频。

实现代码如下:

# =================== 计算出现频率 ===================neg_len = len(negtive_words)pos_len = len(positive_words)for i in negtive_words:if(len(i)>1):if negtive_word_hash.get(i) == None:num = negtive_words.count(i)frq = num/neg_lennegtive_word_hash[i] = frqfor i in positive_words:if(len(i)>1):if positive_word_hash.get(i) == None:num = positive_words.count(i)frq = num/pos_lenpositive_word_hash[i] = frq

2.4.3 特征选择

一开始并没有这一步,但是我对分类器中的概率从高到底输出后发现,无论是正例、负例分类器,如“酒店”、“房间”等酒店专有名词、“很”、“太”等修饰副词、“入住”、“住”等酒店专有动词出现频率很高,如下图所示。事实上,我们需要的特征应该是显著性特征,不应该引入出现频率很高的共有特征。

据调研,常用的特征选择提取方法有有信息增益法、互信息法、 CHI 统计法、TF-IDF等,我这里选用最后两种方式进行特征计算。

  • CHI 特征选择算法

CHI 特征选择算法利用了统计学中的"假设检验"的基本思想:假设特征 ttt 和类别 CiC_i Ci​之 间符合 CHI 分布,CHI 统计值越大,特征与类别之间的相关性越强,对类别的贡献度越大。

实现步骤如下(以负例样本集为例):

(1)统计样本集中文档总数(N)。

(2)统计特征词 ttt 和类别 CiC_i Ci​共同出现的次数(A), 特征词 ttt 出现但 CiC_i Ci​不出现的次数(B),类别 CiC_i Ci​出现但 ttt 不出现的次数(C),特征词 ttt 和 CiC_i Ci​都不出现的次数(D)。

(3)计算每个词的卡方值,并以此作为负例样本的特征值,计算公式如下:
CHI(t,Ci)=N×(AD−BC)2(A+C)×(B+D)×(A+B)×(C+D)CHI(t,C_i) = \frac{N × (AD - BC)^2}{(A + C) × (B + D) × (A + B) × (C + D)} CHI(t,Ci​)=(A+C)×(B+D)×(A+B)×(C+D)N×(AD−BC)2​
但是在实践中,我发现“不错”这个词,经计算后发现CHI(不错,negative)=CHI(不错,positive)CHI(不错,negative) = CHI(不错,positive)CHI(不错,negative)=CHI(不错,positive),原因是(AD−BC)(AD-BC)(AD−BC)相等(5000和-5000),经过平方后就相等了,但是这个词明显属于正类,故这里首先判断(AD−BC)(AD-BC)(AD−BC)其是否为负,若为负则说明不属于这类,赋值1e−81e-81e−8。如果出现CHI为0的情况(近似认为正例、负例出现频度相同),这里需要将其赋值很小,代表此特征无用,同样赋值为**1e−81e-81e−8**。

实现代码如下:

   # =================== 特征计算 CHI ===================neg_len = len(neg)pos_len = len(pos)N = neg_len+pos_lenfor i in negtive_words:A,B,C,D =0,0,0,0if(len(i)>1):if i not in negtive_word_hash:for j in negtive_sentence:if i in j:A+=1for j in positive_sentence:if i in j:B+=1C = neg_len - AD = pos_len - BM = A*D-B*CCHI = (N*M)/((A+C)*(B+D)*(A+B)*(C+D))if CHI <= 0:negtive_word_hash[i] = 1e-8else:negtive_word_hash[i] = CHIfor i in positive_words:A,B,C,D =0,0,0,0if(len(i)>1):if i not in positive_word_hash:for j in positive_sentence:if i in j:A+=1for j in negtive_sentence:if i in j:B+=1C = pos_len - AD = neg_len - BM = A*D-B*CCHI = (N*M)/((A+C)*(B+D)*(A+B)*(C+D))if CHI <= 0:positive_word_hash[i] = 1e-8else:positive_word_hash[i] = CHI
  • TF-IDF法

TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。其计算公式如下:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ TF-IDF &=Tf*ID…
其中,nkn_knk​代表特征词在某一类别文档中出现的次数,NNN为全部文档总数,nk′n_k'nk′​代表该特征词在全部文档中出现次数。实现代码如下:

    # =================== 特征计算 TF-IDF ===================neg_len = len(negtive_words)pos_len = len(positive_words)N = neg_len+pos_lenfor i in negtive_words:A,B = 0,0if(len(i)>1):if negtive_word_hash.get(i) == None:num = negtive_words.count(i)frq = num/neg_lenTF= frqfor j in negtive_sentence:if i in j:A+=1for j in positive_sentence:if i in j:B+=1IDF = math.log(N/(A+B))negtive_word_hash[i] = TF*IDFfor i in positive_words:A,B = 0,0if(len(i)>1):if positive_word_hash.get(i) == None:num = positive_words.count(i)frq = num/pos_lenTF= frqfor j in negtive_sentence:if i in j:A+=1for j in positive_sentence:if i in j:B+=1IDF = math.log(N/(A+B))positive_word_hash[i] = TF*IDF

2.4.4 特征权重

据了解,文本中的特征权重通常都基于词频来统计文本信息,赋予特征对应的权重。常用的特征权重计算方法有:布尔权重、绝对词频、TF-IDF 等多种方法。本文基于布尔权重的特征权重计算方法来计算特征在文本中的权重值。布尔权重型权值计算方法如下:
f={1,ti∈c0,ti∉cf= \begin{cases} 1, t_i\in c\\ 0, t_i \notin c\\ \end{cases} f={1,ti​∈c0,ti​∈/​c​
其中:若特征词出现在文档中,则权值为 1。否则, 权值为 0。

2.4.5 平滑处理

一开始同样没做平滑处理,结果得到了接近100%的分类错误率(当时都快把我整抑郁了),究其原因发现:如“差”、“冷”、“不满意”等词语,在正例样本中根本没出现过,我一开始直接跳过,故用正类分类器分类负类得到的结果大于负类分类器分类负类。因此会造成完美避开所有正确答案的结果。

==然而事实上,未出现的词语恰好表明该词语对于某一类特征具有非常高的辨识性。所以,对于分类器没遇到过的词语,应该加上较高的值(这里置成log(1e−8)log(1e-8)log(1e−8)),而非不管它。==引入平滑处理的极性计算实现代码如下:

def score_sentece(sentence):'''compute the 极性 of a sentence'''sen_word = seg_word(sentence)pos_score = 0neg_score = 0for word in sen_word:if (word in positive_word_hash) and word!=' ':pos_score += math.log(positive_word_hash[word])else:pos_score += math.log(1e-8)if (word in negtive_word_hash)  and word!=' ':neg_score += math.log(negtive_word_hash[word])else:neg_score+= math.log(1e-8)return pos_score - neg_score

2.4.6 选取top-k的关键词

在上述基础上,我在计算文本极性分数时,直接选用top-K作为关键词进行计算,以此来提高判断速度,实验结果见第2.5节,代码如下:

num = 0
a1 = sorted(negtive_word_hash.items(),key=lambda x:x[1],reverse=True)
for i in a1:num+=1a[i[0]] = i[1]if(num == K-1):break

2.5 实验结果及分析

下述调参过程均在验证集下完成,并以在测试集下分类结果展示

2.5.1 结果

表2-1 分类结果

评价指标 数值
accuracy 0.887
error 0.113
precision 0.895
recall 0.887
F-score 0.886
training duration 52.37 s

从该结果看,朴素贝叶斯分类器高效而且运行迅速,相比于基于规则的方法正确率提升了近30%!

2.6 对比实验

2.6.1 不加平滑处理结果

表2-2 不加平滑处理结果分类结果

评价指标 数值
accuracy 0.385
error 0.615
precision 0.417
recall 0.580
F-score 0.485
training duration 53.92 s

若不加平滑处理,也就意味着没有能很好利用显著性特征进行分类判断,最终的F-score比加上低了50%,可见该操作对于朴素贝叶斯分类器是多么的重要。

2.6.2 对于分词长度无限制

表2-3 对于分词长度无限制后分类结果

评价指标 数值
accuracy 0.885
error 0.115
precision 0.884
recall 0.887
F-score 0.885
training duration 53.66 s

从F值来看,对于无限制和有限制的结果,前者的正确率和F值均率低于后者,而且运行时间边快,所以还是对于模型训练有一定帮助。

2.6.3 引入特征计算

  • 特征值(以正面分类器为例,已过滤掉词长为1)

    • 未引入特征计算时,频度前18排名如下:

    • 引入CHI特征计算后,特征值前18排名如下:

    • 引入TF-IDF特征计算后,特征值前18排名如下:

    从上述结果可以发现,经过CHI特征处理过后,前18个特征值能较好的代表正例情况,与未作处理相比具有显著提升。经过DF−IDFDF-IDFDF−IDF提取特征后,结果与未引入时相对大小基本一致。

  • 计算结果(CHI)

表2-4 引入特征计算后分类结果(CHI)

评价指标 数值
accuracy 0.723
error 0.277
precision 0.965
recall 0.463
F-score 0.626
training duration 102.71 s
  • 计算结果(TF-IDF)

表2-5 引入特征计算后分类结果(CHI)

评价指标 数值
accuracy 0.885
error 0.115
precision 0.884
recall 0.887
F-score 0.885
training duration 154.82 s

从结果来看,引入CHI特征反而会降低15%左右的F值。但从理论上来讲,因为特征工程的引入使的具有显著性的特征,其特征值较大。据观察,分类结果中的精准度非常高,能达到96.5%,发现是由于负类样本几乎都分对了,但正例样本却出现了40%的正确率。据分析可能是由于,该语料中的表达“好”的特征并不显著,所以分类结果出现这种情况。引入TF−IDFTF-IDFTF−IDF特征后,结果与未引入前相比影响不大。

2.6.4 top-K

  • 频度计算的top-K

  • 引入特征计算的top-k

经过数次实验,最终发现在K取7000左右能较好地表达该语料情况。

2.7 讨论

在实验中,如果做以下处理结果可能会更好:

  • 对否定句的处理:由于在基于规则的实验中,我们对否定词进行特别处理,然而在实验二中并没有做很好的处理。如“我不是很喜欢这里的环境,它让我开心不起来”,其中其中两个形容词“喜欢”、“开心”都是褒义词,但是因为句子的否定句,所以整体是贬义的。
  • 若考虑句子中词语的位置结构可能会进一步提高预测效果,因为朴素贝叶斯基于条件独立性假设,因此“我很不喜欢”和“我不很喜欢”对于该分类器来讲没有区别,然而事实上肯定表达是完全相反的。

2.8 总结

在实验二中,我构建了朴素贝叶斯分类器,并引入CHI特征、TF-IDF特征、Top-k、对数计算、平滑处理等tricks,最终达到了**88.7%**的正确率,显著高于实验一中的结果。


实验三:基于逻辑回归的情感极性分析

3.1 基本原理

3.1.1 sigmoid函数

其函数形式为:
g(x)=11+e−xg(x)=\frac{1}{1+e^{-x}} g(x)=1+e−x1​
对应函数曲线如下图所示:

3.1.2 Word2vec 词向量

2012年,微软的实习生Mikolov发现了一种用一定维度的向量表示词的含义的方法,他训练了一个神经网络来预测每个目标词附件的共现词。他和他的队友在谷歌发布了创建这些词向量的软件,称为Word2vec。

该模型本质上是一种无监督学习算法,意图教网络预测句子中目标词附近的词,而不是通过带有此含义的标签直接学习目标词的含义。这章相邻词的“标注”来源于数据集本身,不需要手工标注,它能够捕捉更丰富的目标词含义

3.1.3 算法流程图

此处参考老师发在乐学上的PPT文件。

 算法流程如上图所示。特别的,首先利用$$gensim.Word2vec$$第三方库进行酒店评论数据词向量的训练,得到300维的特征向量。对训练文本向量进行特征提取后,利用pytorch构建逻辑回归模型,进行模型训练。

3.2 数据准备+预处理

同样,这里的大部分操作如1.2节和1.3节所述。

3.2.1 词条预处理

在训练词向量模型时,gensim.Word2vec模型接收的输入是一个句子列表,其中每个句子都已经切分为词条。这样可以保证词向量模型不会学习到相邻句子种出现的无关词。训练输入类似于以下结构:

>>> token_list
[['标准间','太','差','房间','还','3','星',……],['好久','才','评价','记得','火车站','超近',……],……
]

3.3 词向量训练

3.3.1 词向量训练

考虑到本数据集与酒店相关,故尝试定制化词向量来提高模型的精确率。为了训练该模型,此处引用gensim第三方库。

模行训练代码如下:

def model_train(token_list):num_features = 300 #向量元素的维度表示的词向量min_word_count = 3 #最低词频num_workers = 1 #训练使用的CPU核数window_size = 3 #上下文窗口大小subsampling = 1e-3 #高频词条采样率model = Word2Vec(token_list,workers=num_workers,vector_size=num_features,min_count=min_word_count,window=window_size,sample=subsampling,epochs=50,sg=0)model.init_sims(replace=True)  #丢弃不需要的输出权重model_name = "my_word2vec" #模型命名model.save(model_name) #模型保存return True

其中参数sg代表word2vec模型的选择了。如果是0(默认), 则是CBOW模型,是1则是Skip-Gram模型。

3.3.2 词向量加载及评测

因为模型训练涉及到很多超参数,经过反复调试,最终选定训练轮数50为佳。这里分别尝试了CBOW模型和Skip-Gram模型进行训练。

相关代码如下:

model = Word2Vec.load("my_word2vec")
for e in model.wv.most_similar(positive=['脏'], topn=10):print(e[0], e[1])
  • CBOW(continuous bag of words)

结果如下图所示:

  • Skip-gram模型

3.5 实验结果

最终结果如下:

epoch batchsize optimizor criterion train\ accuracy test\ accuracy
500 100 SGD$$ BCE 0.945 0.912

训练正确率曲线如下:

3.6 总结

在实验三中,我利用gensim第三方库完成语料的训练,将训练了300维的vector,并基于pytorchpytorchpytorch框架构建逻辑回归模型,针对酒店评价数据集进行训练,最终在测试集上达到了**91.2%**的正确率,均高于实验一和实验二中的结果。


实验总结

在本次自然语言处理实验中,我分别基于规则、朴素贝叶斯、逻辑回归进行情感语料极性判断。之所以选择该project是因为之前没有任何相关基础,想先从简单的项目做起,能够较为细致且全面地了解(作为小白而言)相关知识。www.biyezuopin.vip

现对三个实验做一个总结:

  • 实验一:在网上经过大量调研后,我选用酒店评论数据集作为分析对象,BosonNLP情感词典、《知网》情感分析词汇作为规则字典,并对停用词、程度副词、否定词做了相关处理,并进行大量对比试验,最终测试正确率为68.7%

  • 实验二:在第一个实验数据预处理的基础上,进一步做数据集分割。我构建了朴素贝叶斯分类器,并引入CHI特征、TF-IDF特征、Top-k、对数计算、平滑处理等tricks,最终达到了**88.7%**的测试正确率,显著高于实验一中的结果。

  • 实验三:基于pytorch深度学习框架构建逻辑回归模型,并完成了数据集重载、模型初始化及模型训练测试等配套代码的撰写工作。同时为了更好地使词向量符合本数据集,我利用gensim进行词向量得训练。最终,模型测试正确率为91.2%,显示出了深度学习的强大。

资源下载地址:https://download.csdn.net/download/sheziqiong/85734418
资源下载地址:https://download.csdn.net/download/sheziqiong/85734418

基于Python的情感极性判断(基于规则、基于逻辑回归、基于朴素贝叶斯)相关推荐

  1. python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类

    实现本文的文本数据可以在THUCTC下载也可以自己手动爬虫生成, 本文主要参考:https://blog.csdn.net/hao5335156/article/details/82716923 nb ...

  2. ML之NB:基于news新闻文本数据集利用纯统计法、kNN、朴素贝叶斯(高斯/多元伯努利/多项式)、线性判别分析LDA、感知器等算法实现文本分类预测

    ML之NB:基于news新闻文本数据集利用纯统计法.kNN.朴素贝叶斯(高斯/多元伯努利/多项式).线性判别分析LDA.感知器等算法实现文本分类预测 目录 基于news新闻文本数据集利用纯统计法.kN ...

  3. Python《机器学习实战》读书笔记(四)——朴素贝叶斯

    第四章 基于概率论的分类方法朴素贝叶斯 4-1 基于贝叶斯决策理论的分类方法 4-2 条件概率 4-3 使用条件概率来分类 4-4 使用朴素贝叶斯进行文档分类 4-5 使用Python进行文本分类 4 ...

  4. 基于贝叶斯定理的根据大学生恋爱心理数据预测性别的朴素贝叶斯模型(python+mysql)

    "人工智能源于数据科学,大数据成就了人工智能"-----郭毅可 数据对人工智能来说尤为关键,我国人工智能发展如此之迅速,其中就因为我国的人口基数大.但当某些数据缺失时,怎么解决呢? ...

  5. 基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM、CNN)实现的中文情感分析,含数据集可直接运行

    基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM.CNN)实现的中文情感分析,含数据集可直接运行 完整代码下载地址:中文情感分析 中文情感分析 本项目旨在通过一个中文情感 ...

  6. 先马后看!详解线性回归、朴素贝叶斯、随机森林在R和Python中的实现应用!(附代码)...

    来源| analyticsvidhya 编译| 火火酱,责编| Carol 出品 | AI科技大本营(ID:rgznai100) 谷歌的自动驾驶汽车和机器人得到了媒体的广泛关注,但是公司真正的未来是在 ...

  7. [机器学习]朴素贝叶斯原理和基于Spark 实例

    朴素贝叶斯分类 贝叶斯原理的由来:贝叶斯为了解决一个叫"逆向概率"问题写了一篇文章,尝试解答在缺乏太多可靠证据的情况下,怎样做出更符合数学逻辑的推测. 逆向概率:逆向概率是相对正向 ...

  8. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  9. python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)

    本文将要为您介绍的是朴素贝叶斯python代码实现(西瓜书),具体完成步骤:朴素贝叶斯python代码实现(西瓜书) 摘要: 朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集 ...

最新文章

  1. Data - 深入浅出学统计 - 下篇
  2. python坐标点怎么输入_python导入坐标点的具体操作
  3. python设置行号_Python_添加行号
  4. 在微服务中如何管理数据
  5. 【渝粤题库】广东开放大学 学前教育学 形成性考核
  6. 04_SpringCloud 整合Ribbon细粒度配置自定义
  7. python 两两组合
  8. 关于 Appium 各种版本的安装,都在这里
  9. windows服务器重装教程,Win10系统怎么重装?Win10系统重装教程
  10. Opencv裁剪图片大小
  11. html把一张图片动态的代码,AI不仅会P图了,还能让照片“动起来”!
  12. java 建一个car_大学java习题 :定义一个汽车类car
  13. 马斯克用数字孪生开启航天工业大时代,工互2.0来了吗?
  14. 20176408李俊 线性表
  15. 数据结构:五岔路口交通灯问题
  16. 新旧工艺比较:PCB制造工艺
  17. 在VMware虚拟机中安装Win10操作系统
  18. 给成绩单中的学生发送电子邮件
  19. 整体大于部分_软装 | 整体大于部分之和的生活哲学
  20. Effie、幕布、为知笔记、谁才是超好用的商业提案工具?

热门文章

  1. SSRS 常用函数、表达式
  2. Flash工具的简单运用
  3. Echarts-axislabel文字过长导致显示不全或重叠
  4. windows第三方软件找不到映射的网络盘
  5. 过期域名有价值吗?抢注过期域名的几大注意事项
  6. 指针和指针引用作为函数的参数
  7. 手把手教你定制专属的个性化登陆界面,让你的终端更炫酷!
  8. VLC-android的libmpeg2和matroska的下载路径
  9. 我是如何从一个小哈喽进阶为高级iOS的?
  10. 提升代码质量,使用插件对 java 代码进行扫描检查分析