顾伟强 秦 天 刘倾源 文小清
(1.西华大学 电气与电子信息学院,四川 成都 610039;2.西华大学 理学院,四川 成都 610039)
本次建模目标是利用互联网公开来源的群众问政留言记录及相关部门对部分群众留言的答复意见的文本数据,使用Jieba 中文分词工具对文本进行分词、Gensim 和CNN中文文本分类的方法以及Reddit 的话题排名算法,达到以下3 个目标:
(1)利用中文文本分词和文本分类的方法对留言进行分类,建立关于留言内容的一级标签分类模型,并使用F-Score 对分类方法进行评价。
(2)根据附件将某一时段内反映特定地点或特定人群问题的留言进行归类,定义合理的热度评价指标,给出评价结果,并按给定的格式制作出排名前5 的热点问题表和相应热点问题对应的留言信息的热点问题明细表,有助于及时发现热点问题,相关部门进行有针对性地处理,提升服务效率。
(3)对于附件中相关部门对留言的答复意见,从答复的相关性、完整性、可解释性等多个角度对答复意见的质量做分析并给出一个评价。
总体流程主要包括如下步骤:
步骤一:数据预处理。给出的文本数据中,出现了一些特殊字符,需要在原始的数据上进行数据清洗处理,去掉重复的信息,再将处理好的信息去除不必要的停用词并进行中文分词。
步骤二:数据分析。分词完后,对CNN 模型要将词映射成索引表示,从预训练的词向量模型中读取出词向量,作为初始化值输入到模型中,并将数据集分割成训练集和测试集;将gensim 模型分词转换为语料库,并将语料库计算出Tfidf 值。对信息的好坏做相关性、评价等操作并选择特征词,因子分析完成主成分分析。
步骤三:建立模型。面对不同的问题和附件,对处理好的数据用CNN 和gensim 两种不同的模型进行分类,分别得到一级标签的分类和热点问题分类,然后计算热点问题的热度排序;建立SVM 模型对处理好的信息给出评价。
3.1.1 数据预处理
在数据中,出现了一些特殊字符的文本数据。例如读取文本内容时,留言详情前面会有 等转义字符,考虑到执行分类和运行程序时产生异常错误,需要用正则表达式对附件内容的特殊字符进行数据清洗。还有一些重复的数据,也需要去除。读取通用停用词表,使那些无明确的意义的语气助词、连接词、副词和常见词“不是,一个”等词不拆分和去除的操作,避免对有效信息造成干扰,还能让所优化的关键词更集中、更突出并且节省存储空间和提高了效率。然后采用Python 的中文分词包 Jieba 进行分词。Jieba 采用了基于前缀词典实现的高效词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG),同时采用了动态规划查找最大概率路径,找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使得能更好的实现中文分词效果。
3.1.2 CNN 模型
(1)CNN 结构。基于TensorFlow 在中文数据集上的实现,使用了字符级CNN 对中文文本进行分类[7],且CNN 的优势为:网络结构简单、使参数数目少、计算量少、训练速度快。图形识别的CNN 模型[8]:首先是输入层,计算机输入若干个矩阵;接着是卷积层(Convolution Layer),卷积层的激活函数使用的是ReLU;在卷积层后面是池化层(Pooling layer),CNN 在网络结构上没有任何变化(甚至更加简单了),CNN 其实只有一层卷积,一层Max-pooling,最后将输出外接Softmax 来n 分类,达到信息分类的作用。
(2)卷积。首先,我们去学习卷积层的模型原理,我们需要了解什么是卷积(Convolution),以及CNN 中的卷积是什么样子的。学习数学时都有学过卷积的知识,微积分中卷积的表达式为:
在CNN 中,虽然我们也是说卷积,但是我们的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为:
后面讲的CNN 的卷积都是指的上面的最后一个式子。其中,我们叫W 为我们的卷积核,而X 则为我们的输入。如果X 是一个二维输入的矩阵,而W 也是一个二维的矩阵。但是如果X 是多维张量,那么W 也是一个多维的张量。
(3)卷积层和池化层。要完成信息的分类,主要是卷积层和池化层,只要把卷积层和池化层的原理理解了,那么搞清楚CNN 就容易很多了。
CNN 中的卷积,假如是对图像卷积,参考卷积公式5,其实就是对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。举个例子,图若输入是一个二维的3x4 的矩阵,而卷积核是一个2x2 的矩阵。这里我们假设卷积是一次移动一个像素来卷积的,那么首先我们对输入的左上角2x2 局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S 的S00 的元素,值为。接着我们将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样我们得到了输出矩阵S 的S01的元素,同样的方法,我们可以得到输出矩阵S 的S02,S10,S11,S12的元素。
相比卷积层的复杂,池化层则要简单的多,所谓的池化,就是对输入张量的各个子矩阵进行压缩。假如是2x2 的池化,那么就将子矩阵的每2x2 个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3 个元素变成一个元素,这样输入矩阵的维度就变小了。要想将输入子矩阵的每n×n个元素变成一个元素,那么需要一个池化标准。常见的池化标准有2 个,MAX 或者是Average。即取对应区域的最大值或者平均值作为池化后的元素值,降低了过拟合的风险,使参数减少,进一步加速计算。
3.1.3 留言内容的一级标签分类
用CNN 模型对附件2 的留言内容进行一级标签分类,步骤如下:
(1)通过Embedding 方式将文本中的留言内容的每个词映射成一个64 维的词向量,并将所有的词向量拼接起来构成一个二维矩阵,作为最初的输入。
(2)通过卷积操作,将输入的600*64 的矩阵映射成一个 596*1 的矩阵,这个映射过程和特征抽取的结果很像,最后提取出256 个特征。
(3)用Max-pooling 方法在保持主要特征的情况下,降低了参数的数目,从多个值中取一个最大值。
(4)将 Max-pooling 的结果拼接起来,送入到Softmax当中,得到各个类概率。
(5)根据预测标签以及实际标签来计算损失函数,通过每一轮训练数据,最后计算出每个类别的准确率、召回率和F1 值、混淆矩阵的值。
3.2.1 模型和算法介绍
(1)Gensim 模型。Gensim 是一个用于从文档中自动提取语义主题的Python 库,足够智能。Gensim 可以处理原生,非结构化的数值化文本(纯文本)。Gensim 里面的算法,比如潜在语义分析LSA、LDA、随机投影,通过在语料库的训练下检验词的统计共生模式来发现文档的语义结构。这些算法是非监督的,也就是说你只需要一个语料库的文档集。当得到这些统计模式后,任何文本都能够用语义表示来简洁的表达,并得到一个局部的相似度与其他文本区分开来。
在Gensim 模型中运用了词袋Doc2bow 和LsiModel 模型算法,以下是对两种算法的简单理解:
1)词袋模型:词袋模型首先会进行分词,然后通过统计每个词在文本中出现的次数,得到文本基于词的特征,若将各个文本的词与对应的词频放在一起,就是将文本完成向量化。即把一篇文本想象成一个个词构成的,所有词放入一个袋子里,没有先后顺序、没有语义。
2)LsiModel:LSI 是从文本潜在的主题来进行分析,是概率主题模型的一种,LSI 通过奇异值分解的方法计算出文本中各个主题的概率分布。假设有5 个主题,那么通过LSI模型,文本向量就可以降到5 维,每个分量表示对应主题的权重。
3)TF-IDF:表示一个词在这个文档中的重要程度。如果词W 在一篇文档D 中出现的频率高,并且在其他文档中很少出现,则认为版词W 具有很好的区分权能力,适合用来把文章D 和其他文章区分开来。
图4:热点问题排名算法流程图
(2)Reddit 的话题排名算法[9]。Reddit 是全球化最知名的 Digg 类社区,Reddit 是一个社会化新闻类网站,Reddit内的用户能对各个帖子以投票的方式进行赞成或反对,发布时间和票数将作为一种评价关系来决定帖子的排名。第二问的热点指数就是通Reddit 的话题排名算法基于时间和点赞反对数完成的。
采用 Reddit 的话题排名算法对问题进话题热度排序,其算法描述如下:
Reddi 话题评价函数f(ts,y,z)数学表达式:
其中ts表示差值时间,ts=A-B(公式3.2.2)。
给出文档发表的时间与2015年12 月 8 日07:46:43 这个Reddit 网站成立上线时刻之间经过的时间,并用ts表示差值时间的秒数。并且X 是一个表示点赞数U 和反对数D 之间的差值:X=U-D(公式3.2.3)。
在公式中,y1,1,0且y是对x的符号函数值y=sign(x),即:
z 是一个限制最大优化值的限制值,在x 的绝对值与1之间:
其公式的具体意义可以看作为以下两点: 1)新话题比旧话题更受关注,因此发布时间对排名影响大。2)话题得分随时间衰减,且新话题评价得分更高一些。
在Reddit 的话题热度排序中使用了对数阶来限制投票反差的增长,这让算法更关注于人们的评价是否呈现两极分化,而不是考虑具体差得是不是太多,让权重的评价更加归一化。
3.2.2 问题2 解决过程
问题2 流程详解如下:
(1)对附件3 中的数据进行数据预处理,如第一问的3.1.1一样,对一些含有特殊字符的、有重复的数据进行数据清洗,再去除停用词后完成Jieba 中文分词。
(2)然后就是建模完成第二问的两张表格:
①针对热点问题明细表,开始使用留言主题进行分词,但分类效果一般,后改进为对留言详情分词。分完词后通过词袋模型的Doc2bow 稀疏向量,形成语料库,接着运用LsiModel 模型算法,将语料库计算出Tfidf 值。然后获取词典Token2id 的特征数,计算稀疏矩阵相似度,建立一个索引并读取Excel 行数据,通过Jieba 进行分词处理通过Doc2bow 计算稀疏向量,求得相似度。取相似度大于0.5 的归为一类,完成热点问题的归类。然后计算进行热点问题排序,将排好序的数据按照“问题ID”,“留言编号”等一一写入Excel 文件中,从而完成了第二张表格“热点问题明细表”。
②针对热点问题表,对留言主题进行Jieba 分词,提取特征词,将地点/人群和热点问题描述的信息逐一写入表格中。通过相似度对热点问题归类后,运用Reddit 的话题排名算法,统计出对归类的问题的点赞数和反对数,再结合3.2.1 所介绍的Reddit 排名算法,计算出每类热点问题的热度指数,用Unix 时间戳计算热点问题的时间范围时,t 的单位为秒。热度指数计算完后就可以对热点问题进行排序,最后将问题ID,热度指数和时间范围等写入热点问题表”。
3.3.1 评价方法介绍
通过已有的研究成果和参考文献的基础上,认为评论可以提取回答的社会性情感、准确性、完整性、相关性等方面的指标对回答进行评价。通过这些指标,挖掘出对回答评价关联程度最大的特征,并建立基于挖掘出的特征的自动化评价模型。
通过已有资料,初步筛选答案文本和实效性作为挖掘特征,采用因子分析法对各个挖掘出答复间隔、问答相关性、回答长度、主题关键词频为主要分析因子,并对挖掘出的特征进行主成分分析与关联性分析。各特征向量通过数据降维后,并通过SVM 进行模型训练,得到评价模型。
3.3.2 信息评价过程
(1)数据预处理。通过对附件4 数据的研究分析,可以找到答复间隔、问答相关性、回答长度、主题关键词频、文本情感为主要的研究特征。并通过已有的模型对特征进行量化。下表给出各个特征的量化过程。
表1:特征量化表
(2)模型构建:①皮尔逊相关性检验。需要从已有的特征矩阵进行关联性分析,分析选取的特征是否耦合,采用皮尔逊相关系数检验法。对各个特征进行相关性计算,得到特征相关性热力图。并从相关系统计算中可以看出各个成分之间耦合度,是否可以采用上述特征向量构建评价模型;②因子分析[10]。确定好研究的特征之后,还需要挖掘各个特征对结果的具体影响,采用因子分析法可以对已有的特征挖掘出影响最大的因子,然后对数据进行可视化后得到热力图。然后通过因子方差可以看出文本特征因子对整体方差贡献率,相关性因子、时效因子次之。从整体因子分析的结果来看,判断所选取的特征能否作为构建评价自动化回答评价模型的指标;③数据可视化。采用常规的高维数据可视化方法T-SNE 可以将降维高维数据,并进行可视化,从而容易观察出数据的分布规律。对评论特征矩阵进行降维可视化;④SVM 学习模型构建。通过降维操作聚合得到的训练标签,参与有监督的模型训练,得到自动化评价模型。可以将回答分为满意回答1 与一般回答0。
在建立CNN 模型之后,对验证集上的数据进行训练,结果是在验证集上的最佳效果为87.14%。
对测试集中的数据进行测试,在测试集上的准确率达到了86.43%,与验证集所训练出的准确率相差不多。对于卫生计生类、环境保护类等类别的Precision,Recall 和F1-score 都超过了0.9,准确率还是很高的,然而像商贸旅游类、城乡建设类仅仅超过0.7,效果较为一般。从混淆矩阵也可以看出分类效果,商贸旅游和城乡建设分类一般,其余类比较好[11]。
对于文本未能很好的关于留言内容的一级标签分类,认为有可能的原因是:
(1)数据预处理时可能未处理的好。
(2)超参数未调节到最好。
(3)影藏网络层数较多。
(4)文本数据量少,未能更好地训练数据。
问题2 是让我们根据附件 3 将某一时段内反映特定地点或特定人群问题的留言进行归类,定义合理的热度评价指标,最后按照格式保存到“热点问题表”和“热点问题留言明细表”的Excel 的文件里。
按照格式用Reddit 排名算法通过问题出现次数和总点赞反对数对热点问题计算出了一个热度指数,排序后并对排名前5 的提取到表中,反映交通和基层建设,商户相关问题等5 个热点问题在一众问题中排名前五,并且从时间范围可以看出,群众对社区产生的问题反映时间的跨度很大,如排名第一的热点问题,从2019/01/18 至2020/01/02,将近一年的时间仍然还存在问题,这可能代表着中途有来解决过问题,但没处理完善导致热点问题尚且存在。
通过建立热点问题表,让相关部门利用表格清楚的了解在某一段时间内群众所遇到的问题和麻烦,能尽快的处理好这件事,为人民群众做好服务,给予百姓便利和更好的生活环境和氛围。
对于热点问题表出现的问题做以下的详解:
(1)地点/人群一列,并未出现人群信息,有可能存在运用Jieba 对主题分词时,主题并不存在人群信息。
(2)问题描述可能并未像题目给出的表格中将事件描述的很具体。
(3)对于问题ID 一列,由于一开始归类是将群众留言数量的多少来排的序,再进行Reddit 加权后,就可能不是第一了。
热点问题的留言明细:在数据预处理时,删除特殊字符再存入表格读取后,留言详情看起来更为方便和清楚。通过留言明细表可以清楚的知道许多人反映了某一段时间社区产生的同一个问题,群众反映的留言详情很充分的表达了问题所在以及问题带来的影响,这些问题在很长一段时间困扰和影响着他们。例如有些留言详情以及发送时间都相同,猜测是一个人有两个账号的情况,都向上级表述的最近一段时间所受到的影响,用两个账号来反馈事实,像此类情况希望能让上级和相关部门注意到并及时派人解决。
对于归类热点问题有一些不足之处,一个问题被归类到另一个问题中去,产生这种问题的可能有:
(1)分词后选择特征词时没有选到关键的词语,导致未能有效地归类。
(2)选择的模型可能归类效果并不是很好。
(3)数据预处理时未删除相似的且不重要的词,导致两个问题之间相似度较高从而归类错误。
4.3 问题 3 结果分析
(1)皮尔逊相关性检验结果。通过相关系统计算中可以看出各个成分之间耦合度不高,可以采用上述特征向量构建评价模型。
(2)因子分析结果。通过因子分析计算库,得到数据的负荷矩阵。且在得到的三个主成分因子中,基于文本特征的主题关键词频、回答长度、情感得分的文本特征因子占比较大,另外两个因子主要为问答相关因子和时效性因子。通过计算因子的方差信息,可以更具体得看出各个因子对结果的贡献率。因子方差可以看出文本特征因子对整体方差贡献率较大,相关性因子、时效因子次之。从整体因子分析的结果来看,所选取的特征能够作为构建评价自动化回答评价模型的指标。
(3)数据可视化结果。从可视化结果来看,数据分布比较集中,并且明显呈现出两边聚合的特点。分别对左右两侧数据进行抽取验证。在左侧聚合分布部分数据集分析如下:从两侧数据集分布来看,位于左边的回答相较于右侧较差。根据聚合的情况为不同文本特征向量添加训练标签,以训练学习模型。
上面三个步骤和结果皆是为了通过对回答文本特征的抓取,抓取到有效的文本特征,答复间隔、问答相关性、回答长度、主题关键词频、文本情感得分。通过相关性检测和因子分析法确定了所研究的特征能够较好的解释回答的完整性、相关性、可解释性。通过对附件4 所给数据得到的文本特征数据进行降维可视化,可以明显看出满意回答和一般回答呈现两个集群。通过对SVM 机器学习方法学习两个集群的特征作为自动化评价是否为满意回答的模型,较好的基于答复意见给出了一套合适的评价方案。
对于集群数据的分类模型选择仍有不足之处,由于两个集群仍有边界模糊的回答,产生问题主要有:
(1)对特征进行量化的过程仍然存在不精准的情况,数据预处理不够充分。
(2)可能仍有部分特征不能更好地解释回答的相关性、可解释性、完整性。
(3)训练模型对部分数据分类情况不佳,可能是高维数据在映射到二维下丢失了部分信息导致。
由于大数据、云计算、人工智能等技术的发展,利用自然语言处理和文本挖掘的方法来整理微信、微博、市长信箱等网络问政平台所产生的互联网公开来源的群众问政留言,给以往主要依靠人工来进行留言划分和热点整理的相关部门极大的便利,对提升政府的管理水平和施政效率具有极大的推动作用。
对问题一建立了一级标签分类模型能较好地对留言分类,且有较高的准确率,减少工作量和差错率的同时。提高了效率;对问题二建立归类和热度指数排序模型,将留言进行归类,定义合理的热度指标,最后按给定格式保存两张表格;对于问题三建立模型从答复的相关性、完整性、可解释性等角度对答复意见给出一套较好地评价方案,保证了答复信息的质量。
对一个问题长期反复地投诉和留言,耗费了群众太多的时间和精力,并且也占用了平台过多的时间和资源,让工作人员的工作量增加了好几倍,对此我提出一个建议:可采取此市民监督机制。评价栏应分几个内容组成:市民投诉原因、职能部门已完成的处理结果、没完成的原因、预期完成时限,市民对处理结果是否满意,不满意的原因是什么,同一类同一事件投诉设置同一编号可追溯,累计追溯投诉达三次,由各行业各部门组成的监督管理委员会对此处理单进行审定,如果确实是职能部门原因导致没有处理完成的将计入绩效,也可视情况利用媒体进行监督。
政府服务是一个综合性的事务,需要不断转变作风,创新工作理念,改进工作模式,进一步研究和完善热线管理办法及考核机制来提高办件的处理效率和成效,以科学有效的方式推动该地区公共服务水平的提高,让人民生活水平不断得到提升,并坚持为人民服务的根本宗旨,真正做到为人民造福。