Документы доступны по адресу: https://cloud.mail.ru/public/6ab6/N6h8vogNP/dataset
Для чтения документов используем docreader.py Используем поля .url и .text
Разбор документов на слова лучше организовать с помощью regexp-а r'\w+', см. doc2words.py
Необходимая нормализация: приводим все слова к нижнему регистру.
Лемматизацию и пр. - в этом ДЗ не используем.
- Создать индекс
- Реализовать булев поиск
- имплементировать кодирование varbyte
- создать словарь термов (в любом виде)
- разобрать текстовый запрос простого формата (см. далее)
- вывести подходящие под булев запрос URL-ы
Дополнительно к предыдущему:
- имплементировать метод Simple9
- реализовать текстовый запрос полного формата (см. далее)
Дополнительно к предыдущему:
- потоковая обработка дерева запроса
- обязательно: индекс в бинарном виде
- обязательно: словарь в бинарном виде (см. 2ю лекцию)
Помимо исходников на Python Ваш пакет должен содержать 3 .sh-файла:
- index.sh (varbyte|simple9) path/to/*.gz : создение индекса
- make_dict.sh: создание словаря и оптимизация индекса
- search.sh: непосредственно поиск
- [опционально] preinstall.sh: скрипт, в котором вы можете установить необходимые пакеты
Вывод (stdout) подразумевается только от утилиты поиска.
На stdin search.sh будет дана последовательность запросов в виде
запрос #1
запрос #2
...
Форматы запросов:
присутствуют только термы и конъюнкция ("&")
Пример: власти & бельгии
Формат каждого запроса - булево выражение содержашее слова и операторы: "(", ")", "&", "|", "!"
Пример: власти & (бельгии | парижа) & !теракт
Гарантируется что запрос валидный
ИСХОДНЫЙ ЗАПРОС
КОЛ-ВО результатов
URL1
URL2
...
Пример:
Путин & Медведев
2
https://lenta.ru/news/2015/08/30/putin/
https://lenta.ru/photo/2015/08/30/medput/
Внимание: выводимые url-ы должны быть в порядке возрастания docid!
Код запакованный в .tgz отправляйте на ts2018idx@mail.ru
В теме письма обязательно указывайте вариант (баллы). Формат: [Ir-ts] idx, Иван Иванов (var: 35)
Для проверки будет использоваться набор документов lenta.ru в 10 и 50 раз больше данного. Ограничение по RAM: 2Gb
Из-за необходимости проверки реализации, оценка не будет автоматической. После получения оценки от робота, пришлите письмо еще раз со словом FINALTRY в теме.
Срок сдачи: 30 марта
Q: Почему Python? Если жесткие ограничения, то не лучше ли на C++ ?
A: Python выбран намеренно, чтобы вы не урывались в системные оптимизации и не разбирались с memleak/segfault и т.п., а больше времени потратили бы именно на проработку логики. Ограничения по времени и памяти соответствуют именно Python-варианту.
Q: Нужно ли реализовывать SkipList ?
A: Нет, этого нет в задании и необходимости для данного кол-ва документов тоже нет. Однако, в свободное время я настоятельно советую это реализовать т.к. грамотная реализация улучшит ваши навыки декомпозиции кода и, в целом, программирования.
Q: Что если я сдал на вариант на 15 баллов, а после deadline сделаю вариант на 25?
A: К сожалению, вы получите лишь ceil(25 / 2) = 13 баллов. Так что планируйте свое время заранее и не доводите до deadline.
Q: Для чего нужен preinstall.sh?
A: Этот скрипт небходим, если вам нужны дополнительные Python-модули. Но, как правило, достаточно уже предустановленных protobuf, numpy, mmh3