Създаване на проста програма за търсене

Реших да изтрия и да попитам отново, просто беше по-лесно! Моля, не гласувайте против, тъй като сте взели предвид това, което хората казват.

Имам два вложени речника: -

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)


person DannyBoy    schedule 20.11.2014    source източник
comment
възможен дубликат на Как се индексират файлове за бързо търсене?   -  person ivan_pozdeev    schedule 21.11.2014
comment
Не бих казал така, това е много по-основно. Можете ли да помогнете или не?   -  person DannyBoy    schedule 21.11.2014


Отговори (1)


Ето едно начало:

from collections import Counter
def retrieve():
    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

print retrieve()
person Tzach    schedule 20.11.2014
comment
Все още не получавам никакъв резултат, само wdir = отново? - person DannyBoy; 21.11.2014
comment
Тествах този код и работи. Какво е wdir =? Отпечатахте ли резултатите? - person Tzach; 21.11.2014
comment
Той просто казва wdir = '' (пътят на файла е в кавичките). Отпечатване на резултатите? - person DannyBoy; 21.11.2014
comment
Как точно изпълнявате скрипта? Можете ли да копирате цялото съдържание на файла към въпроса? - person Tzach; 21.11.2014
comment
Показано в оригиналния въпрос :) - person DannyBoy; 21.11.2014
comment
Опитайте първо да стартирате файла без spyder, само от конзолата, като напишете python <your file name> - person Tzach; 21.11.2014
comment
Не прави нищо? - person DannyBoy; 21.11.2014
comment
Трябва да стартирате функцията, просто добавете print retrieve() в края на файла. - person Tzach; 21.11.2014
comment
Да, вече работи, това е невероятно, много ви благодаря! Още нещо обаче. За да се изчисли векторното сходство, точковият продукт трябва да бъде разделен на произведението на величините на векторите за търсене и файла, ако това има смисъл? Разбирам, че ред 8 взема точковия продукт, но не изглежда да се дели на произведението на 2-те величини? - person DannyBoy; 21.11.2014
comment
Ето защо написах Ето едно начало. Трябва да продължите да подобрявате моя код, докато не получите точно това, което искате. - person Tzach; 21.11.2014
comment
Добре, страхотно, но има ли смисъл това, което имам предвид? Направих пример в първоначалния въпрос по-горе?! - person DannyBoy; 21.11.2014