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

Posted

技术标签:

【中文标题】如何从句子中标记的word2vec中获取句子的向量【英文标题】:How to get vector for a sentence from the word2vec of tokens in sentence 【发布时间】:2015-06-27 22:46:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

为什么平均与总和? 处理变长句子 您正在对长度为 N 的句子取 N 个单词的 w2v 重复次数的平均值;我明白了。但是为什么平均与,例如总和? (这也可以让你获得可变长度句子的复合代表) 这里我找到了2-3 nadbordrozd.github.io/blog/2016/05/20/…的例子 求和的问题,就是句子的长度会留下很强烈的信号,如果你想抓住单词组合的本质,这个数据源就只是噪音.例如-考虑对句子进行聚类的努力。像“fast”这样非常短的句子往往与“fast fast fast”具有相同含义的长句子相去甚远【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

我正在尝试使用标记向量对文档进行分类。由于我有太多的标记(200k),我想生成要分类的文档的向量,这将大大减少因素(比如 500)。想知道这是否可能。 您可以从这些开始: 1. Mitchell,2008。基于向量的语义组合模型。 [链接](homepages.inf.ed.ac.uk/s0453356/composition.pdf) 2. Blacoe,2012。语义组合的基于向量表示的比较。 [链接](aclweb.org/anthology/D12-1050) 3.使用向量空间模型中的最近邻检测多词表达式的组合性 (cl.cam.ac.uk/~dk427/papers/emnlp2013.pdf) 4. 用于构建句子向量的词张量的先验消歧cs.ox.ac.uk/files/5725/karts_sadr_emnlp.pdf 感谢您的论文,不胜感激【参考方案4】:

这取决于用途:

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

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

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

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

你可以看看这篇论文:

Steven Du and Xi Zhang. 2016. Aicyber at SemEval-2016 Task 4: i-vector based sentence representation. In Proceedings of the 10th International Workshop on Semantic Evaluation (SemEval 2016), San Diego, US

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

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

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

Jey Han Lau and Timothy Baldwin (2016). An Empirical Evaluation of doc2vec with Practical Insights into Document Embedding Generation. In Proceedings of the 1st Workshop on Representation Learning for NLP, 2016.

5) tweet2vec 或 sent2vec .

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

https://github.com/facebookresearch/SentEval

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

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


现在您可以使用“BERT”:

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

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

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

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

【讨论】:

【参考方案5】:

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

tomas Mikolov here 分享了 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.py中的model.infer_vector(NewDocument)方法

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

这里是a walk-through with TFHub and Keras。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

我相信你被否决了,因为你没有回答这个问题。话虽如此,这种方法对于不想使用自己训练有素的 Word2Vec 模型的人来说很方便。这是读者的链接:tfhub.dev/google/universal-sentence-encoder/2【参考方案9】:

假设这是当前句子

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.

【讨论】:

以上是关于如何从句子中标记的word2vec中获取句子的向量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?

Sentence2vec和Word2vec涉及停用词和命名实体

用CNN对文本处理,句子分类(简单理解卷积原理)

将句子表示为向量(上):无监督句子表示学习(sentence embedding)

基于CNN的句子分类

如何从特征向量或单词生成句子?