Python: проверьте, содержит ли предложение какое-либо слово из списка (с нечетким соответствием) - PullRequest
0 голосов
/ 21 февраля 2019

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

Мне удалось извлечь точные слова

[word for word in Sentence if word in set(list_of_keywords)]

Можно ли извлечь слова, которые имеют хорошее сходство сзаданный list_of_keywords, т. е. косинусное сходство между двумя словами составляет> 0,8

Например, ключевое слово в данном списке - «аллергия», и теперь предложение записывается как

- серьезная аллергическая реакция наорехи в еде, которую она употребляла. '

расстояние между косинусами между «аллергией» и «аллергией» можно рассчитать, как показано ниже

cosdis(word2vec('allergy'), word2vec('allergic'))
Out[861]: 0.8432740427115677

Как извлечь «аллергию» из предложения какхорошо на основе косинуса сходства?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019
def word2vec(word):
    from collections import Counter
    from math import sqrt

    # count the characters in word
    cw = Counter(word)
    # precomputes a set of the different characters
    sw = set(cw)
    # precomputes the "length" of the word vector
    lw = sqrt(sum(c*c for c in cw.values()))

    # return a tuple
    return cw, sw, lw

def cosdis(v1, v2):
    # which characters are common to the two words?
    common = v1[1].intersection(v2[1])
    # by definition of cosine distance we have
    return sum(v1[0][ch]*v2[0][ch] for ch in common)/v1[2]/v2[2]


list_of_keywords = ['allergy', 'something']
Sentence = 'a severe allergic reaction to nuts in the meal she had consumed.'

threshold = 0.80
for key in list_of_keywords:
    for word in Sentence.split():
        try:
            # print(key)
            # print(word)
            res = cosdis(word2vec(word), word2vec(key))
            # print(res)
            if res > threshold:
                print("Found a word with cosine distance > 80 : {} with original word: {}".format(word, key))
        except IndexError:
            pass

ВЫХОД :

Found a word with cosine distance > 80 : allergic with original word: allergy

РЕДАКТИРОВАТЬ :

однострочник:

print([x for x in Sentence.split() for y in list_of_keywords if cosdis(word2vec(x), word2vec(y)) > 0.8])

ВЫХОД :

['allergic']
0 голосов
/ 21 февраля 2019

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

def distance(words):
    return cosdis(word2vec(words[0]), word2vec(words[1]))

threshold = 0.8
keywords = set(list_of_keywords)
matches = [word for word in Sentence if word in keywords and 
           any([distance(word, keyword) > threshold for keyword in keywords])]
0 голосов
/ 21 февраля 2019
senectence = 'a severe allergic reaction to nuts in the meal she had consumed.'
list_of_keywords = ['allergy','reaction']
word_list = []
for keyword in list_of_keywords:
    for word in senectence.split():
        if(cosdis(word2vec(keyword), word2vec(word)) > 0.8):
            word_list.append(word)

или если вы хотите извлечь слова только по ключевому слову «аллергия»

[word for word in Sentence if cosdis(word2vec('allergy'), word2vec(word)) > 0.8]
...