zoukankan      html  css  js  c++  java
  • 文本挖掘预处理的流程总结

    近期半年一直忙于项目,博客也非常少更新咯。

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

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

    数据集通过有例如以下的一些途径获得:

    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处理。

    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算法,论文在这里

    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 Processing

    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。

      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)便是他的功绩。


    写了不少内容,时间也不早了,睡了。

  • 相关阅读:
    oracle实例的内存(SGA和PGA)调整,优化数据库性能
    Redhat 安装perl模块
    三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
    二、Java基础--02
    一、Java基础--01
    提醒用户收到短信
    手机屏幕更改
    查看手机信息和SIM卡信息
    还原和设置手机桌面背景
    wifi的开与关
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10510370.html
Copyright © 2011-2022 走看看