文本挖掘预处理的流程总结

近期半年一直忙于项目,博客也很是少更新咯。css

有几个项目作了很多JS相关的工做,基本都可以利用现成的开源方案。诸如angularJs、requireJs、bootstrap、knockoutJs、TypeScript、Jquery等等;以后也有项目是无UI的,纯后端的内容,主要就是考虑并行、性能、模块化等;以后的很是长一段时间便主要在处理文本挖掘相关的项目(英文项目)。今天正好有空也准备对文本挖掘预处理的流程作一些总结,但愿是干货:html

  • 收集数据
总所周知,数据挖掘模型中很是重要的部分是训练模型,训练集与測试集即是整个数据挖掘过程当中花费时间最多的过程。

数据集经过有例如如下的一些途径得到:html5

  1. 经典数据集:Python NLTK 便提供了很是多经典的数据集。很是多数据集都是手工标注而成,因此使用的时候不得不感叹project的浩大。好比NLP中使用的Penn TreeBank。有兴趣的同窗可以看看他们的论文《Building a Large Annotated Corpus of English: The Penn TreeBank》。那简直就是一部辛酸史啊!
  2. 从网页上抓取:直接动手写一个爬虫爬取特定的网页不难。经过正則表達式就可以将有效的内容提取出来。固然,发扬拿来主义精神的话。咱们可以使用Python中一些优秀的库。比方scrapybeautifulsoup 等等。
  3. 从日志、已有文件里分析:假设是海量数据的话可以使用hadoop这种系统。

    结合传统SQL中的一些特殊功能,好比Partition,有时会有不错的效果。只是最多压缩空间、缩减特征再用SQL处理。python

  4. 其它网络数据集:Stanford Large Network Dataset Collectionm100+ Interesting Data Sets for Statistics

  • 预处理
  1. 假设是网页内容,首先需要去掉Html Tag。lxmlhtml5lib是比較有名的Python库,beautifulsoup也对他们作了一层封装。只是别忘了。Python自己也自带了sgmllib这种基本可扩展的解析器。假设是有特别的处理。事实上正則表達式也是不错的选择。

  2. 处理编码,因为我主要是处理英文的数据,这一步基本也跳过了。

  3. 将文档切割成句子(可选)。

    很是多时候咱们採用的是词袋模型(bag of words),因此是否切割成句子也无所谓。比較简单的方法就是Python NLTK中的sent_tokenize()函数,用的是punkt算法,论文在这里web

  4. 将句子切割成词。首先用正則表達式可以本身完毕;假设要利用已有工具。Python NLTK中的word_tokenize(),这个方式就是前文提到的Penn TreeBank语料库所使用的分词方法。听起来是否是很是高大上。我是不会告诉你事实上它也是正則表達式实现的。想知道详细实现。戳这里。分词事实上主要干了这么几个事:1)将’分开. don't -> do n't, they'll -> they 'll; 2)将大部分标点看成单独的一个词; 3)将后一位是逗号或者引號的词分开; 4)单独出现在一行的句号分开。中文分词差异比較大,可以採用斯坦福或者ICTCLAS(中科院背景)的方案。
  5. 拼写错误纠正。推荐pyenchant。很是喜欢,因为简洁到四句语句就能完毕。

    Windows 8中操做系统也直接提供了拼写检查的COM端口,只是就得多花时间研究啦。算法

  6. POS Tagging(依据实际应用)。仍是Nltk。首页就有介绍;斯坦福也提供了这类工具。

    这一块属于NLP的范畴,仍是Parsing等应用,要了解NLP原理推荐Coursera上一门不错的课程Natural Language Processingbootstrap

  7. 去掉标点。正則表達式就能够。有的时间很是短的单词也可以一块儿去掉。len<3的常见的选择
  8. 去掉非英文字符的词(依据实际应用决定)。
  9. 转换成小写。
  10. 去掉停用词。就是在各类句子中都常常出现的一些词,I、and什么的。

    NLTK有一个StopwordsMatthew L. Jockers提供了一份比机器学习和天然语言处理中常用的停词表更长的停词表。中文停用词戳这里。什么?你问我停用词怎么找到的。我想大概是IDF这种算法吧。后端

  11. 词型转换。

    简单来说,咱们但愿do、did、done都能统一的返回do。第一种方法叫stem,Porter是比較常见的一种基于规则的算法。网页有snowball工具。也是它的论文。Porter的结果差强人意,单词末尾有e、y的。基本上stem以后都不间了,好比replace->replac。末尾有反复单词的。基本仅仅剩一个了,好比ill->il。api

    NLTK中也有Stem库。算法应该是类似的。网络

    另一种方法叫lemmatization,就是基于词典作词型转换,NLTK的Stem库中便有WordNetLemmatizer可以使用。

  12. 去掉长度太小的词(可选)。假设以前作了。这里要再作一次。因为stem会改变词型。
  13. 又一次去停用词。理由同上。


  • 训练
这个主题太大。不是这篇日志的重点。

简单来说。Python的NLTKscikit.learn是很是优秀的工具,另外,R也是不错的一门语言。

可视化的工具可以採用Weka、KNIME、Tanagra、RapidMiner 、Orange、GGobi等。这方面最好的课程当属Andrew Ng的Machine Learning。那个识别猫脸的Google Brain(Deep Learning)即是他的功绩。


写了很多内容,时间也不早了,睡了。
相关文章
相关标签/搜索