思维导图:

https://www.processon.com/diagraming/5c6e214ee4b056ae2a10eb9c

本文争取以最短的文字,最简单的语言来描述NLP流程与w2v,详细原理会提供相应的链接.

写到一半发现还是有很多地方省略过去= =写的不够详细

1.NLP流程详解

1.1数据清洗

不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等(常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。)

1.2分词

( 分词 与 词性标注 还有 去停用词 在实际工作中调用  JIEBA分词包  即可.)

[调用方法直接百度即可]

(jieba分词原理主要使用的是字典分词,未登陆在内的未知词汇也会使用HMM来分词

jieba分词的词性标注的话,一般字典里都已经标注好词性.HMM)[与ICTCLAS兼容]

首先说明一下分词主流的三种方法,

(这三种方法内含的几种算法原理讲解:)

第一种也是最好理解的  基于词表分词,

通俗的讲就是根据设定好的字典来进行分词,字典里写着 伦敦奥运会,分词时就不会把 伦敦 和 奥运会分开.可以自己设定字典也可以调用现成的字典

第二种就是 基于统计的分词(N-gram)

相当于用一个能装下N个单词的窗口,一步一步的读取整个句子,以对每个单词的关联度和出现频率有相关的了解

第三种  基于序列标注的分词方法:

这一类方法中最通用的就是HMM隐马尔可夫来分词(详细原理)

1.3词性标注

给每个词一个词性,给出最有可能的词性.

就通用的就是HMM隐马尔可夫来标注(还有CRF等)(基于统计)

一般直接使用根据字典标注(根据字典)

1.4去停用词

标点符号、语气、人称等

1.5特征工程

(接下来将直接进入讲解w2v剩下流程将不再复述,完整流程可参考https://www.jianshu.com/p/b87e01374a65)

古老的办法是使用one-hot编码,多少个词就建造多少维的向量,比如00001000对应 北京这个词

如今的更好的办法是使用Word2vec,进行词向量转换,将每个词在空间上表现出来,并压缩在一个相对小的词空间,又名:词向量嵌入

 

2.word2vec

2.1基本原理(可以直接看数学原理)

不得不吐槽一下,网上资料翻了半年没一个讲训练word2vec模型是怎么训练出来的,训练集哪里来的?.词向量是怎么来的.(原本我也没注意到,用了几次就想到了这个问题),本以为万能的知乎会告诉我最通俗易懂的答案,可能关注度不够,没吸引来大神.

在我仔细研读了<NLP汉语自然语言处理>,,<word2vec中的数学原理详解>中对于这部分的介绍后,再加上一些网络资料后

基于以上资料,我认为word2vec的训练集就是他的测试集.(惯性思维害死人,因为一直有着训练集和测试集分开,过拟合的概念,形成了一个知识盲区.)词向量的训练是将十篇文章,单独拿一篇出来,取一个词和其他所有词,一个作为输入,一个作为输出,重点在于得到了这个训练完以后的模型.

通过这个模型,我们可以将其他的文章单词转化成比较准确的词向量.(个人理解,如有不对,请多多指教)

当然,你也可以直接使用网络上现成的大型词向量语料库或者是现成的模型拿来自己转换.

2.2数学原理

(以CBOW作为假设模型,以某个单词预测上下文)假设:输入一篇文章,这篇文章有10个单词,取最后一个单词作为输出,则这个单词前的所有单词都是输入(类似监督学习).设定词向量长度为100(维度:超参数),每个词变为一个000100000的one-hot编码,假设最后一个单词为00000 00001.将这9个1*10的one-hot向量分别乘以隐藏层的输入权重矩阵W=10(单词总数)*100维,

权重矩阵初始化(随机几个数){!!!两次输入都有一个偏置向量,就是一个常数}

得到9个1*100的向量,将9个向量相加求平均,得到一个1*100的向量,再乘以隐藏层输出权重矩阵W'  100*10,输出一个1*10的向量

1*10的向量经过激活函数(softmax)处理得到10-dim概率分布(10个位置的单词的预测值)

概率最大的那个位置对应的单词为预测的值.(哈夫曼树分布)

预测的值与真实值比较.(最后那个单词).误差越小越好(一般使用交叉熵来定义 loss function损失函数)

也就是说one-hot已经成功的转换成了词向量.

那么我们如何更新权重,来得到一个合适的权重矩阵,这样以后就不用再训练,可以直接输入one-hot得到词向量了

这就要根据<word2vec中的数学原理详解>中的讲解,

使用了随机梯度上升的办法来优化参数,这里也没法简洁的说,具体推导过程请看对应链接


 

2.3skip-gram与CBOW

这两个就不详细讲了,基本网上一搜都有.给看官们一些链接吧


 

2.4 优化方法

第一种是构建一个哈夫曼树,第二种是只取对模型改变大的数据进行梯度下降,但在小梯度的训练集中随机抽取一部分做梯度下降

具体详情

https://zhuanlan.zhihu.com/p/26306795