Сходство документов - несколько документов заканчиваются одинаковым баллом сходства - PullRequest
0 голосов
/ 16 апреля 2020

Я работал над бизнес-проблемой, где мне нужно найти сходство нового документа с существующим. Я использовал различные подходы, как показано ниже

1.Сумка слов + сходство косинусов

2.TFIDF + сходство косинусов

3.Word2Ve c + сходство косинусов

Никто из них не работал так, как ожидалось. Но, наконец, я нашел подход, который работает лучше, его Word2ve c + Мягкий косинус сходство

Но новая проблема заключается в том, что я получил несколько документов с одинаковым счетом сходства . Большинство из них актуальны, но мало из них, даже несмотря на то, что некоторые семантически похожие слова различаются

1 Ответ

1 голос
/ 19 апреля 2020

Если целью является выявление сходства семанти c, то поможет следующий код из здесь .

#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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...