TF-IDF原理及word2vec详解Keras实现CBOW和Skip-Gram

文本处理的Roadmap:
https://zhuanlan.zhihu.com/p/70361361
1.TF-IDF? 特征工程+分类器
2.embedding:word2vec
3.GPT,BERT
4.表征学习(Deep learning is representation learning)
5.RNN(Recurrent Neural Networks)

TF-IDF原理概述

在一份给定的文件里,词频(term frequency, TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否)

逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

综上TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF,TF为词频,IDF反文档频率。

词频(TF) = 某个词在文章中的出现次数 / 文章总词数
逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)
TF-IDF = 词频(TF) * 逆文档频率(IDF)

Word2vec
运用神经网络将V维的词向量 通过权重矩阵Vd转换为 d维词向量。输入为word bag中V个词中的一个词,已经转换为V维 one-hot编码, 通过权重矩阵W, 得到输出1d维的H, 再经过softmax d*V维转换成为V维的词向量。输出含义:条件概率
还可以用训练好的H权重,将V维的one-hot词向量转化为d维的词向量。

CBOW和Skip-Gram
在这里插入图片描述
在这里插入图片描述
CBOW
Continuous Bag-of-Words

原理介绍:
https://zhuanlan.zhihu.com/p/44599645
http://www.360doc.cn/mip/895906230.html
假设目标词 前后各取k个词,即窗口的大小是k,那么CBOW模型预测的将是
在这里插入图片描述
练CBOW模型,该模型的结构如下图:在这里插入图片描述
问题:
输入层到隐藏层以图2为例,输入层是四个词的one-hot向量表示,分别为 在这里插入图片描述
(维度都为V x 1,V是模型的训练本文中所有词的个数),记输入层到隐藏层的权重矩阵为 W(维度为V x N,N是认为给定的词向量维度),隐藏层的向量为h (维度为N x 1),那么 其实这里就是一个简单地求和平均。
在这里插入图片描述
隐藏层到输出层
记隐藏层到输出层的权重矩阵为W’ (U) (维度为N x V),输出层的向量为 (维度为V x 1),那么
在这里插入图片描述
注意,输出层的向量y与输入层的向量为x虽然维度是一样的,但是y并不是one-hot向量,并且向量 y中的每个元素都是有意义的。后将1V的向量softmax归一化处理得到新的1V向量,在V个取值中概率值最大的数字对应的位置所表示的词就是预测结果。

负采样
负采样实际上是采样负例来帮助训练的手段,其目的与层次softmax一样,是用来提升模型的训练速度。我们知道,模型对正例的预测概率是越大越好,模型对负例的预测概率是越小越好。由于正例的数量少,很容易保证每个正例的预测概率尽可能大,而负例的数量特别多,所以负采样的思路就是根据某种负采样的策略随机挑选一些负例,然后保证挑选的这部分负例的预测概率尽可能小。所以,负采样策略是对模型的效果影响很大,word2vec常用的负采样策略有均匀负采样、按词频率采样等等。

代码实现:
https://blog.csdn.net/qq_34862636/article/details/103834058
training输入输出是什么
在这里插入图片描述
CBOW是用某一个词的上下文(前面几个和后面几个)去预测它本身。
右边:
第一个input层, 假设window设置为5,那么就是用前5个词和后5个词去预测当前词,所以模型的输入是上下文,也就是10个词。
第一个Embedding层表示将要映射的词向量维度为128,那就成了10*128的张量。
第一个lambda层,其做的是加法,将10个128维的词向量同一维度直接加在一起形成了一个128维的张量。
左边:
第二个输入层输入的就是当前词,也就是1个词。
第二个lambda层做的是抽样,随机构造15个跟当前词不一样的词作为负样本。
第三个lambda层将输入的当前词和负样本拼接到一起。嵌入2次,分别得到W和b,也就是softmax_weights和softmax_bias
在第四个lambda层将右边第一个lambda输出的input_vecs_sum的向量推展一维,才能和softmax_weights进行dot,完成Dense(Wx+b)和Softmax的操作。
最后整个模型的输出的是softmax的值,其有16维实际上是模型预测当前词是正例(1个)和负例(抽样的15个)的概率值,这就做到了通过输入上下文来识别当前词,且识别范围(解空间)由原先的所有词,限制到了负采样个数+1内,这就大大地加快了训练速度。而我们所需要的词向量就是右边的Embeding层,也就是第一个嵌入层的权重。

 具体代码参考链接 代码:

详细解释将参考另一篇文章

 data_generator(): #训练数据生成器
	    x,y = [],[]
	    for sentence in corpus:
	        sentence = [0]*window + [word2id[w] for w in sentence if w in word2id] + [0]*window
	        #上面这句代码的意思是,因为我们是通过滑窗的方式来获取训练数据的,那么每一句语料的第一个词和最后一个词
	        #如何出现在中心位置呢?答案就是给它padding一下,例如“我/喜欢/足球”,两边分别补窗口大小个pad,得到“pad pad 我 喜欢 足球 pad pad”
	        #那么第一条训练数据的背景词就是['pad', 'pad','喜欢', '足球'],中心词就是'我'
	        for i in range(window, len(sentence)-window):
	            x.append(sentence[i-window: i]+sentence[i+1: window+i+1])
	            y.append([sentence[i]]+get_negtive_sample(sentence[i], nb_word, nb_negative))
	
	    x,y = np.array(x),np.array(y)
	    z = np.zeros((len(x), nb_negative+1))
	    z[:,0]=1
	    return x,y,z			

``

如何用,比如用训练好的weight值计算词向量相似度的方法:

model.save_weights('word2vec.model')

#embedding层的权重永远在模型的第一层
embeddings = model.get_weights()[0]

def most_similar(w):
    v = embeddings[word2id[w]]
    sims = np.dot(embeddings, v)
    sort = sims.argsort()[::-1]
    sort = sort[sort > 0]
    return [(id2word[i],sims[i]) for i in sort[:10]]

import pandas as pd
pd.Series(most_similar(u'科学'))

Skip-Gram

Skip-Gram的模型图与CBOW恰好相反,如图4所示。
在这里插入图片描述
从图中可以看出,Skip-Gram模型预测的是 在这里插入图片描述
,由于图中词wt 前后只取了各两个词,所以窗口的总大小是2。假设词 wt前后各取k个词,即窗口的大小是k,那么Skip-Gram模型预测的将是
在这里插入图片描述
输入层到隐藏层
输入层是词的one-hot向量表示,分别为 xt(维度都为V x 1,V是模型的训练本文中所有词的个数),记输入层到隐藏层的权重矩阵为 W (维度为V x d,d是认为给定的词向量维度),隐藏层的向量为 (维度为d x 1),那么
在这里插入图片描述
隐藏层到输出层

记隐藏层到输出层的权重矩阵为 U(维度为d x V),输出层的向量为 y (维度为V x 1),那么
在这里插入图片描述
在代码实现层面,加入负采样的方法,首先输入一个中心词,要从一群正确的周围词和负样本中,去使模型预测这些周围词的概率最大化,因此模型的输出是一个multi-hot向量(因为预测结果有多个正确的周围词),这里就不能再使用softmax去计算概率,而应该用sigmoid去分别计算每一个周围词的概率。这是skip-gram与CBOW模型上最显著的不同。
(sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在这里插入图片描述
)(Softmax 回归模型是解决多类回归问题的算法, 在这里插入图片描述
)

参考代码

假如window=2, 输出sigmoid为4

def data_generator(): #训练数据生成器
    x,y = [],[]

    for sentence in corpus:
        sentence = [0]*window + [word2id[w] for w in sentence if w in word2id] + [0]*window
        #上面这句代码的意思是,因为我们是通过滑窗的方式来获取训练数据的,那么每一句语料的第一个词和最后一个词
        #如何出现在中心位置呢?答案就是给它padding一下,例如“我/喜欢/足球”,两边分别补窗口大小个pad,得到“pad pad 我 喜欢 足球 pad pad”
        #那么第一条训练数据的背景词就是['pad', 'pad','喜欢', '足球'],中心词就是'我'
        for i in range(window, len(sentence)-window):
            X.append([sentence[i]])
            surrounding = sentence[i-window: i]+sentence[i+1: window+i+1]+ge
            y.append(surrounding+get_negtive_sample(surrounding, nb_word, nb_negative))    x,y = np.array(x),np.array(y)
    z = np.zeros((len(x), nb_negative+len(surrounding)))
    z[:,:len(surrounding)]=1
    return x,y,z

x 为中心词训练语料,y 是周围词+nb_negative 个负样本,因为我们是将正确的周围词放在 y 的最前面,因此在构造 z 时,把标签 1 放在每条 label 数据的前len(surrounding)位。输出 z[0],可以看到是[1,1,1,…,0]。

RNN

Recurrent Neural Network Model https://blog.csdn.net/qq_40589923/article/details/79436259
Vanishing gradients with RNNs https://blog.csdn.net/qq_40589923/article/details/79436714(梯度消失GR/LSTM和梯度爆炸gradient
clipping)
Long Short Term Memory (LSTM) https://blog.csdn.net/qq_40589923/article/details/79436802

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页