如何从句子中标记的word2vec获取句子的向量


76

我已经使用word2vec从大型文档中生成了标记列表的向量。给定一个句子,可以从句子中标记的向量中获取句子的向量。

Answers:


91

有不同的方法来获取句子向量:

  1. Doc2Vec:您可以使用Doc2Vec训练数据集,然后使用句子向量。
  2. Word2Vec向量的平均值:您可以取一个句子中所有词向量的平均值。该平均向量将代表您的句子向量。
  3. 带有TF-IDF的Word2Vec向量的平均值:这是我推荐的最佳方法之一。只需采用单词向量并将其乘以TF-IDF分数即可。仅取平均值,它将代表您的句子向量。

4
为什么平均与总和?
弗雷德(Fred)

17
处理可变长度的句子
neel

2
您正在获取N个单词的w2v重复次数的平均值,该句子的长度为N;我明白了。但是为什么要求平均值而不是求和呢?(这也会为您提供可变长度句子的复合代表)
Fred


1
不知道为什么要对每个维度的值取平均值,可能是我们可以求和而仍然得到相似的结果。
Argho Chatterjee

32

有几种获取句子向量的方法。每种方法都有优点和缺点。选择一个取决于要对向量执行的任务。

首先,您可以简单地对word2vec中的向量进行平均。根据Le和Mikolov的说法,这种方法在情感分析任务上的效果很差,因为它“失去了与标准单词袋模型相同的单词顺序”,并且“无法识别许多复杂的语言现象,例如讽刺”。另一方面,根据Kenter等人的说法。2016年,“证明对文本中的所有单词进行简单的单词嵌入平均已被证明是跨多个任务的强大基线或功能”,例如短文本相似性任务。一种变体是用其TF-IDF加权单词向量,以减少最常见单词的影响。

Socher等人开发的一种更复杂的方法使用矩阵向量运算,按照句子的语法树给出的顺序组合词向量。该方法适用于句子情感分析,因为它依赖于分析。


25

有可能,但不是来自word2vec。为了获得句子(以及段落和文档)的更高级别表示,单词向量的组合是一个非常活跃的研究主题。没有最佳的解决方案来执行此操作,它实际上取决于要应用这些向量的任务。您可以尝试级联,简单求和,逐点乘法,卷积等。您可以从中学习一些出版物,但是最终您只需要进行试验并查看最适合的出版物。


2
我正在尝试使用标记向量对文档进行分类。由于令牌太多(200k),因此我想生成要分类的文档向量,这将大大减少因素(例如500)。想知道这是否可能。
审判

4
您可以从以下内容开始:1. Mitchell,2008年。基于向量的语义组成模型。[link](homepages.inf.ed.ac.uk/s0453356/composition.pdf)2. Blacoe,2012年。基于向量的语义组合表示比较。[link](aclweb.org/anthology/D12-1050
Claudiu

3
3.在向量空间模型中使用最近邻来检测多词表达的组成性(cl.cam.ac.uk/~dk427/papers/emnlp2013.pdf)4 .用于构造句子向量的词张量的先验歧义cs.ox.ac .uk / files / 5725 / karts_sadr_emnlp.pdf
Claudiu

感谢您的论文,感谢您对它的
批评

20

这取决于用法:

1)如果您只想获取某些已知数据的句子向量。在以下文件中查看段落向量:

Quoc V. Le和Tomas Mikolov。2014。句子和文档的分布式表示。Eprint Arxiv,4:1188-1196。

AM Dai,C.Olah和QV Le。2015年。与段落向量的DocumentEmbedding。ArXiv电子版,七月。

2)如果您希望模型使用无监督方法来估计未知(测试)句子的句子向量:

您可以查看这篇文章:

史蒂文·杜和张曦 2016。Aicyber在SemEval-2016任务4:基于i-vector的句子表示。在第十届国际语义评估研讨会(SemEval 2016)的会议记录中,美国圣地亚哥

3)研究人员也在寻找RNN或LSTM网络中特定层的输出,最近的例子是:

http://www.aaai.org/ocs/index.php/AAAI/AAAI16/paper/view/12195

4)对于gensim doc2vec,许多研究者未能克服此问题,因此未能获得良好的结果,随后论文基于预先训练的词向量使用doc2vec。

Jey Lau Lau和Timothy Baldwin(2016)。对doc2vec的经验评估,并具有对文档嵌入生成的实用见解。在第一届NLP代表性学习研讨会论文集中,2016。

5)tweet2vecsent2vec

Facebook拥有SentEval项目,用于评估句子向量的质量。

https://github.com/facebookresearch/SentEval

6)以下文件中有更多信息:

用于释义识别,语义文本相似性,自然语言推理和问题回答的神经网络模型


现在,您可以使用“ BERT”:

Google发布了源代码以及预训练的模型。

https://github.com/google-research/bert

这是一个将bert作为服务运行的示例:

https://github.com/hanxiao/bert-as-service


10

您可以在训练阶段获得句子的矢量表示(将测试和句子训练在一个文件中,并运行从以下链接获取的word2vec代码)。

Tomas Mikolov在此处共享了句子2vec的代码。它假定一行的第一个单词为句子ID。使用编译代码

gcc word2vec.c -o word2vec -lm -pthread -O3 -march=native -funroll-loops

并使用运行它

./word2vec -train alldata-id.txt -output vectors.txt -cbow 0 -size 100 -window 10 -negative 5 -hs 0 -sample 1e-4 -threads 40 -binary 0 -iter 20 -min-count 1 -sentence-vectors 1

编辑

Gensim(开发版本)似乎具有一种推断新句子向量的方法。model.infer_vector(NewDocument)https://github.com/gojomo/gensim/blob/develop/gensim/models/doc2vec.py中查看方法


2

我从以下方面取得了良好的效果:

  1. 对单词向量求和(使用tf-idf加权)。这会忽略单词顺序,但是对于许多应用程序来说就足够了(尤其是对于简短的文档)
  2. 斋戒


1

深度平均网络(DAN)可以提供句子嵌入,对单词二元语法进行平均并通过前馈深度神经网络(DNN)传递。

发现使用句子嵌入的转移学习由于保留了语义关系,因此往往胜过词级转移。

您无需从头开始训练,可以使用经过预先训练的DAN模型进行阅读(请检查Google Hub中的Universal Sentence Encoder模块)。


我相信您不赞成投票,是因为您没有回答这个问题。话虽这么说,对于不想使用自己训练有素的Word2Vec模型的人们来说,这种方法很方便。这是面向读者的链接:tfhub.dev/google/universal-sentence-encoder/2
Wok

-1

假设这是当前句子

import gensim 
from gensim.models import Word2Vec
from gensim import models
model = gensim.models.KeyedVectors.load_word2vec_format('path of your trainig 
dataset', binary=True)

strr = 'i am'
strr2 = strr.split()
print(strr2)
model[strr2] //this the the sentance embeddings.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.