词嵌入:探索解释和利用

来源:互联网 发布:java 打印model.map 编辑:程序博客网 时间:2024/06/01 15:00

词嵌入定义:对于一系列语言建模和特征学习技术的集合名称,在自然语言处理领域中文本库中词或短语被映射到一个实值向量。
这个向量反映了就形态学/ 词-内容表达/ 全局语料统计/ 词层次结构/文本建的关系和他们包含的项之间的词结构。
所有词嵌入的思想是去捕获其语义/形态/内容/层次信息等等。在实践中特定任务中可能某一个方法会比其他的都好,例如LSA在处理低维空间来自相同领域的文本,其已经被处理成term-document矩阵。

one-hot encoding (CountVectorizing)
最基本和朴素的方法对于转化词到向量是数数在每个文本中词的出现频次。这个称为countvectorizing或者one-hot encoding。思想是首席一系列文档(可以是词,句子,段落,或者文章)并数数每个词的出现频次。得到的结果矩阵中列是词, 行是文本。

from sklearn.feature_extraction.text import CountVectorizer
# create CountVectorizer object
vectorizer = CountVectorizer()
corpus = [
‘This is the first document’,
‘This is the second document’,
‘This is the last document’
]
X = vectorizer.fit_transform(corpus)
vectorizer.get_feature_names() == (
[‘first’, ‘second’, ‘last’, ‘the’, ‘document’]
)
X.toarray()
vectorizer.transform([‘This is a new document’]).toarray()

这种方式的输出有时候称为稀疏矩阵,当X大多数元素都是0。
TF-IDF 转化
这个方法的思想是通过利用有用的统计度量称为tf-idf来权衡term。 有大量语料时,例如’a’, ‘the’, ‘is’这些出现很频繁但没有具体含义。使用Onehot 编码方法我们会看到这些词不是那么稀疏,这些词很重要并带有大量信息。一种方法去解决这个问题是停用词过滤,但这个解是离散的,对领域不固定。
对停用词的一个朴素解是使用统计量,
tfidf(term,document)=tf(term,document)idf(term)
第一项称为term frequency词频,也就是简单的平均在所有文档中该词出现的次数:

tf(term,document)=niVk=1nk

第二项是idf,表示文档频率的逆,也就是文档数的倒数,取个对数:
idf(term)=logNnt

在之前方法中,我们i行j列的词在文档出现n次,我们采用相同的CountVectorizer矩阵计算,使用tf-idf分数来代替之前所有元素。

from sklearn.feature_extraction.text import TfidfTransformer
# create tfidf object
transformer = TfidfTransformer(smooth_idf = False)
#X 从之前片段中使用X.toarray()转化得到
X = [[4,0,1], [2,0,2], [3,4,0],[2,0,2], [3,1,0], [3,0,2]]
#从词汇表中学习并存储tf-idf稀疏矩阵
tfidf = transformer.fit_transform(counts)
tfidf.toarray()

Word2Vec
Word2Vec是第一个神经嵌入模型,被大家广泛使用。它演化出Doc2Vec,也是对段落表达很流行的模型。
有三种Word2vec类型的参数学习,所有都是基于神经网络模型。
One-word context
这个思想是我们考虑每个上下文环境考虑一个词(我们基于给定的一个词来预测一个词),这个方法经常指的是CBOW模型,神经网络架构是我们有one-hot 编码的向量作为V*1的输入,输入层到隐藏层的权重矩阵W 大小为V*N, 隐藏层到输出层权重W’ 大小为N*V, 最后一步激活使用softmax函数。我们目标是计算下面的概率分布,下标I词的向量表达:p(wj|wI)
我们假设输入向量x, 全为0, 并且在k位置有一个1,隐藏层h为:h=WTx=vTWI
现在我们可以称h为词x的输入向量。词汇表中每个词都有输入和输出表达;权重W的i行是词i的输入向量表达。
神经网络的下一步,我们使用h向量并做以下运算:
uj=vTwjh
v’表示词w下标为j的输出向量,对于每个实体u下标为j我们做这个乘法操作。
激活步骤使用标准softmax函数(之后会替代为负采样或者层次softmax技术):

p(wj|wI)=yj=exp(uj)Vj=1exp(uj)

这里写图片描述
Multi-word context
这个模型和one-word context没有差别,除了我们想得到的概率分布类型和隐藏层的类型。多词上下文的解读是我们希望预测多项式分布给定超过一个context次而且许多存储了关于目标词和其他词之间的关系。
我们的概率分布:p(wO|w1,1,,wi,c)
我们改变隐藏层函数为:h=1CW(x1+x2++xC)

代价函数为:

logp(wO|w1,1,,wi,c)

这里写图片描述
skip-gram model
和CBOW多词模型相反:我们预测c个上下文词,只有一个目标词作为输入。然后我们的目标函数为:
1Tt=1Tcjclogp(wt+j|wt)

-c和c表示上下文窗口的限制,下标t的词是遍历语料库中每个词。
我们的第一步是得到隐藏层:h=WTx=vTwI
输出层(没有激活)得到:

uc,j=uj=vTwjh

在输出层,我们计算c个多项式分布;每个输出平面共享相同的权重从隐藏层到输出层权重W’,输出值的激活函数使用softmax,根据c个平面改变一点记号:p(wc,j=wO,c|wI)=yc,j=exp(uc,j)Vj=1exp(uj)
这里写图片描述

from gensim.models import word2vec
corpus = [‘Text of the first document.’,
‘Text of the second document made longer.’,
‘Number three.’,
‘This is number four.’,]
tokenized_sentences = [sentence.split() for sentence in corpus]
model = word2vec.Word2vec(tokenized_sentences, min_count =1)

GloVe(global vectors for word representation)
全局词表达方法被用来捕获一个词嵌入带着整个观察的语料的结构;词频和共同出现计数是主要度量。Glove模型训练全局词的共同出现计数并使用最小二次误差统计,结果是产生一个带有有意义的子结构的词向量空间。这样的框架保留了带向量距离的词相似度。
为了存储这样的信息我们使用共同出现矩阵X, 每个实体对应着词j出现在词i的上下文的次数。Pij=P(j|i)=XijXi表示下标j的词出现在词i的上下文的概率。
我们首先顶一个函数F:

F(wi,wj,wk~)=PikPij

其依赖于两个下标i和j的词向量和单独的下标为k的上下文内容向量。F编码信息,呈现为比率;

原创粉丝点击