【问题标题】:Document Similarity - Multiple documents ended with same similarity score文档相似度 - 多个文档以相同的相似度得分结束
【发布时间】:2020-07-30 03:39:46
【问题描述】:

我一直在处理一个业务问题,我需要找到新文档与现有文档的相似之处。 我使用了以下各种方法

1.词袋+余弦相似度

2.TFIDF + 余弦相似度

3.Word2Vec + 余弦相似度

它们都没有按预期工作。 但最后我找到了一种效果更好的方法 Word2vec + 软余弦 相似度

但新的挑战是我最终得到了具有相同相似度分数的多个文档。 它们中的大多数是相关的,但即使有一些语义相似的词它们是不同的,它们中的少数也是不同的

请建议如何解决这个问题

【问题讨论】:

  • 你能分享一个大约10个句子的样本吗?如果这个样本中有一些句子的相似度得分可以接受,也有一些句子不可接受,那么可以更好地调查这个问题。
  • 您可以尝试sentence-transformers嵌入+余弦相似度作为替代方案。
  • @SidharthMacherla 由于安全政策,我无法分享该信息,但我尝试模仿场景...我有 n 个具有不同标签或分类的历史文档(登录问题、错误消息等)我只想找到新文档与现有文档的相似性。现在假设我得到一个文档,例如“以前我无法连接,但现在我收到错误消息”,因为关键词“无法连接”和“错误消息”它为两个类文档提供了相同的相似性分数尽管它是一个错误消息,但确实是真实的文档..我希望我在模仿方面已经尽力了。
  • @arpitrathi 感谢您的建议将尝试这个

标签: nlp


【解决方案1】:

如果目标是识别语义相似性,来自here 的以下代码会有所帮助。

#invoke libraries
from nltk import pos_tag, word_tokenize
from nltk.corpus import wordnet as wn

#Build functions 
def ptb_to_wn(tag):    
    if tag.startswith('N'):
        return 'n' 
    if tag.startswith('V'):
        return 'v' 
    if tag.startswith('J'):
        return 'a' 
    if tag.startswith('R'):
        return 'r' 
    return None


def tagged_to_synset(word, tag):
    wn_tag = ptb_to_wn(tag)
    if wn_tag is None:
        return None 
    try:
        return wn.synsets(word, wn_tag)[0]
    except:
        return None


def sentence_similarity(s1, s2):    
    s1 = pos_tag(word_tokenize(s1))
    s2 = pos_tag(word_tokenize(s2)) 

    synsets1 = [tagged_to_synset(*tagged_word) for tagged_word in s1]
    synsets2 = [tagged_to_synset(*tagged_word) for tagged_word in s2]

    #suppress "none"
    synsets1 = [ss for ss in synsets1 if ss]
    synsets2 = [ss for ss in synsets2 if ss]

    score, count = 0.0, 0

    for synset in synsets1:
        best_score = max([synset.path_similarity(ss) for ss in synsets2])
        if best_score is not None:
            score += best_score
            count += 1

    # Average the values
    score /= count
    return score

#Build function to compute the symmetric sentence similarity
def symSentSim(s1, s2):
    sss_score = (sentence_similarity(s1, s2) + sentence_similarity(s2,s1)) / 2
    return (sss_score)

#Example
s1 = 'We rented a vehicle to drive to Goa'
s2 = 'The car broke down on our jouney'            

s1tos2 = symSentSim(s1, s2)

print(s1tos2)
#0.155753968254

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 2015-07-02
    • 2017-04-18
    • 1970-01-01
    • 2019-03-14
    • 2011-01-21
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多