Реших да изтрия и да попитам отново, просто беше по-лесно! Моля, не гласувайте против, тъй като сте взели предвид това, което хората казват.
Имам два вложени речника: -
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='/Потребители/danny/Desktop'
- Редактиране 2
По отношение на големината, например, за търсене номер 3 и файл 1 би било:
sqrt (2^2 + 3^2 + 0^2) * sqrt (3^2 + 0^2 + 3^2)