了解get_sentence_vector和get_word_vector的快速文本

问题描述

要做的是获取一对单词或短语的嵌入并计算相似度。

我观察到当我在一个单词的get_sentence_vector()和get_word_vector()之间切换时,相似性是相同的。例如,我可以在计算embedding_2或embedding_3时切换此方法,但embedding_2和embedding_3并非正常,这很奇怪:

    from scipy.spatial.distance import cosine
    import numpy as np
    import fasttext
    import fasttext.util
    
    # download an english model
    fasttext.util.download_model('en',if_exists='ignore')  # English
    model = fasttext.load_model('cc.en.300.bin')
    
    # Getting word vectors for 'one' and 'two'.
    embedding_1 = model.get_sentence_vector('baby dog')
    embedding_2 = model.get_word_vector('puppy')
    embedding_3 = model.get_sentence_vector('puppy')
    
    def cosine_similarity(embedding_1,embedding_2):
        # Calculate the cosine similarity of the two embeddings.
        sim = 1 - cosine(embedding_1,embedding_2)
        print('Cosine similarity: {:.2}'.format(sim))
        
    # compare the embeddings
    cosine_similarity(embedding_1,embedding_2)
    # compare the embeddings
    cosine_similarity(embedding_1,embedding_3)
    
    
    # Checking if the two approaches yield the same result.
    is_equal = np.array_equal(embedding_2,embedding_3)
    
    # Printing the result.
    print(is_equal)

如果我切换方法,相似度始终为0.76,但is_equal为false。我有两个问题:

(1)我可能必须对短语使用get_sentence_vector(),但是就单词而言,应该使用哪一个?当我为一个单词调用get_sentence_vector()时会发生什么?

(2)我使用fasttext是因为它可以处理词汇量,使用fasttext的嵌入进行余弦相似度比较是一个好主意吗?

解决方法

  1. 您应该将get_word_vector用于单词,将get_sentence_vector用于句子。

    get_sentence_vector将每个单词向量除以其范数,然后取平均值。如果您对更多详细信息感兴趣,请阅读this

  2. 由于fastText提供矢量表示,因此最好使用此矢量来比较单词和句子。