Создание простой поисковой программы

Решил удалить и перепрошить, просто стало проще! Пожалуйста, не голосуйте против, так как приняли во внимание то, что говорили люди.

У меня есть два вложенных словаря: -

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)


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 берет точечный продукт, но, похоже, он не делится на произведение двух величин? - person DannyBoy; 21.11.2014
comment
Вот почему я написал Вот начало. Вы должны продолжать улучшать мой код, пока не получите именно то, что хотели. - person Tzach; 21.11.2014
comment
Хорошо, круто, но имеет ли это для вас смысл, что я имею в виду? Я сделал пример в исходном вопросе выше?! - person DannyBoy; 21.11.2014