02.15 机器学习笔记02:文本预处理;语言模型;循环神经网络基础

文本预处理

1.1 读文本、文本预处理、特征提取和建模的基本过程

收集数据

总所周知,数据挖掘模型中非常重要的部分是训练模型,训练集与测试集便是整个数据挖掘过程中花费时间最多的过程。数据集通过有如下的一些途径获得:

经典数据集: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会改变词型。

重新去停用词。理由同上。


特征提取:

1、TF-IDF:

2、词频方法(Word Frequency):

3、文档频次方法(Document Frequency):

4、互信息(Mutual Information):

5、期望交叉熵(Expected Cross Entropy):

6、二次信息熵(QEMI):

7、信息增益方法(Information Gain):

8、x2统计量方法:

9、文本证据权(The Weight of Evidence forText):

10、优势率(Odds Ratio):

11、遗传算法(Genetic Algorithm, GA):

12、主成分分析法(Principal Component Analysis,PCA):

13、模拟退火算法(Simulating Anneal,SA):

14、N—Gram算法


文本建模:

LDA、pLSA、LSA


机器学习笔记02:文本预处理;语言模型;循环神经网络基础


语言模型

2.1HMM隐马尔可夫模型的参数估计方法

隐马尔可夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。

监督学习是由已知数据进行极大似然最大化求解

非监督学习是采用EM算法,EM算法是用于含有隐向量的模型中,进行参数学习的迭代算法

参考资料:https://mumaxu.github.io/2018/12/20/%E9%9A%90%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E6%A8%A1%E5%9E%8B/


机器学习笔记02:文本预处理;语言模型;循环神经网络基础


循环神经网络基础

以前写过:https://mp.weixin.qq.com/s/qrozPFFqOM_I8IsEWgcl0w


笔记:

定义模型

我们使用Pytorch中的`nn.RNN`来构造循环神经网络。在本节中,我们主要关注`nn.RNN`的以下几个构造函数参数:

* `input_size` - The number of expected features in the input x

* `hidden_size` – The number of features in the hidden state h

* `nonlinearity` – The non-linearity to use. Can be either 'tanh' or 'relu'. Default: 'tanh'

* `batch_first` – If True, then the input and output tensors are provided as (batch_size, num_steps, input_size). Default: False


这里的`batch_first`决定了输入的形状,我们使用默认的参数`False`,对应的输入形状是 (num_steps, batch_size, input_size)。


`forward`函数的参数为:

* `input` of shape (num_steps, batch_size, input_size): tensor containing the features of the input sequence.

* `h_0` of shape (num_layers * num_directions, batch_size, hidden_size): tensor containing the initial hidden state for each element in the batch. Defaults to zero if not provided. If the RNN is bidirectional, num_directions should be 2, else it should be 1.


`forward`函数的返回值是:

* `output` of shape (num_steps, batch_size, num_directions * hidden_size): tensor containing the output features (h_t) from the last layer of the RNN, for each t.

* `h_n` of shape (num_layers * num_directions, batch_size, hidden_size): tensor containing the hidden state for t = num_steps.


分享到:


相關文章: