文本数据挖掘流程

本文主要记录文本数据挖掘大致流程,用以梳理该部分结构知识。
1.数据获取
对于文本数据而言,在公司项目中大部分数据可以通过购买方式获取数据。但常见的方式即为通过网络爬虫获取,详细请参考我后续爬虫技术教程。该种方式获取数据原理是通过程序自动遍历固定网址,将整个页面HTML结构中,不同页面DOM节点文本信息收集整理,然后缓存到本地数据库中。数据集具有结构不唯一,含有HTML标签,特殊符号等不利于训练的数据,需要后期进一步处理。
2.数据清洗与数据预处理
2.1文本数据清洗
在获得的文本数据集,也叫语料库,里面含有许多无关的HTML标签,前端JS代码段,注释,无关特殊符号等增加训练噪声的数据,因此我们需要对数据进行处理,筛选掉这些无关数据项,技术上一般使用python正则表达式处理即可。最后,对于文本数据中的标点符号,可以剔除掉,用空格来代替。
2.2结构化数据
通过上述步骤处理后,我们就有了训练语料库。但对于文本数据挖掘而言,运用机器学习模型或者深度学习模型来训练的话还远远不够。对于监督学习,无监督学习,半监督学习而言,监督学习在文本数据瓦解运用上来看目前效果较好,也是最合理的方式。因此我们需要对文本进行打标签(label),这对于回归与分类问题而言具有重要意义。最后,我们要将不同网页的文本数据单独保存为一个文档,然后添加这个文档数据的标签,整个数据集就由多个带标签的文档构成,也叫作文档库。于是数据就有了词汇——》文档——》文档库这么一个简单结构,有利于构成训练矩阵。最后对于部分结构数据中存在的NAN数值项,在大文本训练情况下将这类数据删除即可,数据量小的可以用数值0代替。
2.3 分词
中文分词原因与处理过程请见我另一篇文本主题分类文章,这里不再详述。
3.文本挖掘数值特征工程
首先,文本数据集内部全是各种str类型的文本分词数据,这类结构无法直接带入到计算机中进行计算。因此我们需要将数据进一步处理成能够让计算机计算,标注的一种矩阵结构。目前做法一般分两种。
3.1词袋模型(BOW)
此类方式通过忽略分词语义特征与前后顺序,直接将所有分词放在一个统一的文档集合中,统计每一个分词出现的次数,最后得出一个矩阵。矩阵的列代表每一个分词的出现次数,矩阵的行代表文档数量,在这篇文档出现了的分词次数为m,就在那个位置标注为m即可,其他没出现的文档位置直接标注0,这类矩阵即为词频矩阵,其横向维度即为分词数目,长度会很长,因此对于低频词影响没法忽略掉,需要进一步特征筛选。最后,这类矩阵可以直接带入模型中训练。而目前大部分使用的TF-IDF算法效果较好,其引入了逆文档频率IDF,在词频概率TF基础上计算的词频矩阵能更好的契合主题分类模型。
3.2词向量模型
这种方式通过one-hot编码将分词序列化。举个例子,我有段文本“今天天气好晴朗”经过分词处理后的结构变为“今天”,“天气”,“好”,”晴朗“。那么通过one-hot编码处理后的每一个分词向量即为:
“今天”=[1,0,0,0],”天气”=[0,1,0,0],”好”=[0,0,1,0],”晴朗”=[0,0,0,1],最后这个句子(文档)的词向量模型即为[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]].这样不同的文档词向量矩阵组合在一起就构成了一类高维度的文档集合词向量,矩阵的列代表词表大小即为分词个数,行代表文档个数。但考虑到对于分词而言,每一个词向量列元素只有其所在位置标1,而其他位置全部标0,这会造成数据分布不均问题。所以上述简单处理方式外,还有word2vec,doc2vec,fasttext模型进一步优化处理(fasttext,word2vec模型分类过程后续详谈)。有一种基于哈夫曼树的正负训练方式值得关注,其将正负表示词语语序排布问题,在树上正负分别表示左右处理方向,对于语言相似性判断有极大作用。最后,词向量模型高度抽象,无法直接带入统计机器学习模型训练,所以最好与深度学习模型进行嵌入训练,效果最佳。
3.3特征选取
经过编码处理后的矩阵词库大小依然太大,全部带入模型训练的话,拟合起来可能速度太慢。因此需要选择数据量合适,表征能力强,区分度大,经过编码处理后的分词作为训练数据集的特征。因此具体问题就回到了传统数据挖掘数据特征选取问题,一般采用卡方检验,信息增益,随机森林算法进行特征提取即可。
4.训练模型和调参
这一步就需要看你选择的模型来操作了,从大体上来讲,模型需要对数据进行拟合,要达到相应精度要求,除了确保数据质量高,特征选取合适外,还需要合理的调参设置。为了增强具体模型预测的泛化性,设置合理的L1,L2正则化项也是需要考虑的。此部分就不展开说了,后续结合实例再谈。
最后整个文本数据挖掘流程大致如此了,后续可以在这样处理框架下细化操作即可。