王青海,刘怡凡
(青海师范大学 计算机学院,青海 西宁 810016)
“花儿”是一种民歌,广泛流传在西北部多个省区,是国家级“人类非物质文化遗产”之一.青海花儿是西部民歌乃至中国民歌中属于标志性的口承文艺,其集中体现了民族精神、风俗习惯和风土人情,它是民族文化之魂.丰富的民族性和地域性都对“青海花儿”的研究带来了不小的困难,尤其是对唱词情感方面的分析与挖掘.将迅猛发展的人工智能技术应用到青海花儿歌词情感分析和信息挖掘[1],既是对非物质文化遗产的合理开发和有效保护,又是对花儿唱词的科学记录和深度挖掘.
朴素贝叶斯(Naive Bayesian Model)是以贝叶斯定律为基础再加上条件独立假设所形成的一种具有优良性能的分类模型.由于有坚实的数学基础及稳定的分类效率,从而保证了该模型的实用性[2].
假设文本都是相互独立的,所以在分类的正确性上会有一定的影响.它通过计算分类概率,选取概率较大的情况作为自身的预测,属于监督学习类的一种机器学习方法.
朴素贝叶斯算法的过程分为三步:第一步,计算先验概率,方法是求出要将唱词文本分成多少类,计算出每一类唱词文本在总文本中的频率.第二步,计算条件概率,将文本划分为多个子集,分别对属于不同类别的子文本集进行计算,计算在已知唱词是那一类文本的条件下,子集中的特征值是样本中的特征值概率.第三步,对于待测样本计算后验概率,即给定特征值时分类的条件概率.其数据样本的条件概率计算如公式(1-1)所示.
(1-1)
其中:P(Y=Ck)是分类的概率,P(Xj=xj|Y=Ck)是给定分类时特征值的条件概率,P(Y=Ck|X=x)是最后计算出给定特征值时分类的条件概率.
朴素贝叶斯算法的流程如下:Step 1读取唱词数据并初始化;Step 2划分训练集和测试集,生成文本特征值与Data Frame 矩阵;Step 3加载朴素贝叶斯模型并训练;Step 4预测测试集.
LSTM(Long Short-Term Memory)是一种在RNN结构上增加了记忆功能的神经网络,解决了在长时间模拟训练的过程中出现的一些关键问题,相比较于普通的RNN神经网络和CNN神经网络[3-4],LSTM神经网络在更长的时间序列中会有更好的表现.
LSTM神经网络与其他神经网络不同的地方是它加入了一个判断信息是否有用的模块,这个模块的结构称为“细胞”.“细胞”中有三层结构,输入门、遗忘门以及输出门,当信息传递进来后被判断为有用的信息会继续传递,无用的信息则会被抛弃.LSTM“细胞”的结构如图1所示,普通的RNN神经网络的结构如图2所示.
图1 LSTM“细胞”结构
图2 RNN神经网络结构
LSTM神经网络算法的流程如下:Step 1读取唱词数据并初始化;Step 2设置超参数,划分训练集和测试集并转为矩阵格式;Step 3加载长短期记忆网络模型并训练;Step 4预测测试集.
图3 数据预处理流程图Fig.3 Data preprocessing flow chart
原始收集到的唱词往往包括许多脏数据,比如相关的信息以及标点符号或者包含大量的语气词,功能性的词语,去除这些停用词,不仅可以节省文本空间,还能避免这些停用词对结果造成影响,同时唱词作为一种短文本,过多地使用停用词会对有效的信息造成干扰,笔者所采用的停用词表为哈工大停用词表.去除停用词会为后文的算法模型的研究提供更为干净的数据集,另外唱词中往往有重复的唱词,如果不去除重复的唱词则会让模型进行多次无用的处理,无疑会对运行结果造成影响.不仅如此,过多重复的词也会对产生的词云有影响,数据预处理的流程图如图3所示.
在分词技术中,英文文本和中文文本有很大的不同,英文分词时,大多数通过单词与单词之间的空格来划分,而中文分词时,考虑到在不同的语境下,有些字有时候会和其他字一起组合起来成为一个词语,有时也会单独出来,所以给中文分词增添了很大的难度.
分词的准确性会严重影响到最终的结果,目前常见的较为成熟的中文分词工具有Jieba库,KAnalyzer库以及Hanlp库等,不同的分词方式,适用在不同的开发环境中.
本文采用Jieba分词器进行“青海花儿”的唱词文本分词,Jieba分词是一个开源分词库,它有一个字典包含了日常生活中大多数能用到的中文词语,此外还提供了三种不同的分词模式用来满足不同的开发人员的需求:(1)精确模式.如果不指定参数,便会默认在这个模式下,程序会尝试将唱词文本最精确地分成一个一个词语,效果较为理想,适合在做唱词文本分析的时候使用.(2)全模式.在该模式下,程序会将唱词文本中所有可能是词语的都切割开来,会分割出来很多的单个字,效果并不理想.(3)搜索引擎模式.这种模式调用与上述两种模式不同的函数,在第一次划分后的基础上,对里面残留的较长的唱词再次划分.分词和预处理结束后就得到了最终要使用的语料库.
Word2vec是由Mikolov在Google带领的研究团队创造并提出的一种将文本训练为词向量的方法,属于一种简易的神经网络模型.该方法包含两种模型:Skip-gram模型是给定一个词语,紧接着预测该词语在上下文的概率.相反地,连续词袋模型是给定该词的上下文文本,然后预测当前词出现的概率[4],两种不同模型的示意图如图4和图5所示.
图4 Skip-gram模型示意图
图5 连续词袋模型示意图
本文采用的是Skip-gram模型,在给出了当前唱词的情况下,预测相邻位置的唱词出现的概率.即P(wi|wt),其中:t-c≤i≤t+c,c是代表查找范围.当c的取值越大,上下文的信息会更为完整,效果也会更好,但相应的训练时间会出现明显增加.
Skip-gram计算公式如公式(2-1)所示,损失函数如公式(2-2)所示.
(2-1)
其中:Wi是中心词,Wo是背景词,VWi是中心词的向量,VWo是背景词的向量,最后计算出给定中心词下的背景词的条件概率
L=-logP(w0,1,w0,2,…,w0,c|wi),
(2-2)
其中:c是窗口长度,对公式(2-1)求对数似然并转换单调性就得到了损失函数.
训练模型的算法都封装在python的genism.models.word2vec.Wrod2Vec中,包含的关键参数有.
(1)sentences:设置当前要训练的语料库,可以是序列或字符文件.
(2)size:设置词向量的维度,默认值为100.在本次实验中选择默认值.
(3)sg:此参数包含两个值,“1”表示采用skip-gram模型训练,“0”表示采用连续词袋模型训练.
(4)min_count:设置最小词频,去除一些太过于生僻的词.
(5)windows:设置上下文最大距离,默认值为5.
训练的模型主要需要python中sklearn下的CountVectorizer,MultinomialNB两个依赖库,其中CountVectorizer是一个文本特征提取方法,用来将文本中的词语转化为词频矩阵,MultinomialNB库用来构建基本的朴素贝叶斯模型.CountVectorizer包含的关键参数有:
(1)max_df:取值范围在[0.0~1.0],默认为1.0.用来限制某一个词如果出现频率过高则不会被当做关键词.
(2)min_df:类似于max_df,用来限制某一个词的频率过低则不会被当作特征值.
(3)max_features:对所有的关键词的词频进行降序排列,只取前max_features个作为关键词词集.
(4)stop_words:设置停用词,可以由用户自定义等用词表.
(5)MultinomialNB包含的关键参数有.
(6)alpha:是否添加拉普拉斯平滑,默认为“1”添加平滑.
(7)fit_prior:是否考虑先验概率,默认为true,让函数自身计算先验概率.
(8)predict:输出测试集的预测标记类.
模型的训练主要步骤是先调用CountVectorizer方法生成词频矩阵,然后调用MultinomialNB方法进行训练即可,对于不同的训练集要调整不同的参数,以确保效果达到最好.
训练的模型主要需要Python中keras下的Sequential,Embedding,LSTM,Dense,Dropout五个依赖库.其中Sequential是一种层的线性堆栈,用来将多个网络层堆叠起来,Embedding用来降低词向量的维度,即使面对大数据时也能有效的计算,LSTM用来构建简单的LSTM神经网络,Dense用来添加一个层函数,Dropout用来缓解过拟合问题.
LSTM中包含的关键参数如下.
(1)input_dim:输入维度,当使用LSTM模型为首层的时候,应该显示设定该参数.
(2)units:输出维度.决定了一层里面的LSTM单元的数量.
(3)activation:激活函数的类型,提供网络的非线性建模能力.
模型的训练主要步骤是先调用Sequential方法开始线性的堆积网络层,然后调用Embedding,LSTM,Dense,Dropout方法进行网络模型构建,最后进行训练即可,对于不同的训练集要调整不同的参数,以确保效果达到最好.
预处理操作后,手工对唱词进行二分类打分标记,“0”为消极情感,“1”为积极情感,然后放入朴素贝叶斯模型中进行测试,划分70%为训练集,剩余30%为测试集.实验部分结果如下:
原文:好马上备的是好鞍子
预测倾向为0
原文:鞍子上骑的是人梢子
预测倾向为1
原文:身穿皮袄金边子
预测倾向为1
原文:腰里别的是三件子
预测倾向为1
原文:八宝山来火焰山
预测倾向为0
原文:牧民们占下的好草山
预测倾向为1
原文:甘州不干着水滩滩
预测倾向为0
原文:清水的锅里面下上
预测倾向为0
原文:清眼泪淌给着脚面上
预测倾向为0
原文:维人哈就这个下场
预测倾向为0
原文:麦子地里的麦苒苒
预测倾向为1
原文:又长了苦苦菜了
预测倾向为0
原文:相思病得哈着还没好
预测倾向为1
LSTM神经网络模型+Word2vec:重复唱词预处理和打分操作后,构建LSTM神经网络模型,采用Word2vec词向量技术生成词向量,通过LSTM神经网络模型预测唱词的情感分类.LSTM层采用超参数值如表1所示.
表1 部分超参数设置
续表
实验部分结果如下:
原文:乌木筷子下两双
预测倾向为:[0.7028313]
原文:眼睛似水忧伤
预测倾向:[0.53]
原文:心疼擦一把汗
预测倾向:[0.61]
原文为:花椒树上甭上上时树枝杈儿挂
预测倾向:[0.41]
原文为:听说尕妹妹病哈了
预测倾向为:[0.83]
原文:我俩婚缘哈配
预测倾向为:[0.77]
原文:阿哥荒草滩睡
预测倾向:[0.32]
原文:心牵心想
预测倾向为:[0.42]
原文:尕妹山樱地一枝花花儿唱家
预测倾向:[0.71]
原文:我俩婚缘散冻冰上开一朵雪莲
预测倾向:[0.40]
原文:听个歌花儿少年
预测倾向:[0.74]
原文:身穿皮袄金边子
预测倾向:[0.96]
原文:好想跨上马背迎着幸福追
预测倾向:[0.61]
在情感分析的结果评价中分类准确的概率、分类召回的概率、和将两者统一起来的F值(F-measure)这三项数据是通用的评价指标,本文也采用这三种方式对上述二组实验进行评估,如表2所示:采用Word2vec的神经网络模型的预测在召回率方面优点十分凸出,根据F值综合对比,LSTM的效果较NBM的效果更为理想.
表2 两组实验数据对比
笔者利用WordCloud下的WordCloud包对所收集到的唱词中所采集的各民族(回族、土族、撒拉族及藏族)及不同区域(大通、循化、民和及同仁)的花儿唱词进行分类,通过对不同民族和不同地域的唱词中出现频率较高的唱词生成词云图如图6和图7所示.
图6 唱词的民族倾向性词云图
图7 唱词的地域倾向性词云图
本文利用Python这一门解释性语言[5]构建了机器学习与深度学习中的朴素贝叶斯模型和LSTM神经网络模型,对“青海花儿”唱词的情感做了简要的分析和信息的挖掘,在实验中,由于民族歌曲多带有地方特色,含有许多晦涩难懂的词语和生僻词,所以字典收录不够完善,分词结果受到影响,导致情感打分出现偏差,造成测试数据集的积极和消极情感分类不够准确.另外设计的模型和算法都较为简单,受客观因素的影响较为严重,造成了分析结果不够准确.如何获取更大规模的数据集以及如何优化算法都是今后需要研究的问题.