След Пред Содержание

## 8. Примеры Gatherer

Следующие примеры устанавливаются в $HARVEST_HOME/gatherers по умолчанию (см. раздел Установка ПО Harvest).

Дистрибутив Harvest содержит несколько примеров того, как конфигурировать, настраивать и запусктаь Gatherer'ы. Это раздел проведет вас через некоторые примеры Gatherer'ов. Цель -- дать вам почувствовать, что вы можете делать с Gatherer'ом и как это делать. Вам не обязательно прорабатывать все эти примеры; каждый из них поучителен по-своему.

Чтобы использовать примеры Gatherer'ов, вам нужно определить каталог bin Harvest'а в вашей переменной пути, и определить HARVEST_HOME. Например:

> `

>             % setenv HARVEST_HOME /usr/local/harvest
>             % set path = ($HARVEST_HOME/bin $path)

> `

## 8.1 Пример 1 - простой Gatherer

Этот пример -- это простой Gatherer, который использует установки по умолчанию. Единственное, что нужно сделать пользователю для работы с этим Gatherer'ом -- это указать список URL'ов, из которых собирать данные (см. раздел Gatherer).

Чтобы запустить этот пример, наберите:

> `

>             % cd $HARVEST_HOME/gatherers/example-1
>             % ./RunGatherer

> `

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите example-1.cf. Первые несколько строчек -- это переменные, которые указывают некоторую локальную информацию о Gatherer'е (см. раздел Задание значений переменных в конфигурационном файле Gatherer'а). Например, каждое резюме содержимого будет содержать имя Gatherer'а (Gatherer-Name), который сгенерировал его, номер порта (Gatherer-Port), который будет использоваться для экспорта индексной информации, каталог, который содержит Gatherer (Top-Directory). Заметьте, что есть один RootNode URL и один LeafNode URL.

После того, как Gatherer закончит, он запустит демон Gatherer, который будет экспортировать резюме содержимого. Чтобы посмотреть резюме, наберите:

> `

>             % gather localhost 9111 | more

> `

Следующий объект SOIF должен выглядеть примерно как тот, который сгенерирует этот Gatherer.

> `

>             @FILE { http://harvest.cs.colorado.edu/~schwartz/IRTF.html
>             Time-to-Live{7}:        9676800
>             Last-Modification-Time{1}:      0
>             Refresh-Rate{7}:        2419200
>             Gatherer-Name{25}:      Example Gatherer Number 1
>             Gatherer-Host{22}:      powell.cs.colorado.edu
>             Gatherer-Version{3}:    0.4
>             Update-Time{9}: 781478043
>             Type{4}:        HTML
>             File-Size{4}:   2099
>             MD5{32}:        c2fa35fd44a47634f39086652e879170
>             Partial-Text{151}:      research problems
>             Mic Bowman
>             Peter Danzig
>             Udi Manber
>             Michael Schwartz
>             Darren Hardy
>             talk
>             talk
>             Harvest
>             talk
>             Advanced
>             Research Projects Agency

>             URL-References{628}:
>             ftp://ftp.cs.colorado.edu/pub/cs/techreports/schwartz/RD.ResearchProblems.Jour.ps.Z
>             ftp://grand.central.org/afs/transarc.com/public/mic/html/Bio.html
>             http://excalibur.usc.edu/people/danzig.html
>             http://glimpse.cs.arizona.edu:1994/udi.html
>             http://harvest.cs.colorado.edu/~schwartz/Home.html
>             http://harvest.cs.colorado.edu/~hardy/Home.html
>             ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/HPCC94.Slides.ps.Z
>             ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/HPC94.Slides.ps.Z
>             http://harvest.cs.colorado.edu/harvest/Home.html
>             ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/IETF.Jul94.Slides.ps.Z
>             http://ftp.arpa.mil/ResearchAreas/NETS/Internet.html

>             Title{84}:      IRTF Research Group on Resource Discovery
>             IRTF Research Group on Resource Discovery

>             Keywords{121}:  advanced agency bowman danzig darren hardy harvest manber mic
>             michael peter problems projects research schwartz talk udi

>             }

> `

Заметьте, что хотя конфигурационный файл Gatherer'а содержит только 2 URL'а (один в разделе RootNode и один в разделе LeafNode), появилось больше, чем 2 резюме в базе данных Gatherer'а. Gatherer развернул RootNode URL на десятки LeafNode URL'ов рекурсивно извлекая ссылки из файла HTML http://harvest.cs.colorado.edu/. Далее, для каждого данного LeafNode в Gatherer'е, было сгенерировано резюме, как в приведенном выше примере для http://harvest.cs.colorado.edu/~schwartz/IRTF.html.

Summarizer HTML извлечет структурированную информацию об авторе и заголовке файла. Он также извлечет любые ссылки URL в атрибут URL-References, а любой тэг привязки anchor -- в атрибут Partial-Text. Остальная информация о файле HTML, такая как его сумма MD5 (см. RFC1321) и его размер (File-Size) в байтах также добавится в резюме содержимого.

## 8.2 Пример 2 - включение информации, сгенерированной вручную

Gatherer способен ``разорвать'' ресурс в поток резюме. Это полезно для файлов, которые содержат информацию, сгенерированную вручную, которая может описывать один или более ресурсов, или для построения шлюза между разными структурированными форматыми и SOIF (см. раздел Формат взаимообмена краткими изложениями документов (SOIF).

Этот пример демонстрирует ``взрыватель'' (exploder) для формата Linux Software Map (LSM). Файлы LSM содержат структурированную информацию (как автор, размещение и т.д.) о доступном ПО для операционных систем Linux.

Чтобы запустить это пример, наберите:

> `

>             % cd $HARVEST_HOME/gatherers/example-2
>             % ./RunGatherer

> `

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите example-2.cf. Заметьте, что Gatherer имеет свой каталог Lib-Directory (обратитесь в раздел Задание значений переменных в конфигурационном файле Gatherer'а за помощью в написании конфигурационных файлов). Каталог библиотеки содержит настройки для типов и выбора кандидатов Essence. В этом примере, мы только настроили шаг выбора кандидатов. lib/stoplist.cf определяет типы, которые Essence должен проиндексировать. Этот пример использует пустой файл stoplist.cf, что говорит Essence индексировать все файлы.

Gatherer получает каждый из LeafNode URL'ов, которые являются файлами в формате Linux Software Map в FTP архиве Linux tsx-11.mit.edu. Gatherer понимает, что файл ``.lsm'' -- это файл типа LSM, так как в lib/byname.cf присутствует эвристика по имени.Тип LSM -- это упакованный тип, что указано в исходном коде Essence (src/gatherer/essence/unnest.c). Для упакованных типов запускаются программы Exploder (называемые `TypeName.unnest`), а не обычные summarizer'ы. Программа `LSM.unnest` -- это стандартная программа exploder, которая берет файл LSM и генерирует один или более соотвествующих объектов SOIF. Когда Gatherer завершает работу, он содержит один или более соответствующих объектов SOIF для ПО, описанного в каждом файле LSM.

Потом Gatherer запускает демон Gatherer, который будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

> `

>             % gather localhost 9222 | more

> `

Так как tsx-11.mit.edu -- популярный и загруженный архив, Gatherer часто не сможет получить файлы LSM. Если вы подозреваете, что что-то подобное случилось, посмотрите log.errors и log.gatherer, чтобы определить проблему.

Следующие два объекта SOIF были сгенерированы этим Gatherer'ом. Первый объект -- описывает сам файл LSM, а второй -- ПО, описанное в файле LSM.

> `

>             @FILE { ftp://tsx-11.mit.edu/pub/linux/docs/linux-doc-project/man-pages-1.4.lsm
>             Time-to-Live{7}:        9676800
>             Last-Modification-Time{9}:      781931042
>             Refresh-Rate{7}:        2419200
>             Gatherer-Name{25}:      Example Gatherer Number 2
>             Gatherer-Host{22}:      powell.cs.colorado.edu
>             Gatherer-Version{3}:    0.4
>             Type{3}:        LSM
>             Update-Time{9}: 781931042
>             File-Size{3}:   848
>             MD5{32}:        67377f3ea214ab680892c82906081caf
>             }

>             @FILE { ftp://ftp.cs.unc.edu/pub/faith/linux/man-pages-1.4.tar.gz
>             Time-to-Live{7}:        9676800
>             Last-Modification-Time{9}:      781931042
>             Refresh-Rate{7}:        2419200
>             Gatherer-Name{25}:      Example Gatherer Number 2
>             Gatherer-Host{22}:      powell.cs.colorado.edu
>             Gatherer-Version{3}:    0.4
>             Update-Time{9}: 781931042
>             Type{16}:       GNUCompressedTar
>             Title{48}:      Section 2, 3, 4, 5, 7, and 9 man pages for Linux
>             Version{3}:     1.4
>             Description{124}:       Man pages for Linux.  Mostly section 2 is complete.  Section
>             3 has over 200 man pages, but it still far from being finished.
>             Author{27}:     Linux Documentation Project
>             AuthorEmail{11}:        DOC channel
>             Maintainer{9}:  Rik Faith
>             MaintEmail{16}: faith@cs.unc.edu
>             Site{45}:       ftp.cs.unc.edu
>             sunsite.unc.edu
>             tsx-11.mit.edu
>             Path{94}:       /pub/faith/linux
>             /pub/Linux/docs/linux-doc-project/man-pages
>             /pub/linux/docs/linux-doc-project
>             File{20}:       man-pages-1.4.tar.gz
>             FileSize{4}:    170k
>             CopyPolicy{47}: Public Domain or otherwise freely distributable
>             Keywords{10}:   man
>             pages

>             Entered{24}:    Sun Sep 11 19:52:06 1994
>             EnteredBy{9}:   Rik Faith
>             CheckedEmail{16}:       faith@cs.unc.edu
>             }

> `

Мы также построили Gatherer, который переводит около пяти индесных файлов из различных PC архивов в более, чем 25000 резюме. Каждый из этих индексных файлов содержит сотни однострочных описаний о программном обеспечении, которые доступны по анонимному доступу FTP.

## 8.3 Пример 3 - Настройка распознавания типов и выбора кандидатов

Этот пример демонстрирует, как настроить шаги распознавание типов и выбора кандидатов в Gatherer'е (см. раздел Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования). Этот Gatherer распознает страницы WWW, и он сконфигурирован только для собирания индексной информации с этих страниц.

Чтобы запустить этот пример, наберите:

> `

>             % cd $HARVEST_HOME/gatherers/example-3
>             % ./RunGatherer

> `

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите example-3.cf. Как в разделе Пример 2, этот Gatherer имеет свой библиотечный каталог, который содержит настройки Essence. Так как мы заинтересованы только в индексировании домашних страниц, нам нужно только определить эвристику для распознавания домашних страниц. Как показано ниже, мы можем использовать эвристику по именам URL для определения домашних страниц в lib/byurl.cf. Мы также добавили тип по умолчанию Unknown, чтобы сделать выбор кандидатов проще.

> `

>             HomeHTML                ^http:.*/$
>             HomeHTML                ^http:.*[hH]ome\.html$
>             HomeHTML                ^http:.*[hH]ome[pP]age\.html$
>             HomeHTML                ^http:.*[wW]elcome\.html$
>             HomeHTML                ^http:.*/index\.html$

> `

Конфигурационный файл lib/stoplist.cf содержит список типов, которые не надо индексировать. В этом примере Unknown -- это единственный тип, занесенный в этот список, так что Gatherer будет отклонятьт только файлы типа Unknown. Вы можете также распознавать URL'ы по именам файлов (в byname.cf) или по содержимому (в bycontent.cf и magic); хотя в этом примере, нам не нужно использовать эти механизмы. Summarizer `HomeHTML.sum`, установленный по умолчанию, суммирует все файлы HomeHTML.

После того, как Gatherer закончит работу, он запустит демон Gatherer, который будет предоставлять резюме содержимого объектов. Вы заметите, что присутствуют только резюме для файлов HomeHTML. Чтобы посмотреть резюме, наберите:

> `

>             % gather localhost 9333 | more

> `

## 8.4 Пример 4 - настройка распознавания типов и суммирование

Этот пример демонстрирует, как настроить шаги распознавания типов и суммирования в Gatherer'е (см. раздел Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования. Gatherer распознает два новых формата файлов и суммирует их должным образм.

Чтобы посмотреть конфигурационный файл Gatherer'а, посмотрите example-4.cf. Как в примерах в Пример 2 и Пример 3, этот Gatherer имеет свой библиотечный каталог, который содержит конфигурационные файлы Essence. Конфигурационные файлы Essence такие же, как и для настроек по умолчанию, кроме lib/byname.cf, который содержит две настройки для новых форматов файлов.

### Использование регулярных выражений для суммирования формата

Первый новый формат -- тип ``ReferBibliographic'', который `относится` к использованию программ для представления библиографической информации. Чтобы понять, что файл записан в этом формате, мы будем использовать соглашение, что имена файлов заканчиваются на ``.referbib''. Таким образом, мы добавим эвристику по имени для настройки распознвания типов. Эвристика по именам представляется в виде регулярного выражения напротив имени файла в lib/byname.cf:

> `

>             ReferBibliographic      ^.*\.referbib$

> `

Теперь, чтобы написать summarizer для этого типа, нам понадобится образец файла ReferBibliographic:

> `

>             %A A. S. Tanenbaum
>             %T Computer Networks
>             %I Prentice Hall
>             %C Englewood Cliffs, NJ
>             %D 1988

> `

Summarizer'ы Essence извлекают структурированную информацию из файлов. Один способ написать summarizer -- использовать регулярные выражения для определения, что надо извлекать. Для каждого типа информации, который вы хотите извлечь из файла, добавьте регулярное выражение, которое подойдет для нужных строк в файл lib/quick-sum.cf. Например, следующие регулярные выражения в lib/quick-sum.cf извлекут автора, заглавие, дату и другую информацию из файлов ReferBibliographic:

> `

>             ReferBibliographic      Author                  ^%A[ \t]+.*$
>             ReferBibliographic      City                    ^%C[ \t]+.*$
>             ReferBibliographic      Date                    ^%D[ \t]+.*$
>             ReferBibliographic      Editor                  ^%E[ \t]+.*$
>             ReferBibliographic      Comments                ^%H[ \t]+.*$
>             ReferBibliographic      Issuer                  ^%I[ \t]+.*$
>             ReferBibliographic      Journal                 ^%J[ \t]+.*$
>             ReferBibliographic      Keywords                ^%K[ \t]+.*$
>             ReferBibliographic      Label                   ^%L[ \t]+.*$
>             ReferBibliographic      Number                  ^%N[ \t]+.*$
>             ReferBibliographic      Comments                ^%O[ \t]+.*$
>             ReferBibliographic      Page-Number             ^%P[ \t]+.*$
>             ReferBibliographic      Unpublished-Info        ^%R[ \t]+.*$
>             ReferBibliographic      Series-Title            ^%S[ \t]+.*$
>             ReferBibliographic      Title                   ^%T[ \t]+.*$
>             ReferBibliographic      Volume                  ^%V[ \t]+.*$
>             ReferBibliographic      Abstract                ^%X[ \t]+.*$

> `

Первое поле в lib/quick-sum.cf -- это имя типа. Второе поле -- атрибут, под которым надо извлекать информацию в строках, удовлетворяющих регулярному выражению из третьего поля.

### Использование программ для суммирования формата

Второй новый формат -- это тип ``Abstract'', который является файлом, содержащим только текст с кратким описанием статьи (формат, который является принятым в технических отчетах архивов FTP). Чтобы распознать, что файл написан в этом формате, мы используем соглашение, что имена файлов типа ``Abstract'' заканчиваются на ``.abs''. Таким образом, мы добавим настройку распознавания типов в файл lib/byname.cf в виде регулярного выражения:

> `

>             Abstract                ^.*\.abs$

> `

Другой способ написания summarizer'а -- написать программу или скрипт, который принимает имя файла как первый аргумент командной строки, извлекает структурированную информацию, затем выдает результат в виде списка пар SOIF атрибут-значение.

Программы Summarizer называется `TypeName.sum`, так что мы назовем наш новый summarizer `Abstract.sum`. Не забудьте поместить программу в каталог, который есть в вашей переменной пути, чтобы Gatherer мог запустить ее. Вы увидите ниже, что `Abstract.sum` -- это скрипт оболочки Bourne, который берет первые 50 строк файла, объявляет их атрибутом ``Abstract'' и выдает в виде пары SOIF атрибут-значение.

> `

>             #!/bin/sh
>             #
>             #  Usage: Abstract.sum filename
>             #
>             head -50 "$1" | wrapit "Abstract"

> `

### Запуск примера

Чтобы запустить этот пример, наберите:

> `

>             % cd $HARVEST_HOME/gatherers/example-4
>             % ./RunGatherer

> `

После того, как Gatherer закончит свою работу, он запустит демон Gatherer, который будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

> `

>             % gather localhost 9444 | more

> `

## 8.5 Пример 5 - Использование фильтров RootNode

Этот пример демонстрирует, как использовать фильтры RootNode для настройки выбора кандидатов в Gatherer'е (см. раздел Фильтры RootNode). Только объекты, которые пройдут через фильтры, будут получены по сети (см. раздел Нумерация Gatherer'а и выбор кандидатов).

Чтобы запустить этот пример, наберите:

> `

>             % cd $HARVEST_HOME/gatherers/example-5
>             % ./RunGatherer

> `

После того, как Gatherer закончит свою работу, он запустит демон Gatherer, который будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

> `

>             % gather localhost 9555 | more

> `

След Пред Содержание