【问题标题】:How to calculate semantic similarity of short text corpora?如何计算短文本语料的语义相似度?
【发布时间】:2020-04-19 20:50:56
【问题描述】:

对两个短文本语料库之间的语义相似度进行无监督比较的正确方法是什么?比较两者的 LDA 主题分布似乎不是一个解决方案,因为对于短文档,生成的主题并不能很好地掌握语义。分块没有帮助,因为跟随的推文不必是同一主题。是例如在这些语料库中创建文档 TF-IDF 之间的余弦相似度矩阵是一种好方法吗?

【问题讨论】:

  • 比较的«单位»是什么?句子?段落?文章?完整的文件?
  • 最终,语料库。至于对他们的分数有贡献的子单位,我不确定。直觉上,我会在文档中寻找关键字。不过,我不知道这在多大程度上是个好主意。
  • 这是一个非常广泛的课题,完全没有解决的研究课题。您可以研究嵌入或词频矩阵,或者仅使用文档词矩阵计算距离......如果没有直觉(基于您的数据和预期的高/低分),很难提供帮助。

标签: nlp information-retrieval corpus


【解决方案1】:

这是here 找到的一种方法。相似度得分越高,句子越接近(语义上)。

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


#Build functions to compute similarity
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

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

s1 = 'We rented a vehicle to drive to New York'
s2 = 'The car broke down on our jouney'            

s1tos2 = symSentSim(s1, s2)

print(s1tos2)
#0.142509920635

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多