10/05/2006

Быстрая сортировка по релевантности PDF-документов: нам поможет SWISH++

Задача: имеется куча скачанных статей в формате PDF и нужно их сортировать по каталогам.
Решение: можно сидеть и уродоваться месяц, если документов несколько тысяч, а можно воспользоваться свободной поисковой машиной SWISH++

Зачем всё это надо
Всё очень просто: я накачал кучу хороших (и не очень) статей по своей специальности с целью расширить кругозор, и теперь надо все эти PDF файлы рассортировать по каталогам. И потом желательно иметь возможность искать внутри них информацию - и не просто по совпадению, а по релевантности: я не помню, в каком pdf-нике находится нужный мне обзор, а имена файлов типа 1234Njhsd.pdf мне мало что говорят. Быть может, это позволяет сделать Beagle, но попробуем обойтись более простыми и лёгкими средствами, которые есть в Дебиан.

Идея!
Некоторое время посидев и потыкав по pdf-никам и пытаясь ручонками всё это разобрать, я понял, что надо это спихнуть на машину. Сел и начал думать, методично прочёсывая свой локальный репозиторий Дебиана apt-cache search-ем.
Итак, что я хочу? Возможность искать внутри pdf-файлов, но для этого нужно из них выдрать текст. Это несложно, ведь имеется программа pdftotext. В результате своей деятельности она создаёт файл с таким же названием, но расширением txt. Отлично, половина задачи решена. Теперь надо искать по релевантности внутри текстовых файлов.
Из пришедших в голову идей:
  • поставить небольшой спам-фильтр, типа ifiles, и натренировать его сортировать кидаемые в него текстовые файлы по каталогам.
Плюсы: через некоторое время статьи сами будут попадать, куда надо, но для этого придётся учить баесовский алгоритм.
Минусы: нужно заранее знать всю структуру каталогов, что невозможно, трудно добавлять новые (придётся снова учить алгоритм), нетривиальная сортировка самих документов.
  • поставить какую-нибудь поисковую машину типа mnogosearch, но оно очень здоровое и работает с HTML, а нужен плоский текст.
Плюсы: наверное, с релевантностью там нормально;
Минусы: но это уже стрельба из крейсера по птицам ;-)
  • поставить поисковую машину SWISH++ в качестве простого, быстрого, гибкого и неприхотливого локального поисковика.
Плюсы: гибкость и практическая всеядность, отсутствие необходимости обучения, высокая скорость работы, удобная выдача результатов.
Минусы: только английский язык, поддержки других языков нет и не предвидется...
Короче, поставил SWISH++. Прекрасно, осталось написать перловый скрипт с разбором результата выдачи, отсекать файлы, не проходящие по порогу релевантности и перемещать их в каталог, соответствующий запросу. И кто там свистел про смерть unix-way!? А? Разбежались по кустам? То-то же! :-)

О поисковой машине SWISH++
Сведений об этой поисковой машине в Сети не просто мало - их почти нет. Только статья о применении этой системы для серьёзных поисковых запросов. Некоторыми товарищами считается самой быстрой поисковой системой.
Из описания дебиановского пакета можно немного узнать об этой программе - Простой Системе Индексации Для Людей. В основном предназначена для использования в качестве простого и быстрого поискового движка, полностью переписана на C++.
Основные возможности SWISH++
  • Индексирование файлов с тэгами
  • Разумное индексирование почтовых и новостных файлов
  • Индексирование man-страниц
  • Применение фильтров "на лету" вместо индексирования
  • Индексирование не-текстовых файлов типа Micorosoft Office (требуется antiword)
  • Модульная архитектура индексирования
  • Избирательное индексирование новых файлов
  • Индексирование удалённых веб-сайтов
  • Обработка больших коллекций файлов
  • Молниеносная скорость поиска
  • Настраиваемое игнорирование слов
  • Возможность запуска как поискового сервера (демонизация)
  • Лёгкий для разборки формат выдачи результатов
  • Тщательно прокомментированный исходный код

Система SWISH++ состоит из двух программ: index++ и search++. Первая программа отвечает за индексирование, вторая программа ищет файлы по запросам в файле индекса. Типа Гугла, только маленького (600 Кб) и настольного.

Индексация файлов
Программа index++ проводит индексацию текстовых документов: текст, HTML, XML, LaTeX, почта - всё, что представляет собой по сути простые текстовые файлы но, быть может, со вкраплениями служебных тегов. Индексация проводится очень быстро - на Р4 630 (3ГГц) и 2Гб DDRAM каталог из 270 файлов индексируется за 5 секунд, хотя автор программы предупреждает, что индексация - дело, требующее много памяти.
Поставив уровень подробности 3, можно попросить систему выводить информацию в процессе индексирования. Уровень подробности на индексацию не влияет, по умолчанию программа действует без шума и пыли.
Для индексации (с выводом подробной информации и процессе) текстовых файлов с расширением txt в текущем каталоге и во вложенных рекурсивно даём команду:
index++ -v3 -e "text:*.txt" .
Точка в конце важна, читаем мануал и узнаём почему. Вывод будет примерно такой:

watters_etal_paleobio_2001.txt (2704 words)
WaveMetriconChip64.txt (1351 words)

wshedtopoalgoJMIV.txt (4042 words)

Ye.IJDAR.1.txt (4470 words)

YucelITIP01.txt (1678 words)
./edg:
morphology.txt (753 words)

LuengoEtAl_IbPRIA05.txt (1227 words)
Cuisenaire2005_1250.txt (1162 words)

icpr2004_nucleus.txt (1234 words)

OrtizEtAl_SPIE01.txt (1463 words)

Angulo_VIIP04.txt (1658 words)

682.txt (1901 words)

comorph.txt (1948 words)
index++: ranking index...
index++: writing index...
index++: done: 00:05 (min:sec) elapsed time 548 files,
271 indexed
2465116 words, 1046139 indexed, 56281 unique
В результате в текущем каталоге появится файл swish++.index где лежат сведения о проиндексированных файлах. Отлично: такая куча файлов так быстро проиндексирована. Теперь мы готовы искать интересующие нас документы. В конце мануала (краткого, но очень толкового) приводятся ссылки на литературу - чувствуется, автор в этом деле поднаторел очень крупно.

Поиск файлов
Программа search++ ищет по запросу в индексированной базе swish++.index, созданной программой index++. Ну, для примера поищу-ка я в этой базе статьи по математической морфологии, в которых нет упоминания про медицину:

$ search++ morphology and erosion and dilation not medicine
Мгновение спустя вижу результат (вывод сокращён):
# results: 125
99 ./Krylov2.txt 3771 Krylov2.txt
49 ./13300407.txt 3103 13300407.txt
46 ./morph1.slides.printing.6.txt 4369 morph1.slides.printing.6.txt
37 ./lecture_morphology_sara.txt 6746 lecture_morphology_sara.txt
30 ./SIGGRAPH2002_Sketch-Mitchell.txt 5308 SIGGRAPH2002_Sketch-Mitchell.txt
26 ./MorphologicalImageProcessing.txt 7642 MorphologicalImageProcessing.txt
25 ./phdsymp2002_ledda.txt 8298 phdsymp2002_ledda.txt
23 ./lab2_manual.txt 9313 lab2_manual.txt
23 ./Project 1.txt 9946 Project 1.txt
22 ./morphology.txt 11212 morphology.txt
22 ./edg/morphology.txt 11212 morphology.txt
22 ./slides-6-geometry.txt 11717 slides-6-geometry.txt
22 ./V1BFOGG8.txt 10797 V1BFOGG8.txt
18 ./71650638.txt 13978 71650638.txt
Первая колонка - релевантность, вторая - расположение файла относительно текущей директории, третья - размер файла, четвёртая - имя. Просто и понятно. Можно использовать, как в любом поисковике, AND и NOT для задания более подробной выборки. Анализируя результат поиска, могу сказать, что при релевантности ниже 40-30 можно смело не смотреть тексты - они явно не о том. Результаты этого поиска, кстати, очень даже адекватные: именно это меня и побудило написать скрипты для потоковой сортировки PDF-ников. Но об этом в следующем посте.

Ссылки:
Всё про эту систему рассказать в одном посте просто нереально. Привожу те крохи, которые наскрёб гугл, яху и яндекс по этой замечательной программе.
Домашняя страница проекта на сорсфорж. Здесь много информации по поисковым движкам, и, в частности, про SWISH++, а также статья по поиску в базах данных с использованием перловых скриптов. Документация по SWISH-e, предка SWISH++.

6 комментариев:

  1. Во-первых, ошибка у вас в заголовке статьи - написано SWHISH.
    Во-вторых, я тоже давно уже думаю над тем, что надо-бы заняться индексацие своих файлов, особенно документации.
    Так что ваша статья как раз то что мне нужно.

    ОтветитьУдалить
  2. 1. Спасибо за баг-репорт, поправил. В торопях с работы постил, не заметил. Обновите закладку, если сделали :-)
    2. Дело полезное, поисковая система на рабочей машине - маленькая и шустрая. Сейчас почти готов пост со скриптами. Надо ещё оптимизацией запросов заняться.
    Рад, что статья интересна не только мне :-)

    ОтветитьУдалить
  3. Немножко погуглил и нашёл вот штуку. И пару статей о её применении. Надеюсь, это поможет :)
    По swish-e нашёл статью на LinuxJournal.

    ОтветитьУдалить
  4. 2 kaktys
    Спасибо, но libferris это не совсем то, что надо. Удобнее всё-таки SWISH. Огромное спасибо за статью по SWISH на дштгчощгктфд - пропустил. Буду курить :-)

    ОтветитьУдалить
  5. Судя по вот этой статье, другие настольные поисковики (Tracker, Strigi, Recoll) поддерживают индексацию PDF напрямую.
    И всё же мне лично не
    нравится гонять постоянно фоновый индексатор: даже если диском он жужжит не всегда, то память кушает постоянно ;)

    Так что пока мой выбор pdfgrep.

    ОтветитьУдалить
  6. 2 jetxee пишет...
    Судя по вот этой статье, другие настольные поисковики (Tracker, Strigi, Recoll) поддерживают индексацию PDF напрямую.
    Да, конечно, но мои задачи скромнее: мне нужно просто искать по PDFкам в одной директории. Такие авианосцы как Tracker для моей рыбалки не нужны :-)

    И всё же мне лично не нравится гонять постоянно фоновый индексатор
    Так его и не надо гонять - один раз проиндексировал и ищи на здоровье.

    Так что пока мой выбор pdfgrep.
    Я тоже попробую :-)

    ОтветитьУдалить