最近半年一直忙于项目,博客也很少更新咯。有几个项目做了不少JS相关的工作,基本都可以利用现成的开源方案,诸如angularJs、requireJs、bootstrap、knockoutJs、TypeScript、Jquery等等;之后也有项目是无UI的,纯后端的内容,主要就是考虑并行、性能、模块化等;之后的很长一段时间便主要在处理文本挖掘相关的项目(英文项目)。今天正好有空也准备对文本挖掘预处理的流程做一些总结,希望是干货:
- 收集数据
总所周知,数据挖掘模型中非常重要的部分是训练模型,训练集与测试集便是整个数据挖掘过程中花费时间最多的过程。数据集通过有如下的一些途径获得:
- 经典数据集:Python NLTK 便提供了非常多经典的数据集。很多数据集都是手工标注而成,所以使用的时候不得不感叹工程的浩大。例如NLP中使用的Penn TreeBank,有兴趣的同学可以看看他们的论文《Building a Large Annotated Corpus of English: The Penn TreeBank》,那简直就是一部辛酸史啊!
- 从网页上抓取:直接动手写一个爬虫爬取特定的网页不难,通过正则表达式就能够将有效的内容提取出来;当然,发扬拿来主义精神的话,我们可以使用Python中一些优秀的库,比如scrapy,beautifulsoup 等等。
- 从日志、已有文件中分析:如果是海量数据的话可以使用hadoop这样的系统。结合传统SQL中的一些特殊功能,例如Partition,有时会有不错的效果,不过最多压缩空间、缩减特征再用SQL处理。
- 其他网络数据集:Stanford Large Network Dataset Collectionm,100+ Interesting Data Sets for Statistics
- 预处理
- 如果是网页内容,首先需要去掉Html Tag,lxml和html5lib是比较有名的Python库,beautifulsoup也对他们做了一层封装。不过别忘了,Python本身也自带了sgmllib这样的基本可扩展的解析器。如果是有特别的处理,其实正则表达式也是不错的选择。
- 处理编码,由于我主要是处理英文的数据,这一步基本也跳过了。
- 将文档分割成句子(可选)。很多时候我们采用的是词袋模型(bag of words),所以是否分割成句子也无所谓。比较简单的方法就是Python NLTK中的sent_tokenize()函数,用的是punkt算法,论文在这里。
- 将句子分割成词。首先用正则表达式可以自己完成;如果要利用已有工具,Python NLTK中的word_tokenize(),这个方式就是前文提到的Penn TreeBank语料库所使用的分词方法。听起来是不是很高大上,我是不会告诉你其实它也是正则表达式实现的,想知道具体实现,戳这里。分词其实主要干了这么几个事:1)将’分开. don't -> do n't, they'll -> they 'll; 2)将大部分标点当作单独的一个词; 3)将后一位是逗号或者引号的词分开; 4)单独出现在一行的句号分开。中文分词区别比较大,可以采用斯坦福或者ICTCLAS(中科院背景)的方案。
- 拼写错误纠正。推荐pyenchant,非常喜欢,因为简洁到四句语句就能完成。Windows 8中操作系统也直接提供了拼写检查的COM端口,不过就得多花时间研究啦。
- POS Tagging(根据实际应用)。还是Nltk,首页就有介绍;斯坦福也提供了这类工具。这一块属于NLP的范畴,还是Parsing等应用,要了解NLP原理推荐Coursera上一门不错的课程Natural Language Processing
- 去掉标点。正则表达式即可,有的时间非常短的单词也可以一起去掉,len<3的常见的选择
- 去掉非英文字符的词(根据实际应用决定)。
- 转换成小写。
- 去掉停用词。就是在各种句子中都经常出现的一些词,I、and什么的。NLTK有一个Stopwords。Matthew L. Jockers提供了一份比机器学习和自然语言处理中常用的停词表更长的停词表。中文停用词戳这里。什么?你问我停用词怎么找到的,我想大概是IDF这样的算法吧。
- 词型转换。简单来讲,我们希望do、did、done都能统一的返回do。第一种方法叫stem,Porter是比较常见的一种基于规则的算法,网页有snowball工具,也是它的论文。Porter的结果差强人意,单词末尾有e、y的,基本上stem之后都不间了,例如replace->replac;末尾有重复单词的,基本只剩一个了,例如ill->il。NLTK中也有Stem库,算法应该是类似的。第二种方法叫lemmatization,就是基于词典做词型转换,NLTK的Stem库中便有WordNetLemmatizer可以使用。
- 去掉长度过小的词(可选)。如果之前做了,这里要再做一次,因为stem会改变词型。
- 重新去停用词。理由同上。
- 训练
这个主题太大,不是这篇日志的重点。简单来讲,Python的
NLTK和
scikit.learn是非常优秀的工具,另外,R也是不错的一门语言。可视化的工具可以采用Weka、KNIME、Tanagra、RapidMiner 、Orange、GGobi等。这方面最好的课程当属Andrew Ng的
Machine Learning,那个识别猫脸的Google Brain(Deep Learning)便是他的功绩。
写了不少内容,时间也不早了,睡了。