怎样用word2vec来得到某几个词的向量表示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用word2vec来得到某几个词的向量表示相关的知识,希望对你有一定的参考价值。

string为你需要获取向量的词,
double[] array = vec.getWordVector(string);
array是这个词的向量。
首先在创建vec的时候要保证.minWordFrequency(1),否则有些词你是得不到向量的,这个方法是设置词的最小使用频率。
参考技术A model=Word2Vec(set some params)
model.build_vocab(sentences)
model.train(sentences)
model.save(fielname)本回答被提问者采纳

论文阅读From Word Embeddings To Document Distances

论文介绍的WMD(Word Mover‘s Distance)是一个基于词嵌入(word embedding)计算两个文本的距离。

本文跳过词嵌入的介绍,直接进入WMD的实现过程。

 

词的相似性

假设我们有一个包含$n$个词的词典库,用word2vec训练好的这$n$个词的矩阵为:

$$X in R^{d*n} ag{1}$$

矩阵$X$中的第$i$列,$x_i$是一个$d$维向量,表示第$i$个单词的词向量。

这样两个词之间的相似性可以通过词向量之间的欧氏距离(Euclidean distance)来表示:

$$c(i, j) = |||x_i - x_j||_2 ag{2}$$

这里,第$i$个词和第$j$个词之间的相似性记为$c(i, j)$,即等于两者的词向量$x_i$和$x_j$之间的欧氏距离。

 

文本间距

对于一篇文本,我们可以用归一化的nBOW(normalized bag-of-words)向量$d$表示:

$$d = (d_1, d_2, cdots, d_i, cdots, d_n) ag{3}$$

$$d_i = frac{c_i}{sum_{j=1}^{n} c_j} ag{4}$$

现在有两篇文本,它们的nBOW表示分别为$d$和$d‘$。

对于文本之间的距离度量,我们先定义一个矩阵$T in R^{n*n}$,按照我自己的理解,矩阵$T$中一项$T_{ij}$按是$d$中的第$i$个词有多大的可能转换到$d‘$中的第$j$个词(原文: Let  $T ∈ R^{n×n}$ be a (sparse) flow matrix where $T_{ij} ≥ 0$ denotes how much of word $i$ in $d$ travels to word $j$ in $d‘$)。

为了使$d$全部翻译成$d‘$,需要满足一下条件,输出流$sum_j T_{ij} = d_i$,输入流$sum_i T_{ij} = d_j‘$

我们可以这样定义两个文本之间的距离:$d$中的每一个词与$d‘$中的每一个词的之间的相似性的加权和:即

$$sum_{i,j} T_{ij} c(i, j)$$,找出文本之间距离最小的值,即是我们的最优解。

egin{align*}
& min_{T geq 0} sum_{i,j} T_{ij} c(i, j) \
& s.t. ,,,,,, sum_{j=1}^n T_{ij} = d_i ,, forall i in {1, cdots, n} \
& sum_{i=1}^n T_{ij} = d_j‘ ,, forall j in {1, cdots, n} ag{5}
end{align*}

 

快速计算文本间距

理论由于WMD的最优问题的时间复杂度是$O(p^3 log p)$,这里$p$表示$d$中有多个词,重复不计。

因为对计算大文本间的WMD距离需要的时间是非常大,所以,有必要采取一些trick,近似得到我们要计算的目标。 

WCD

我们知道,一个文本$d$可以用nBOW向量表示,$d = (d_1, d_2, cdots, d_i, cdots, d_n)$,向量中的第$i$个词可以用词库中第$i$个词在这个文本中出现次数与文本总词数(去除停用词)之比。

由word2vec得到词向量矩阵$X = (x_1, x_2, cdots, x_i, cdots, x_n)$,其中$x_i$表示词库中第$i$个词的词向量。

那么$d_i * x_i$表示这个本文中第i个词的词向量的加权($d_i$)表示。

所以,文本$d$可以用向量$Xd = sum_i d_i x_i$表示。

定义$||Xd - Xd‘||_2$为两个文件的WCD(Word centroid distance)。

由三角形不等式(https://en.wikipedia.org/wiki/Triangle_inequality#Generalization_to_higher_dimensions),知对于$p-norm$有

$${||x||}_p = {(sum_{i=1}^n {|x_i|}^p)}^{1/p} ag{6}$$

当$p=2$时,$p-norm$表示的是欧氏距离。

对于WMD,我们有:

egin{align*}
sum_{i=1, j=1}^n T_{ij} c(i,j)
&= sum_{i=1, j=1}^n T_{ij} {||x_i - x_j‘||}_2 \
&= sum_{i=1, j=1}^n {||T_{ij}(x_i - x_j‘)||}_2 \
&geq {||sum_{i=1, j=1}^n T_{ij}(x_i - x_j‘)||}_2 \
&= {||sum_{i=1}^n {(sum_{j=1}^n T_{ij}) x_i} - sum_{j=1}^n {(sum_{i=1}^n T_{ij}) x_j}||}_2 \
&= {||sum_{i=1}^n {d_i x_i} - sum_{j=1}^n {d_j‘ x_j‘}||}_2 \
&= {||Xd - Xd‘||}_2 ag{7}
end{align*}

所以,WCD是WMD的下界,时间复杂度是$O(dp)$,可以通过WCD近似得出WMD。

 

RWMD

为了进一步提升WMD的下界,我们可以通过放松下WMD计算的约束条件,论文中给出的是放弃约束$sum_{i=1}^n T_{ij} = d_j‘ ,,, forall i in {1, cdots, n}$

同时定义$T_{ij}^{ast}$

$$T_{ij}^{ast} = egin{cases}
& d_i,  ext{ if } j = argmin_j c(i,j) \
& 0,  ext{ otherwise }
end{cases} ag{8}$$

所以有

egin{align*}
sum_{i,j} T_{ij} c(i, j)
&geq sum_{j} T_{ij} c(i, j^{ast}) \
&= c(i, j^ast ) sum_{j} T_{ij} \
&= c(i, j^ast ) d_i \
&= sum_j T_{ij}^{ast} c(i, j) ag{9}
end{align*}

未完待续... ...

以上是关于怎样用word2vec来得到某几个词的向量表示的主要内容,如果未能解决你的问题,请参考以下文章

word2vec是如何得到词向量的

word2vec

文本分布式表示:用tensorflow和word2vec训练词向量

第二节 获取词向量的工具——Word2Vec

论文阅读From Word Embeddings To Document Distances

论文阅读From Word Embeddings To Document Distances