Как рассчитать сходство семанти c кратких текстовых корпусов? - PullRequest
0 голосов
/ 19 апреля 2020

Каков правильный подход к неконтролируемому сравнению сходства семанти c между двумя короткими текстовыми корпусами? Сравнение дистрибутивов LDA topi c для этих двух не представляется решением, так как для коротких документов сгенерированные темы на самом деле не очень хорошо понимают семантику asp. Чанкинг не помог, потому что следующие твиты не обязательно должны быть на одной и той же топике c. Является ли, например, создание матрицы косинусных сходств между документами TF-IDF в этих корпусах хорошим способом для go?

1 Ответ

0 голосов
/ 20 апреля 2020

Вот один подход здесь . Чем выше оценка сходства, тем ближе предложения (семантически).

#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

...