【问题标题】:How can a sentence or a document be converted to a vector?如何将句子或文档转换为向量?
【发布时间】:2015-08-28 01:02:02
【问题描述】:

我们有将单词转换为向量的模型(例如 word2vec 模型)。是否存在将句子/文档转换为向量的类似模型,可能使用为单个单词学习的向量?

【问题讨论】:

  • @alvas,你能澄清你想要的答案吗?也许我可以帮忙。
  • @azarel,我只是在吸引人们对这篇文章的关注,如果有更多人回答,或许会发现一些不那么流行但很酷的方式将句子建模为向量跨度>

标签: vector nlp word2vec


【解决方案1】:

希望您欢迎实施。我在转换电影情节进行分析时遇到了类似的问题,在尝试了许多其他解决方案之后,我坚持使用一种使我的工作更容易的实现。下面附上代码sn-p。

following link. 安装“spaCy”

import spacy
nlp = spacy.load('en')
doc = nlp(YOUR_DOC_HERE)
vec = doc.vector

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这一切都取决于:

    • 您使用的矢量模型
    • 模型的目的是什么
    • 您在将词向量组合成文档向量方面的创造力

    如果您使用 Word2Vec 生成模型,您可以尝试:

    或者你可以做一些人做的事情,即将文档中的所有内容词相加并除以内容词,例如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))
    

    【讨论】:

    • 将最终结果与单词数相匹配不会使向量标准化。最好除以向量的大小:sent_vec / np.sqrt(sent_vec.dot(sent_vec))
    【解决方案3】:

    有很多方法可以回答这个问题。答案取决于您对短语和句子的解释。

    这些分布模型,例如word2vec提供每个单词的矢量表示,只能展示通常在与其他单词相关的窗口基础上下文中使用的单词。基于对语境词关系的解释,您可以将句子中所有单词的平均矢量作为句子的矢量表示。例如,在这句话中:

    素食主义者吃蔬菜。

    我们可以将规范化的矢量作为矢量表示:

    问题是句子的组成性质。如果您使用上面的平均字向量,这两个句子具有相同的矢量表示:

    蔬菜吃素食主义者。

    通过语料库处理学习树结构的分布方式有很多研究。例如:Parsing With Compositional Vector Grammars。这个video还解释了这种方法。

    我再次强调解释。这些句子矢量可能在您的申请中有自己的意义。例如,在@ 987654323的情绪分析中,他们正在寻求的含义是句子的正面/负面情绪。即使您发现一个句子的完美矢量表示,如果您无法判断真相(David Lewis“一般语义”1970),则存在哲学辩论,这些辩论不是句子的实际含义。这就是为什么有重点在计算机视觉上的作品(@ 987654324或@ 4987654325 @)。我的观点是它可以完全取决于您的应用和对向量的解释。

    【讨论】:

      【解决方案4】:

      现成的解决方案稍微少一些,但如果您有特定的事情要做,则在准确性方面可能很难被击败:

      构建一个 RNN(使用 LSTM 或 GRU 存储单元,comparison here)并优化您尝试完成的实际任务的误差函数。你喂它你的句子,并训练它产生你想要的输出。输入句子后网络的激活是句子的表示(尽管您可能只关心网络输出)。

      您可以将句子表示为 one-hot 编码字符序列、one-hot 编码词序列或词向量序列(例如 GloVeword2vec)。如果您使用词向量,您可以继续反向传播到词向量,更新它们的权重,因此您还可以获得针对您正在执行的任务专门调整的自定义词向量。

      【讨论】:

      • 当您有大量标记数据来进行有监督的 RNN 训练时,这是一个很好的解决方案。当您有大量未标记的数据时,我更喜欢在整个数据集上进行无监督 PV 嵌入。然后在较小的标记训练集上进行逻辑回归训练。
      • @justint 对于使用 RNN 的句子嵌入,据我所知,您不需要标记数据
      • @sarii 这是真的。您可以只预测下一个单词(进行语言建模),并可选择在标记数据上微调该网络。不过这个答案有点老了——如今,基于 Transformer 的架构通常在这样的语言任务中具有最佳性能。
      【解决方案5】:

      1) 跳过 gram 方法:paper here 和使用它的工具,google word2vec

      2)使用LSTM-RNN形成句子的语义表示。

      3) sentences and documents 的表示。本文介绍了段落向量。它基本上是一种无监督算法,可以从可变长度的文本片段(例如句子、段落和文档)中学习固定长度的特征表示。

      4) 虽然这个paper 不构成句子/段落向量,但它很简单。只需插入单个词向量(Glove word vectors 的性能最好),然后可以形成整个句子/段落的向量表示。

      5) 使用CNNsummarize 的文档。

      【讨论】:

      • 值得一提的是,哪种解决方案实际上是使用单个词向量来形成文档的向量。他们中似乎很少有人使用学习过的词向量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多