【问题标题】:Can I obtain Word2Vec and Doc2Vec matrices to calculate a cosine similarity?我可以获取 Word2Vec 和 Doc2Vec 矩阵来计算余弦相似度吗?
【发布时间】:2019-11-20 10:46:47
【问题描述】:

我正在处理文本数据,目前我已将数据放入术语文档矩阵并计算 TF,术语频率和 TF-IDF,术语频率逆文档频率。从这里我的矩阵看起来像:

列 = 文档名称

行名 = 单词

充满了他们的 TF 和 TF-IDF 分数。

在我当前的大部分分析中,我一直在使用 R 中的 tm 包,但为了更进一步,我开始在 Python 中使用 gensim 库。

我不清楚我是否有 TF 和 TF-IDF 中的词嵌入。我希望使用 Word2Vec/Doc2Vec 并获得一个类似于我目前拥有的矩阵,然后计算文档之间的余弦相似度。这是模型的输出之一吗?

我基本上有大约 6000 个文档我想计算它们之间的余弦相似度,然后对这些余弦相似度分数进行排名。

【问题讨论】:

    标签: python gensim word2vec doc2vec


    【解决方案1】:

    是的,您可以在文本上训练 Word2VecDoc2Vec 模型。 (不过,对于这些算法,您的数据有点小。)

    之后,使用Word2Vec 模型(或Doc2Vec 的某些模式),您将拥有文本中所有单词的词向量。然后为更长的文本创建向量的一种简单方法是将文本的各个单词的所有向量平均在一起。然后,使用每个文本的向量,您可以通过计算文本向量的余弦相似度来比较文本。

    或者,使用Doc2Vec 模型,您可以(a)查找训练集中文本的学习文档向量;或 (b) 使用 infer_vector() 输入新文本,该文本应以与训练数据相同的方式进行标记,并为该新文本获取模型兼容向量。

    【讨论】:

    • 感谢您的回复。我有大约 6000 个文档,每个文档包含大约 10,000 个单词,我在遵循一些教程后的第一次分析似乎得到了相当不错的结果(即相似的单词似乎在一个情节的同一位置)。你有第二段的教程吗?我一直在寻找但没有找到如何对向量进行“平均”。 - 通过平均这些向量,我们是否会丢失很多信息?我也会看看infer_vector()但是我不想输入新的文本。我只是想对文档进行聚类。
    • ~60,000,000 个词对于词向量来说可能是可以的——尤其是对于那些有 10 多个不同用法示例的词。但注意发布的Doc2Vec 工作往往使用数万甚至数百万个不同的文档。另请注意,gensim 优化代码路径中的实现限制意味着仅考虑任何文本/句子的第 10,000 个标记(如果您有任何更长的文档)。在某种程度上,更多的epochs 或更小的向量size 可能有助于从更小的语料库中挤出更好的最终向量。
    • 平均一组向量本质上是一个单行,你可以在gensim源中看到它做了很多次。特别是,如果你看一下WordEmbeddingsKeyedVectors.n_similarity() 方法——github.com/RaRe-Technologies/gensim/blob/…——你会看到它需要两个单词列表,取每个列表的向量的平均值,然后返回这两个平均值之间的相似性.但请注意,平均词数是获取更长文本向量的最粗略/最快的方法。
    • 如果您只需要对训练集中的文档进行聚类,则不需要infer_vector()。您可以只从d2v_model.docvecs 请求learned-during-training doc-vectors – 要么全部放在原始数组中(d2v_model.docvecs.vectors_docs),要么一个接一个地通过训练标签(d2v_model.docvecs[tag_name])。
    • 谢谢!我会把你所有的cmets都带上飞机。我基本上有一个时间序列的文件。即这些文件每年都会发布,但它们每年都没有太大变化,因此它们非常相似。 - 在几乎重复的文档上运行 Doc2Vec 模型有什么缺点吗? - 目前我每年都保持文档彼此独立,但如果你说 60,000,000 可能仍然不够,那么我可以每年积累文档并运行模型......
    【解决方案2】:

    Documentation 表示它返回新文档的推断段落向量。请注意,对该函数的后续调用可能会推断出同一文档的不同表示(您可以通过硬编码种子model.random.seed(0) 使其具有确定性)。

    使用 sklearn 进行 tfidf 和余弦相似度比较常见

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.metrics.pairwise import cosine_similarity
    
    corpus = [
         'This is the first document',
         'This is the second second document',
         'And the third one',
    ]
    
    vectorizer = TfidfVectorizer()
    tfidf = vectorizer.fit_transform(corpus)
    words = vectorizer.get_feature_names()
    similarity_matrix = cosine_similarity(tfidf)
    

    Doc2Vec 在后台使用余弦相似度,因此我相信您可以将这些向量用于此目的。

    import gensim  
    
    model = gensim.models.Doc2Vec.load('saved_doc2vec_model')  
    new_sentence = "This is a sample document".split(" ")  
    model.docvecs.most_similar([model.infer_vector(new_sentence)])
    

    这将返回最相似文档的元组(label,cosine_similarity_score)

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 2016-10-22
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2015-07-21
      • 2018-10-27
      • 2021-07-10
      相关资源
      最近更新 更多