project_main.py запускает наш маленький поисковик. Последовательность действий следующая:
- скачивание страниц –
project_crawler.py; - удаление обвязки –
project_cleaning.py; - лемматизация –
project_lemmatize.py; - составление обратного индекса –
project_reverse_index.py; - поиск релевантных документов и ранжирование –
project_search.py.
Время работы полного цикла зависит от глубины поиска ссылок и ограничения на количество документов в собираемой коллекции. Для глубины в три ссылки и ограничения на 1000 документов время работы на обычном ноутбуке со скоростью подключения до 30 Мбит/с составляет примерно 5 минут. На уже собранной и очищенной коллекции поиск работает в пределах 10 секунд.
Код написан под MacOS, Python 3.5. Для работы нужны модули requests, BeautifulSoup, justext, NLTK (Corpora/stopwords из nltk.download()), sklearn, pandas, numpy и морфологический анализатор mystem.
- Краулер. Создается список ссылок и коллекция HTML-кода со страниц этих ссылок
collection_pages. Поиск ссылок ведется от заданной корневой ссылки – мы использовали журнал Афиша. Модуль использует breadth-first алгоритм с регулируемой глубиной. Для каждой ссылки функция инициализирует сохранение кода страницы в отдельный файл. - Удаление обвязки. C помощью модуля
justextпроизводится чистка кода страниц коллекции (удаляется обвязка). Создается новый каталог с чистыми страницамиclean_collection. Ссылка сохраняется в первой строке, далее записывается текст без обвязки. На выходе – папка с чистыми текстовыми файлами. - Лемматизация. Здесь происходит очистка каждого файла от знаков препинания и прочих артефактов. После этого с помощью анализатора
mystemлемматизируются тексты коллекции и записываются в папкуclean_collection_lemmatized.mystemдолжен находиться в той же папке, что и основной модуль. Сохранилась проблема лемматизации ссылок. Вproject_lemmatize.pyтакже находится функция лемматизации запроса. - Обратный индекс. Для коллекции текстов строится обратный индекс и записывается в текстовый файл
reverse_index_dict.txt. Далее этот обратный индекс не используется, потому что вsklearnесть свой. - Поиск и ранжирование. Строится матрица показателя tf-idf для текстов коллекции. Алгоритм вычисления tf-idf реализуется в пакете
sklearn. В результате его работы имеем матрицу значений терм-документ и вектор запроса, преобразованный в матрицу соответствующей размерности. Этот же пакет позволяет вычислить попарную косинусную близость вектора запроса пользователя и вектора каждого из документов. Документы ранжируются по косинусной близости. Выводится список из 10 документов (и соответствующих ссылок) с наилучшей мерой, упорядоченный по степени релевантности документов запросу.