我使用word2vec从大型文档生成了一个标记列表的向量。给定一个句子,是否可以从句子中的标记向量中获取句子的向量。
答案 0 :(得分:70)
有不同的方法来获取句子向量:
答案 1 :(得分:22)
有可能,但不是来自word2vec。为了获得更高级别的句子(以及段落和文档),单词向量的组成是一个非常活跃的研究课题。没有一个最佳解决方案可以做到这一点,它实际上取决于你想要应用这些向量的任务。您可以尝试连接,简单求和,逐点乘法,卷积等。有几个出版物可供您学习,但最终您只需要进行实验,看看哪种最适合您。
答案 2 :(得分:20)
有几种方法可以获得句子的向量。每种方法都有优点和缺点。选择一个取决于你想用矢量执行的任务。
首先,您可以简单地平均来自word2vec的向量。根据{{3}},这种方法对于情绪分析任务表现不佳,因为它以与标准词袋模型相同的方式失去了单词顺序"并且"无法识别许多复杂的语言现象,例如讽刺"。另一方面,根据Le and Mikolov,"简单地平均文本中所有单词的单词嵌入已被证明是多个任务的强基线或特征,例如短文本相似度任务。一种变体是用它们的TF-IDF对单词向量进行加权,以减少最常见单词的影响。
Kenter et al. 2016开发的一种更复杂的方法是使用矩阵向量运算,按照句子的解析树给出的顺序组合单词向量。这种方法适用于句子情感分析,因为它依赖于解析。
答案 3 :(得分:15)
取决于用法:
1)如果您只想获得某些已知数据的句子向量。查看这些论文中的段落向量:
Quoc V. Le和Tomas Mikolov。 2014.句子和文件的分布式表示。 Eprint Arxiv,4:1188-1196。
一个。 M. Dai,C。Olah和Q. V. Le。 2015.带有段落向量的DocumentEmbedding。 ArXiv e-prints,7月。
2)如果您希望模型使用无监督方法估计未知(测试)句子的句子向量:
你可以查看这篇论文:
3)研究人员也在寻找RNN或LSTM网络中某层的输出,最近的例子是:
http://www.aaai.org/ocs/index.php/AAAI/AAAI16/paper/view/12195
4)对于gensim doc2vec,许多研究人员在使用基于预训练单词向量的doc2vec的论文后,无法获得良好的结果来克服这个问题。Facebook有SentEval项目用于评估句子向量的质量。
https://github.com/facebookresearch/SentEval
6)以下文章中有更多信息:
用于复述识别,语义文本相似度,自然语言推理和问答的神经网络模型
目前你可以使用'BERT':
Google发布源代码以及预训练模型。
https://github.com/google-research/bert
以下是将bert作为服务运行的示例:
答案 4 :(得分:10)
您可以在训练阶段获得句子的矢量表示(在单个文件中加入测试和训练句子,并运行从以下链接获得的word2vec代码)。
Tomas Mikolov here共享了sentence2vec的代码。 它假设一行的第一个单词是句子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(开发版)似乎有一种推断新句子向量的方法。查看https://github.com/gojomo/gensim/blob/develop/gensim/models/doc2vec.py
中的model.infer_vector(NewDocument)
方法
答案 5 :(得分:2)
我从以下方面得到了很好的结果:
答案 6 :(得分:1)
Google的通用句子编码器嵌入是针对此问题的更新解决方案。它不使用Word2vec,但会产生竞争解决方案。
答案 7 :(得分:0)
假设这是当前句子
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.
答案 8 :(得分:-1)
深度平均网络(DAN)可以提供句子嵌入,其中字二进制数被平均并通过前馈深度神经网络(DNN)传递。
发现使用句子嵌入的转移学习往往优于词级转移,因为它保留了语义关系。
您不需要从头开始训练,预训练的DAN模型可供阅读(在Google中心检查通用句子编码器模块)。