90

我已经使用 word2vec 从大型文档中生成了标记列表的向量。给定一个句子,是否有可能从句子中的标记向量中得到该句子的向量。

4

9 回答 9

102

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

  1. Doc2Vec:您可以使用 Doc2Vec 训练您的数据集,然后使用句子向量。
  2. Word2Vec 向量的平均值:你可以取一个句子中所有词向量的平均值。这个平均向量将代表您的句子向量。
  3. Word2Vec 向量与 TF-IDF 的平均值:这是我推荐的最佳方法之一。只需将词向量与它们的 TF-IDF 分数相乘即可。只需取平均值,它将代表您的句子向量。
于 2015-07-31T05:22:30.563 回答
38

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

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

Socher 等人开发的一种更复杂的方法。是使用矩阵向量操作,按照句子的解析树给定的顺序组合词向量。这种方法适用于句子情感分析,因为它依赖于解析。

于 2016-08-20T13:55:03.803 回答
27

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

于 2015-04-21T14:31:14.873 回答
24

这取决于用途:

1)如果您只想获取一些已知数据的句子向量。查看这些论文中的段落向量:

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

AM Dai、C. Olah 和 QV Le。2015. 带有段落向量的文档嵌入。ArXiv 电子版,7 月。

2)如果你想要一个模型用无监督的方法来估计未知(测试)句子的句子向量:

你可以看看这篇论文:

史蒂文杜和张曦。2016. Aicyber 在 SemEval-2016 任务 4:基于 i 向量的句子表示。在第 10 届语义评估国际研讨会 (SemEval 2016) 上,美国圣地亚哥

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

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

4)对于gensim doc2vec,很多研究人员都没有得到很好的结果,为了克服这个问题,下面的论文使用了基于预训练词向量的doc2vec。

Jey Han Lau 和 Timothy Baldwin (2016)。doc2vec 的实证评估与文档嵌入生成的实际见解。在第一届 NLP 表征学习研讨会论文集上,2016 年。

5) tweet2vecsent2vec

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

https://github.com/facebookresearch/SentEval

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

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


现在你可以使用“BERT”:

谷歌发布源代码以及预训练模型。

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

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

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

于 2016-03-30T04:21:29.487 回答
10

您可以在训练阶段获得句子的向量表示(加入测试并在单个文件中训练句子并运行从以下链接获得的 word2vec 代码)。

Tomas Mikolov在这里分享了 sentence2vec 的代码。它假设一行的第一个单词是句号。使用编译代码

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(开发版)似乎有一种方法来推断新句子的向量。查看https://github.com/gojomo/gensim/blob/develop/gensim/models/doc2vec.pymodel.infer_vector(NewDocument)中的方法

于 2015-04-27T09:05:09.827 回答
4

我从以下方面取得了不错的成绩:

  1. 对词向量求和(使用 tf-idf 加权)。这忽略了词序,但对于许多应用程序来说就足够了(尤其是对于短文档)
  2. 快送
于 2016-07-11T16:12:13.433 回答
3

Google 的 Universal Sentence Encoder 嵌入是针对此问题的更新解决方案。它不使用 Word2vec,但产生了一个竞争解决方案。

这是TFHub 和 Keras 的演练

于 2019-08-11T17:11:35.383 回答
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.
于 2019-12-09T15:37:08.377 回答
1

深度平均网络(DAN)可以提供句子嵌入,其中单词双元被平均并通过前馈深度神经网络(DNN)传递。

发现使用句子嵌入的迁移学习往往优于词级迁移,因为它保留了语义关系。

您无需从头开始训练,预训练的 DAN 模型可供仔细阅读(检查 Google Hub 中的 Universal Sentence Encoder 模块)。

于 2018-05-07T09:02:00.003 回答