Решил удалить и перепрошить, просто стало проще! Пожалуйста, не голосуйте против, так как приняли во внимание то, что говорили люди.
У меня есть два вложенных словаря: -
wordFrequency = {'bit':{1:3,2:4,3:19,4:0},'red':{1:0,2:0,3:15,4:0},'dog':{1:3,2:0,3:4,4:5}}
search = {1:{'bit':1},2:{'red':1,'dog':1},3:{'bit':2,'red':3}}
Первый словарь связывает слова с номером файла и количеством раз, которое они появляются в этом файле. Второй содержит поисковые запросы, связывающие слово с тем, сколько раз оно встречается в текущем поиске.
Я хочу извлечь определенные значения, чтобы для каждого поиска я мог вычислить скалярное произведение между количеством раз, когда слова появляются в файле, и количеством раз, когда они появляются в поиске, деленным на их величины, а затем посмотреть, какой файл больше всего похож на текущий поиск, т. е. (появление слова 1 в поиске * появление слова 1 в файле) + (появление слова 2 в поиске * появление слова 2 в файле) и т. д. И затем вернуть словарь поисковых запросов в список номеров файлов, сначала наиболее похожий, наименее подобный последний.
Ожидаемый результат - словарь:
{1:[4,3,1,2],2:[1,2,4,3]}
и т. д.
Ключ — это номер поиска, значение — это список файлов, наиболее релевантных первым.
(На самом деле они могут быть неправильными.)
Это то, что у меня есть: -
def retrieve():
results = {}
for word in search:
numberOfAppearances = wordFrequency.get(word).values()
for appearances in numberOfAppearances:
results[fileNumber] = numberOfAppearances.dot()
return sorted (results.iteritems(), key=lambda (fileNumber, appearances): appearances, reverse=True)
Извините, нет, он просто говорит wdir =, а затем каталог, в котором находится файл .py.
- Редактировать
Весь файл Retrieve.py:
from collections import Counter
def retrieve():
wordFrequency = {'bit':{1:3,2:4,3:19,4:0},'red':{1:0,2:0,3:15,4:0},'dog': {1:3,2:0,3:4,4:5}}
search = {1:{'bit':1},2:{'red':1,'dog':1},3:{'bit':2,'red':3}}
results = {}
for search_number, words in search.iteritems():
file_relevancy = Counter()
for word, num_appearances in words.iteritems():
for file_id, appear_in_file in wordFrequency.get(word, {}).iteritems():
file_relevancy[file_id] += num_appearances * appear_in_file
results[search_number] = [file_id for (file_id, count) in file_relevancy.most_common()]
return results
Я использую Spyder GUI / IDE для Anaconda Python 2.7, просто нажмите зеленую кнопку воспроизведения, и результат будет таким:
wdir='/Пользователи/Дэнни/Рабочий стол'
- Редактировать 2
Что касается величины, например, для поиска номер 3 и файла 1 это будет:
sqrt (2^2 + 3^2 + 0^2) * sqrt (3^2 + 0^2 + 3^2)