我们有将单词转换为向量的模型(例如 word2vec 模型)。是否存在将句子/文档转换为向量的类似模型,可能使用为单个单词学习的向量?
5 回答
1) Skip gram method: paper here and the tool that uses it, google word2vec
2) Using LSTM-RNN to form semantic representations of sentences.
3) Representations of sentences and documents. The Paragraph vector is introduced in this paper. It is basically an unsupervised algorithm that learns fixed-length feature representations from variable-length pieces of texts, such as sentences, paragraphs, and documents.
4) Though this paper does not form sentence/paragraph vectors, it is simple enough to do that. One can just plug in the individual word vectors(Glove word vectors are found to give the best performance) and then can form a vector representation of the whole sentence/paragraph.
这一切都取决于:
- 您正在使用哪个矢量模型
- 模型的目的是什么
- 您在将词向量组合成文档向量方面的创造力
如果您使用 Word2Vec 生成了模型,您可以尝试:
- Doc2Vec:https ://radimrehurek.com/gensim/models/doc2vec.html
- Wiki2Vec:https ://github.com/idio/wiki2vec
或者你可以做一些人做的事情,即将文档中的所有内容词相加并除以内容词,例如https://github.com/alvations/oque/blob/master/o.py#L13(注意:行17-18 是一种降低噪音的技巧):
def sent_vectorizer(sent, model):
sent_vec = np.zeros(400)
numw = 0
for w in sent:
try:
sent_vec = np.add(sent_vec, model[w])
numw+=1
except:
pass
return sent_vec / np.sqrt(sent_vec.dot(sent_vec))
一个稍微少一点现成的解决方案,但如果您有特定的事情要做,那么在准确性方面可能很难被击败:
构建一个 RNN(使用 LSTM 或 GRU 存储单元,在此处进行比较)并优化您尝试完成的实际任务的误差函数。你喂它你的句子,并训练它产生你想要的输出。输入句子后网络的激活是句子的表示(尽管您可能只关心网络输出)。
您可以将句子表示为 one-hot 编码字符序列、one-hot 编码单词序列或单词向量序列(例如GloVe或word2vec)。如果您使用词向量,您可以继续反向传播到词向量,更新它们的权重,因此您还可以获得针对您正在执行的任务专门调整的自定义词向量。
有很多方法可以回答这个问题。答案取决于您对短语和句子的解释。
这些word2vec
为每个单词提供向量表示的分布模型只能显示一个单词通常如何在基于窗口的上下文中与其他单词相关。基于对上下文-词关系的这种解释,您可以将句子中所有词的平均向量作为句子的向量表示。例如,在这句话中:
素食者吃蔬菜。
我们可以将归一化向量作为向量表示:
问题在于句子的组成性质。如果你取上面的平均词向量,这两个句子有相同的向量表示:
蔬菜吃素。
有很多分布式方式的研究通过语料库处理来学习树结构。例如:使用组合向量语法进行解析。该视频也解释了这种方法。
我想再次强调解释。这些句子向量在您的应用程序中可能有自己的含义。例如,在斯坦福的这个项目的情感分析中,他们所寻求的含义是一个句子的正面/负面情绪。即使你找到了一个句子的完美向量表示,如果你不能判断真值条件,也有哲学争论认为这些不是句子的实际含义(David Lewis “General Semantics” 1970)。这就是为什么有一些专注于计算机视觉的作品(本文或本文)。我的观点是,它完全取决于您对向量的应用和解释。
希望您欢迎实施。我在转换电影情节进行分析时遇到了类似的问题,在尝试了许多其他解决方案之后,我坚持使用一种使我的工作更容易的实现。代码片段附在下面。
从以下链接安装“spaCy” 。
import spacy
nlp = spacy.load('en')
doc = nlp(YOUR_DOC_HERE)
vec = doc.vector
希望这可以帮助。