【问题标题】:Soft Cosine Similarity between two sentences两个句子之间的软余弦相似度
【发布时间】:2020-04-21 17:10:23
【问题描述】:

我正在尝试找到一种简单的方法来计算两个句子之间的软余弦相似度。

这是我的尝试和学习:

from gensim.matutils import softcossim

sent_1 = 'Dravid is a cricket player and a opening batsman'.split()
sent_2 = 'Leo is a cricket player too He is a batsman,baller and keeper'.split()

print(softcossim(sent_1, sent_2, similarity_matrix))

我无法理解similarity_matrix。请帮助我找到它,以及今后 python 中的软余弦相似度。

【问题讨论】:

    标签: python gensim cosine-similarity


    【解决方案1】:

    从 Gensim 的当前版本 3.8.3 开始,问题和先前答案中的一些方法调用已被弃用。这些不推荐使用的功能已从 4.0.0 测试版中删除。似乎无法在回复@EliadL 时提供代码,所以添加一条新评论。

    Gensim 3.8.3 和 4.0.0 目前解决这个问题的方法如下:

    import gensim.downloader as api
    from gensim import corpora
    from gensim.matutils import softcossim
    
    sent_1 = 'Dravid is a cricket player and a opening batsman'.split()
    sent_2 = 'Leo is a cricket player too He is a batsman,baller and keeper'.split()
    
    # Download the FastText model
    fasttext_model300 = api.load('fasttext-wiki-news-subwords-300')
    
    # Prepare a dictionary and a corpus.
    documents = [sent_1, sent_2]
    dictionary = corpora.Dictionary(documents)
    
    # Prepare the similarity matrix
    similarity_index = WordEmbeddingSimilarityIndex(fasttext_model300)
    similarity_matrix = SparseTermSimilarityMatrix(similarity_index, dictionary)
    
    # Convert the sentences into bag-of-words vectors.
    sent_1 = dictionary.doc2bow(sent_1)
    sent_2 = dictionary.doc2bow(sent_2)
    
    # Compute soft cosine similarity
    print(similarity_matrix.inner_product(sent_1, sent_2, normalized=True))
    #> 0.68463486
    

    对于 Gensim v. 3.8.3 的用户,我还发现此 Notebook 有助于理解软余弦相似度以及如何使用 Gensim 应用软余弦相似度。

    到目前为止,对于 Gensim 4.0.0 测试版的用户来说,Notebook 是值得一看的。

    【讨论】:

    • 你知道是否有办法从文件中保存和加载相似度矩阵?我一直在尝试 SparseTermSimilarityMatrix.save 函数,但我不断收到与 WordEmbeddingSimilarityIndex 的 inner_dot_product 相关的错误。
    • @grumpyTofu - 使用 Gensim 3.8.3 和来自github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/… 的示例笔记本保存相似矩阵只是similarity_matrix.save('mysmfile') 如果您需要更多帮助,最好用您的错误打开一个新问题、代码和有关您的环境的详细信息
    • 作为 Gensim 中软余弦测量 (SCM) 实施的作者,我同意这个答案。此外,如果你有一个语料库,你想用 SCM 训练一个 TF-IDF 模型:如果不是为了文档表示,至少作为SparseTermSimilarityMatrix 的第三个参数。这样,矩阵将由最稀有的信息量最大的术语而不是按字母顺序构建,这已被证明可以在文本分类和信息检索任务上提供更好的结果。
    • 由于某种原因在运行similarity_matrix.inner_product(sent_1, sent_2, normalized=True) 时遇到错误,但在将其更改为以下内容后它可以工作:similarity_matrix.inner_product(sent_1, sent_2, normalized = (True,False)
    【解决方案2】:

    通过this tutorial:

    import gensim.downloader as api
    from gensim import corpora
    from gensim.matutils import softcossim
    
    sent_1 = 'Dravid is a cricket player and a opening batsman'.split()
    sent_2 = 'Leo is a cricket player too He is a batsman,baller and keeper'.split()
    
    # Download the FastText model
    fasttext_model300 = api.load('fasttext-wiki-news-subwords-300')
    
    # Prepare a dictionary and a corpus.
    documents = [sent_1, sent_2]
    dictionary = corpora.Dictionary(documents)
    
    # Prepare the similarity matrix
    similarity_matrix = fasttext_model300.similarity_matrix(dictionary)
    
    # Convert the sentences into bag-of-words vectors.
    sent_1 = dictionary.doc2bow(sent_1)
    sent_2 = dictionary.doc2bow(sent_2)
    
    # Compute soft cosine similarity
    print(softcossim(sent_1, sent_2, similarity_matrix))
    #> 0.7909639717134869
    

    【讨论】:

    • 从 Gensim 的当前版本 3.8.3 开始,此答案中使用的一些方法调用已被弃用。这些不推荐使用的功能已从 4.0.0 测试版中删除。
    【解决方案3】:

    您可以在 gensim 4.0.0 以上使用 gensim.similarities 中的 SoftCosineSimilarity 类

    from gensim.similarities import SoftCosineSimilarity
    #Calculate Soft Cosine Similarity between the query and the documents.
    def find_similarity(query,documents):
      query = dictionary.doc2bow(query)
      index = SoftCosineSimilarity(
        [dictionary.doc2bow(document) for document in documents],
        similarity_matrix)
      similarities = index[query]
      return similarities
    

    【讨论】:

    • 您是否错过了文档中的“s”,在 def find_similarity(query,document): 中?
    猜你喜欢
    • 2018-09-27
    • 2020-10-28
    • 1970-01-01
    • 2011-02-01
    • 2015-07-21
    • 1970-01-01
    • 2021-10-07
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多