2015-07-28 2 views
-1

У меня есть три мешка слов:сходства между мешками слов

BoW1 = [word11, word12, word13] 
BoW2 = [word21, word22, word23] 
BoW3 = [word31, word32, word33] 

BoW1 содержит синонимы слово, BoW2 также содержат синонимы слова. Оба BoW1 и BoW фиксированы. BoW3 содержит слова документа, поэтому он является мультимножеством.

Я хочу найти BoW3, чтобы узнать, содержит ли оно какие-либо слова BoW1 и BoW2. Затем я хотел бы рассчитать сходство между Bow1 + BoW2 и BoW3. Итак, вместе BoW1 и BoW2. Я не заинтересован в вычислении подобия между BoW1 и BoW2, при вычислении я могу предположить, что они едины. Однако для моего случая BoW1 содержит значимые слова, чем BoW2.

Как вы думаете, лучший и точный способ расчета такого сходства. Я, тем не менее, использовал термин частота, как в Информационном поиске. Однако я не уверен, что повторение важно в моем случае.

+0

Определение «* сходства» «зависит от вашего прецедента (поэтому существует так много разных мер подобия). Можете ли вы уточнить, что должно выражать сходство между вашими наборами, то есть вы можете дать немного больше информация о сценарии поиска/поиска? – dhke

+0

Ожидается, что выражение «релевантность», я использую BoW1 и BoW2, потому что, если я использую один из них, я ожидаю, что у меня будет много ложноположительных результатов. Поэтому ожидается, что обе сумки вместе уменьшат ложную положительные и, таким образом, возвращать соответствующие документы. И, как я сказал в вопросе, BoW1 содержит более важные слова, чем BoW2. – Arwa

ответ

1

Возможно, вы хотите получить сходство с косинусом (https://en.wikipedia.org/wiki/Cosine_similarity). Вычислите точечный продукт между каждым пакетом векторов слов. Если вы используете Python, ваш код будет выглядеть примерно так:

# Make sure each BoW is a map from word -> frequency 
BoW1 = {word11: 1, word12: 5, word13: 3} 
BoW2 = ... 
BoW3 = ... 

# Normalise the frequencies 
BoW1_total = sum([freq for freq in BoW1.values()]) 
BoW1 = {word : freq/BoW1_total for word, freq in BoW1.items()} 
BoW2_total = ... 
... 

# Compute the dot product 
similarity = 0 
for word in set(BoW1.keys()).intersection(BoW2.keys()): 
    similarity += BoW1[word] * BoW2[word] 
... # continue for each pair you want to work out the similarities 

Конечно, организовать код лучше, чем это^(функции записи для всех вещей, которые нужно сделать несколько раз, и т.д.), но это должно дать вам приблизительную идею.

Смежные вопросы