转眼间已经工作了一段时间了,回想起2014年初学机器学习时的付出、艰苦和努力,感觉都是值得的。从现在往前看,我是沿着“计算机->统计学->数据分析->数据挖掘->机器学习->文本挖掘”的路径走过来的,我觉得这个思路还是属于比较传统的进阶方法,学习的内容有不少的冗余,但相对来说更稳健一些。今天写这篇文章的目的是想总结一下我最近关于文本挖掘的工作体会以及我对机器学习的一些新的看法,只为探讨,还望与大家共勉。
我先来说一些文本挖掘的东西。似乎大家做Text Mining的不太多,可能并不太感冒,我就大体说一下我对Text Mining的理解吧(我觉得不管做哪一种数据挖掘,方法和思路应该都是相通的,您试着看一下,说不定会有些启发)。
文本挖掘,顾名思义,就是挖掘本文信息中潜在的有价值的信息。文本数据与数值数据的区别有三:第一,非结构化且数据量大;第二,它与人的语言是对接的;第三,文字的含义不唯一。下面我稍微展开来说。
首先,文本数据的数据量是非常之巨大的,一百万条结构化数据可能才几十到几百兆,而一百万条文本数据就已经是GB了。当然文本数据的数据量无法与每天的log数据相比,但在基础数据中算是占比很大的数据类型了。大数据容量的数据和大数据条目的数据处理方式完全不一样,普通的机器甚至都无法按条处理;其次呢,文本数据是非结构化数据。非结构化意味着没有任何的列可供你定义和参考。举个例子来说:如果我们想要提取用户登录的行为数据,只要提取用户的id、登录时间、行为时间、行为内容之类的数据就可以很完整的表达用户的行为;但对于文本数据却没法这么做,比如:“今天的天真好啊!”,提什么呢?当然可以提出这句话的主语等句法结构来,但那已经是挖掘之后的结果了,而不是挖掘以前的原始提取。
第二点是最重要的,就是文本数据与人的思想直接对接。如果我获取一对情侣的短信数据,男生对女生发“我爱你”的次数和时间能直接反应男生对女生的态度。比如,男生总在对女生嘘寒问暖之后说一句“我爱你”,并且一个月内经常说,可能代表男生真的很喜欢这个女孩;而如果男生每次说我爱你之后对女生各种不耐烦或敷衍,那么这个男生可能与女生有些间隙了。当然,我只是举了个例子,不过却能证明文本挖掘也许这能挖掘出人的真实的态度。
第三点是文字的含义是不唯一的。这也是文本挖掘最大的难题所在。“你吃饭吗?”——“我也不知道”,请问这个到底是想吃饭还是不想吃饭?当然,这个需要从上下文去解读,但是在没有上下文的时候也会出现这两句话的(比如我们在宿舍)。如果按我们人的理解,大多数情况下,是这个人不太想吃饭,但可能出于某种原因(比如跟朋友一起去吃或者完了就没饭了)而又想去吃。反正根据我自己的经验,一般说不知道的最后都去吃饭了……那么,如何让计算机去理解这样的句子呢?目前来说,还是比较难的。
这是文本数据与数值数据最大的区别,就是难以量化。
那么对于难以量化的数据该怎么处理呢?
方法就是数据挖掘中的“数据转换”。
我们最终的目的是要量化一段文本(比如文本主题是哪一类、文本是什么态度等等),可以通过把文本转换成其他数据结构的数据,然后再根据该结构的类型判断数据的类别。比如我们把文本中能表达含义的基本单位“词”组织成词典,然后判断词典的类别,我们就知道文本的类别了。举个例子:“我喜欢刘亦菲”,分词之后通过代词词典知道“我”是一个代词,用当前用户的id替换掉代词,比如我的id是“小袁”,那么这句话就变成了“小袁喜欢刘亦菲”,再通过正向谓词词典知道“喜欢”是一个正向谓词,而刘亦菲是一个专有名词,那么当我们想要知道在所有用户中喜欢刘亦菲的有谁时,可以输出“小袁”。这在舆情分析和热点分析中的作用是非常大的。
当然,上面的方法只是一个例子,且不具有实用性。因为建立词典的代价是非常大的,更何况上面的例子还需要很多个词典,并且词典也很难包含所有的词。所以,好多人就想出了一些新的方法,我在这里就不一一列举了。
当我们能够量化文本了之后,我们就可以抽取文本信息了。比如,我想知道近一个月的热门电影有哪些,我们就可以抽取出最近一个月的影评数据,然后抽取评论信息中的主语和宾语,通过自然语言处理方法进行消岐和消除指代后就可以找到文本的命名实体,通过对找到的实体进行聚类就能找到热门电影有哪些了。
那么机器学习在文本挖掘中有哪些应用呢?
(1)话题识别
话题识别属于文本分类,实验中常见的例子就是把新闻文本分类成“财经、教育、体育、娱乐”等等。我目前常用的方法主要是“word2vector”和“word to bags”。 word2vector即“词向量”,通过计算文本中词出现的位置、词性和频率等特征,判断新文本是否来自于此类。比如识别文字是评论性文本还是新闻类文本的一种方案就是评论性语句中出现的情态动词和感叹词比较多且位置不固定。“word to bags”是词袋,在topic model中应用的比较多。“word to bags”计算每个词出现在每个类别的概率,然后通过TF-IDF或者信息增益或者概率找到类别信息含量高的词语,通过判断这些词语的共线程度进行文本分类。
(2)情感分类
情感分析就是用户的态度分析。现在大多数情感分析系统都是对文本进行“正负二项分类的”,即只判断文本是正向还是负向的,有的系统也能做到三分类(中立)。比如,我要分析用户对2013年“马航370事件”的态度,只要找到该事件的话题文本,通过台大情感词典等工具判断情感词的极性,然后根据一定规则组合情感词的频度和程度即可判断文本的情感。但这种方法无法判断文本的评价刻面。比如,我现在有一百万条“小米手机评价”信息,我可以通过上面的方法了解大约有百分之多少的用户对小米手机是不满意的,但却无法知道这些不满意的用户是对小米手机的哪一个方面不满意以及占的比率(比如是外形还是性能)。常用的方法是构建小米手机相关词的种子词典,通过词典找到用户评论的刻面,再构建句法树找到评论该刻面的谓语和修饰副词,通过情感词典量化出情感极性,最后将量化后的评论刻面、修饰词、程度副词带入SVM进行文本分类。不过在这里并不适合使用naive bayes,因为在多刻面多分类中,naive bayes很容易出现过拟合。
(3)命名实体识别
所谓的命名实体识别是指让计算机自动识别出自己不认识的词。比如:“胡歌唱歌非常好听!”,计算机如何才能知道“胡歌”是一个词而不应该是“歌唱”是一个词呢?“胡歌”这个词对于绝大多数词库而言都不太可能存在,那么怎么能让机器识别出这个词并且以最大的可能认为这个词是正确的呢?我认为在所有的方法中,CRF的效果最好,甚至比HMM要好得多。CRF又称条件随机场,它能够记录训练数据中每个特征的状态及其周围特征的状态,当多个特征同时出现的时候,找出每个特征在多个特征组合中最有可能出现的状态。也就是说,CRF以“物以类聚”为基本论点,即大多数词出现的环境是有规律的,并不是杂乱无章的。选取特征的时候,以“字”为单位明显要比以“词”为单位好很多,因为命名实体的词是以字为单位才能理解的,比如“陈小春”,我们是以“陈/小/春”的意思来理解的,而不是“陈/小春”或者“陈小/春”。
(4)推荐系统
文本挖掘在推荐系统中的价值在于特征词权重的计算。比如我们给用户推荐一本新书。我们可以按照下面的方式进行建模:首先找到用户评论中关于书籍的所有特征词汇,建立特征词典;然后通过文本分析和时间序列分析结合用户评论的内容和时间紧凑度计算特征词的权重,表示某个用户关心的某个特征的程度。对建立好的用户评论特征程度表进行倒排索引,找到每个特征词的所有评价用户及其评价的权重,最后根据要推荐的书籍的特征找到可以推荐的用户列表,找到评论权重高的用户并把书籍推荐给他。
好了先说这么多,不过在最后,我想总结一下关于机器学习的一些认识的问题。
有一些学习机器学习的朋友曾经问我,为什么他学机器学习有一段时间了但是感觉没学一样,也不知道究竟该怎么用。我觉得有三种可能:第一,看待问题不够宏观;第二,没有从实际出发去思考机器学习这门技术;第三,前面的基础没打好,导致看后面的内容不知所以然。举个例子来说,我们常常要对网站的评论进行挖掘,努力找出评论信息中能代表用户特征、行为、习惯、爱好、态度等信息的内容。要完成这样的一份工作需要这么几个步骤:获取原始数据、数据清洗、数据转换、归约和降维、选择特征项、选择分类器、建立特征抽取模型、训练数据、分类数据、结果评测、模型调整……如果我们不能宏观的以解决问题为目的而以使用某种技术方法的角度去看待这个任务,我们根本无从下手,因为某种技术仅仅是解决问题的一种手段,而不是必要的一个步骤。这是第一个错误的来源。
再来说第二个错误。所谓的“从实际出发”是指我们并往往不是“因为要解决某个问题而使用某种技术”,而经常是“因为我会某种技术而去解决某个问题”。举个例子,当我第一次看明白SVM的时候我很兴奋,我找了一大堆数据来跑SVM,比如对影评或微博评论进行态度情感分类之类的工作。可是当我做到特征抽取的时候就发现我很难量化出一段文字描述的内容及其程度来。后来想了好多办法来解决,最终把向量空间变异成了语言空间模型,才实现了最终的结果,而且精读也不是很高。这个时候基本也已经不是原来的SVM了。在整个过程中,我强行的使用某种方法去解决一个问题,最终导致工作趋于失败的方向(虽然勉强实现了,但结果差强人意。后来发现使用bayes效果更好)。我认为第二个错误是绝大多数新手都会犯的错误,我在这方面犯了无数次跟头,希望大家引以为戒。
最后一个错误也很普遍,也是很多同学经常出现的老大难的问题,典型例子就是理论推导。比如,SVM中引入拉格朗日乘子α来处理掉w和b,将两个参数的推待求方程变为了一个参数的待求方程。那么引入拉格朗日参数的原因是什么?甚至会问“拉格朗日是什么来着?”这些都需要我们回头去查资料的。如果数学和计算机的理论不够,我们很难往下推动学习的进展,也难以理解算法采用某种方法的原理是什么。
不过,在我们最求所以然的时候,也要在某些细枝末节上学会“不求甚解”。好多同学(包括我在内)都曾经因为一个积分算不出来而失去了学下去的整个动力。其实我很建议大家有的时候不要太过于纠结为什么积分结果是这样,为什么结果形式变了,而应该多想一想为什么要求这个结果?这个结果有什么用?这对大家更深入的理解算法有用得多。那么为什么不建议大家去想计算的细节呢?因为在实际应用中计算过程被计算机给代替了。
好了,码了这么多字,有点累了。还是那句话,只是一个阶段性总结,写的不周到的地方,还望大家指出,小弟不胜感激!
——小袁NLP