NLP实践四-----词袋模型 + 词向量 + word2vec


Task4 文本表示:从one-hot到word2vec (2 days)
词袋模型:离散、高维、稀疏。
分布式表示:连续、低维、稠密。word2vec词向量原理并实践,用来表示文本。
参考:
word2vec 中的数学原理详解(一)目录和前言 - peghoty - CSDN博客 https://blog.csdn.net/itplus/article/details/37969519
word2vec原理推导与代码分析-码农场 http://www.hankcs.com/nlp/word2vec.html


词袋模型


Bag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Retrieval)领域.。对于自然语言处理来说,其原理就是把句子看着若干个单词的集合,不会考虑单词的出现顺序,仅仅考虑单词出现没有或者出现的频率,这样看来每一个句子都可能有高维、稀疏和离散的情况,即使通过n-gram来表征单词间的关联也会造成高维、稀疏的情况发生,所以缺点是明显:
比如.语义丢失, 表现为,词的顺序信息丢失,近义词没办法体现,假定词都是独立的,等等。
常见表示方法:one-hot,词频,tf-idf 等


分布式表示


随着深度学习的发展,为了更好的挖掘词语之间的信息特征,一种新的数据表示方法 也就是分布式表示(distributional representation)近年来获得了很大的成功,基本思想是把研究的对象表示成一个低维的稠密的实质的向量,那么这种向量的物理意义就是在于它能够把所有的这些对象都能够表示在一个语义的空间里。


q:为什么要叫分布式表示或者说它为什么会取这样名字?

低维向量里的每一维被单独取出来,它其实是没有任何的物理含义,只有当这些维集合在一起形成一个向量,它能够反映对象在空间里的具体位置,那么他才能够真正的反映对象本身的语音信息,这就是分布式表示的一个基本的思想。 分布式表示在自然语言处理领域里面具有非常多的优势。


word2vec

这家伙就是分布式表示的一种方法,它是生成词向量(一个词表现为一个向量,关键是我们怎么获得这个向量)的一种工具。
Q:什么是语言模型
语言模型简单来说就是一串词序列的概率分布,具体来说,语言模型的作用是为一个长度为 m 的文本确定一个概率分布 P,表示这段文本存在的可能性。
在实践中,如果文本的长度较长,P(wi | w1, w2, . . . , wi−1) 的估算会非常困难。因此,研究者们提出使用一个简化模型:n 元模型(n-gram model)。在 n 元模型中估算条件概率时,只需要对当前词的前 n 个词进行计算。在 n 元模型中,传统的方法一般采用频率计数的比例来估算 n 元条件概率。当 n 较大时,就会存在数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,一般也就用到三元模型。
为了缓解 n 元模型估算概率时遇到的数据稀疏问题,研究者们提出了神经网络语言模型。代表性工作是 Bengio 等人在 2003 年提出的神经网络语言模型,该语言模型使用了一个三层前馈神经网络来进行建模。其中有趣的发现了第一层参数,用做词表示不仅低维紧密,而且能够蕴涵语义,也就为现在大家都用的词向量(例如 word2vec)打下了基础。
其实,语言模型就是根据上下文去预测下一个词是什么,这不需要人工标注语料,所以语言模型能够从无限制的大规模单语语料中,学习到丰富的语义知识。


Q: 预训练的思想:我们知道目前神经网络在进行训练的时候基本都是基于后向传播(BP)算法,通过对网络模型参数进行随机初始化,然后通过 BP 算法利用例如 SGD 这样的优化算法去优化模型参数。
那么预训练的思想就是,该模型的参数不再是随机初始化,而是先有一个任务进行训练得到一套模型参数,然后用这套参数对模型进行初始化,再进行训练。
词向量也可以看成是第一层 word embedding 进行了预训练,此外在基于神经网络的迁移学习中也大量用到了这个思想。
Q:自然语言处理词向量怎么来:主要就是词向量怎么来,我们往往做的就是将词向量embedding到网络中去训练,经过这么多年的发展,word2vec,fasttext这些的副产物就是当做词向量的来使用。

word2vec的结构

word2vec可以理解成一种神经网络语言模型,有两种重要模型,CBOW和skip-gram模型,两个模型都包含输入层,投影层和输出层,前者是上下文预测中间的词语,后者是知道当前的词预测上下文,如下两图,
参考:https://zhuanlan.zhihu.com/p/50285707
在这里插入图片描述
在这里插入图片描述

通过这样的模型,我们就可以获得词向量(隐藏的矩阵),具体原理见:
https://blog.csdn.net/itplus/article/details/37969979


gensim 库训练词向量

下面直接使用一个例子来演示这种做法:
api参数:(参考:https://www.cnblogs.com/pinard/p/7278324.html)


  1. sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。

2) size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

3) window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

4) sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

5) hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

6) negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

7) cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

8) min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

9) iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

10) alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

11) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。


训练得到词向量:

from gensim.models import  word2vec
#文件是已经分好了的中文词语
sentences = word2vec.LineSentence('../data/in_the_name_of_people_segment.txt')

model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)

#输出相似的
req_count = 5
for key in model.wv.similar_by_word('沙瑞金', topn =100):
    if len(key[0])==3:
        req_count -= 1
        print( key[0], key[1])
        if req_count == 0:
            break

查看两个词的相似程度:


print (model.wv.similarity('沙瑞金', '高育良'))
print (model.wv.similarity('李达康', '王大路'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值