第八届泰迪杯数据挖掘赛C题总结

泰迪杯已经过去了,我感觉泰迪杯的新题(叫南什么杯来着)更像是一道考爬虫能力的题啊。听说获奖了还有去XXX研究院工作的机会,显然这个出题的老师水平不怎么样嘛。因为这道题,只要用一些正则表达式就能弄出来了。或者用一些简单的 NLP 工具,就可以轻松实现。比起 C 题,其实这道题更加简单一些。当然,对于不懂 html 和爬虫的伙伴来说,可能还是有难度的。

比起这道题,我感觉还是 C 题更有挑战性一些。看过 A 题和 B 题,A 题感觉是普通的数据题,它的数据预处理比较难,而且需要结合比较专业的知识来解决,这一点比较棘手。而 B 题呢?更像是一道计算机视觉的题目。这种题目实际上不难,网络上开源的网络有很多,真心不是很难。

而C题,更是一道汉语言处理的问题了,汉语言处理又是一块比较新的领域。所谓风险越大,收益越大,因此我觉得C题比较有机会,比较适合我这种混世魔王。

C题第一题是怎么做的?

所谓C题,是一道文本分类问题。我看了一些论文,好像不进行分词,训练出来的分类器会更加精确。怎么做呢?我只考虑留言详情,因为它的信息量比较大。然后,把留言详情进行分词,而是用二元语法,也就是连续的两个汉字作为特征。

可能有人会问,这么做,特征数量不是太多了吗?是的,因此我需要将其进行降维。怎么降维?不是采用PCA,而是根据留言的分类,用统计检验的方法——卡方检验,进行降维。这也是根据我所读的论文做的。

得到特征之后,我使用的是统计词频词袋模型,将非结构化的文本,转换为结构化的特征向量。

之后,再根据模型,训练出一个机器学习模型就可以了。我训练了几乎所有常见的机器学习模型,从中挑选出最好的机器学习模型。他们分别是——贝叶斯分类器、逻辑回归、SVC。

第二题是怎么做的?

第二题,我将其理解为聚类问题、综合评价问题了。因为要挖掘出热门问题,首先找出问题,如何找?聚类!!

这次,因为聚类没有分类标签了,所以不能再用卡方检验了。卡方检验其实好处很多,能够顺带把停用词之类的也给刷了。因此,如果继续使用二元语法提取特征,然后再使用PCA降维,那么肯定不能过滤掉停用词了。

因此,本次提取特征,就只能老老实实地用分词器先进行分词了。

要想分词,首先训练一个分词器。我用的是MSR开源语料库,使用条件随机场来训练一个分词性模型的。条件随机场将分词问题转换为序列标注问题,此是其基本原理。

进行分词之后,不要直接进行降维,因为一些制表符、空格什么东西都要过滤掉,再进行PCA降维不迟。因此,我使用 hanlp 的开源字典——stopword,再向里面添加进换行、制表符等,来过滤掉这些停用、常见词。

之后,就可以进行 PCA 降维了。考虑到特征个数比较多的情况下,样本一般呈现出线性可分的状态。因此,我使用的是无核函数的 的PCA降维。

得到特征之后,我仍旧使用的是统计词频词袋模型,将非结构化的文本,转换为结构化的特征向量。有人可能为问我为什么,因为TF-IDF会破坏数据的稀疏性,要花费几乎20个GB,才能读取得了。我的电脑只有 8G的内存,要读取他,肯定要依靠文件管理系统不停的缓存、释放,这样的代价太大了。这也是为什么第一次问题我是这么做的原因(实际上论文也是这么做的)。

之后,再用 DBSCAN 聚类,将相似的文本进行聚类。其实我有想过用 k-means,或者 高斯混合模型对文本进行聚类的。然而,由于聚类簇数需要人工选择,因此就放弃了这种方法。可能有人会抬杠说, k可以有折臂图之类地推出,但是这么做太麻烦了,这是因为样本数十分多的缘故。于是我还是用 DBSCAN 了,只不过调参麻烦了点。

之后,我再根据 点赞数、反对数和时间跨度,找出了热门问题。这个热度指数,根据点赞数、反对数和留言数算出来的,而时间跨度,用于对每条留言的衰减。为了实现这种衰减,我还设置了一个 指数函数。 当然,该指数函数的参数,需要根据一些方程组算出。至于方程组是怎么列出来的,可以考虑过了 1 年,热度衰减多少,这样子列出来。

但最后,我看了聚类效果,不堪入目~

后来我想了想,其实,这样的聚类,只是对的聚类,而不是对汉字背后意思的聚类。换句话说,留言中用词相似的留言会被聚成一类。而不是意思相近的留言聚成一类。这很尴尬,因为人吃鱼鱼吃人好像不是同一个意思哦…

因此,要想聚类,还是以词向量作为特征比较妥当。但是,搭进词向量后,对于每一条留言,将会是一个特征矩阵。虽然可以对其取平均,但是,我没有尝试过。

最后,为了提取出问题描述,我使用关键句提取算法。这样做,能够从字数为几百多的留言详情,压缩到几十个字。于是提取问题描述时,就不会太累。

第三个问是怎么做的?

第三个问比较简答,就是一个评价留言答复的问题。其实问题已经描述得很清楚了,从相关度、完整性和可读性来评价留言答复。相关性,我的想法是从留言答复、留言详情中,分别提取出关键句。根据关键句的词向量平均向量的相似度(平均词向量的夹角余弦值),作为相关性。

至于完整性和可读性,我本来考虑使用词性分析,根据词性分析的结果来判断。但是,奈何手头上没有相关的语料库。并且完整读、可读性是一个回归问题哦,这种语料库实在没有。于是,我就只能像问题一一样,将两两的汉字,作为一个特征,并在某部二元语法词典中,看是否有没有相应的匹配词。然后,如果没有,就扣一点点分,按这样的方式来解决。

结束了,这就是 C 题的做法,不知道对不对,能不能拿个二等或者一等奖,感谢大家听我说了这么多废话,希望能够对萌新们有一点启发。

二等奖,看来自己水平不够啊,不够!!共勉吧。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/weixin_42141390/article/details/106069244