Как получить оценку сходства (PMI) между ключевым словом и абзацами с помощью python?

#python #nlp #similarity #topic-modeling

Вопрос:

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

Теперь я ищу метод или алгоритм на python для ранжирования отзывов на основе сходства между ключевыми словами.

например: для ключевого слова «вкусная еда» я хотел бы получить оценку сходства для отзывов, как показано ниже.

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

Как я могу получить оценку семантического сходства между ключевым словом и предложением?

Комментарии:

1. Из любопытства, для чего это?

Ответ №1:

У меня есть метод для этого, но он сложный, поэтому я просто покажу его и расскажу об этом позже. Вот он:

 sentences = ["this is place is costly but their food is delicious", "This is place is very clean and friendly, perhaps, food is not so great!", "I would not recommend this place for hangout."]
search = "food delicious"

count = 0
lst = []

for sentence in sentences:
    if search in sentence:
        lst.append([sentence, 1])
    else:
        for word in search.split():
            if word in sentence:
                count  = 1
        lst.append([sentence, max(round(count / len(search.split()) - 0.3, 1), 0)])
        count = 0

for i in lst:
    print(*i)
 

Это даст вам желаемые результаты.

В принципе, первая строка помещает отзывы в массив. Вторая строка создает переменную под названием поиск, которая содержит ключевую фразу.

Теперь, после этого нам нужно создать 2 переменные с именами count и count и lst. Lst будет списком, который мы используем для хранения нашей информации, а count-это счетчик, который нам понадобится позже.

В строке 7 мы начинаем цикл «для», который будет повторять предложения одно за другим.

В строке 8 мы проверяем, есть ли в предложении точная ключевая фраза, поэтому, если "food delicious » встречается где-то в предложении. Если это так, то мы добавляем предложение и его оценку PMI 1 в список, который мы создали ранее.

Примечание: (В таблице не указано, что это необходимо, поэтому, если это не так, вы можете просто удалить его!)

Итак, далее мы используем else: , чтобы показать, что, если прямой ключевой фразы нет в предложении, то нам нужно сделать что-то еще, чтобы получить оценку PMI. Если бы у нас этого не было else: , это могло бы привести к дублированию позже.

В строке 11 он запускает еще один цикл for, но на этот раз он будет повторяться через каждое слово search.split() . search.split() просто создает список поисковых слов, разделяя их пробелами. Например, здесь, search.split() то было бы ["food", "delicious"] . Итак, теперь мы повторяем этот список.

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

Примечание: Это означает, что если бы одно слово, например «еда», появилось двадцать раз, компьютер все равно действовал бы так, как если бы оно появилось только один раз.. Чтобы избежать этого, вы можете изменить count = 1 значение на count = sentence.count(word) , которое будет учитывать каждое отдельное вхождение слова в предложении.

Теперь, после завершения search.split() цикла for, нам нужно добавить наш счетчик в список. А вот и кое-какие математические штучки. Во-первых, мы делим количество на search.split() , чтобы получить десятичный процент (менее 1) от того, сколько слов из search переменной встречается в предложении. Однако в связи с этим возникает проблема. Если бы появилось 2 слова, и в переменной было 2 слова search , то мы бы делали 2/2, что равно 1. Мы не хотим 1, мы хотим 0,7. Поэтому нам также нужно вычесть 0,3 из нашего числа. Я округлил это значение, потому что это может привести к довольно запутанному делению.

Теперь у нас все еще есть одна последняя проблема в lst.append() ряду. Если бы у нас было 0 слов в предложении, но 2 слова в search переменной, то мы бы делали 0/2, что равно 0. Это то, что мы хотим, но затем мы вычитаем 0,3. что дает нам 0,3/ Чтобы избежать этого, мы можем установить значение max() 0.

Наконец, сразу после этого мы сбрасываем значение count 0, чтобы следующее предложение могло начинаться с нового счета, чтобы избежать каких-либо статистических ошибок.

Вот и все! Чтобы распечатать его, я просто использовал небольшую петлю for в конце, но она вам не нужна.

Вот мои результаты:

 this is place is costly but their food is delicious 0.7
This is place is very clean and friendly, perhaps, food is not so great! 0.2
I would not recommend this place for hangout. 0
 

P. S: ( *i В print() последней строке просто удаляются скобки и запятые из напечатанного значения. Это никоим образом не меняет сам список.)

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