Правильный способ написания токенизатора в Lucene - PullRequest
3 голосов
/ 01 декабря 2009

Я пытаюсь проанализировать содержимое базы данных Drupal для целей коллективного интеллекта.

До сих пор мне удавалось разработать простой пример, который токенизирует различное содержимое (в основном сообщения форума) и подсчитывает токены после удаления стоп-слов.

StandardTokenizer, поставляемый с Lucene, должен иметь возможность токенизировать имена хостов и электронные письма, но контент также может иметь встроенный html, например:

Pubblichiamo la presentazione di IBM riguardante DB2 per i vari sistemi operativi
Linux, UNIX e Windows.\r\n\r\nQuesto documento sta sulla piattaforma KM e lo potete
scaricare a questo <a href=\'https://sfkm.griffon.local/sites/BSF%20KM/BSF/CC%20T/Specifiche/Eventi2008/IBM%20DB2%20for%20Linux,%20UNIX%20e%20Windows.pdf\' target=blank>link</a>.

Это плохо маркируется следующим образом:

pubblichiamo -> 1
presentazione -> 1
ibm -> 1
riguardante -> 1
db2 -> 1
vari -> 1
sistemi -> 1
operativi -> 1
linux -> 1
unix -> 1
windows -> 1
documento -> 1
piattaforma -> 1
km -> 1
potete -> 1
scaricare -> 1
href -> 1
https -> 1
sfkm.griffon.local -> 1
sites -> 1
bsf -> 1
20km/bsf -> 1
cc -> 1
20t/specifiche/eventi2008/ibm -> 1
20db2 -> 1
20for -> 1
20linux -> 1
20unix -> 1
20e -> 1
20windows.pdf -> 1
target -> 1
blank -> 1
link -> 1

То, что я хотел бы иметь, это объединять ссылки и удалять html-теги (например, <pre> или <strong>), которые бесполезны.

Должен ли я написать фильтр или другой токенизатор? Токенизатор должен заменить стандартный или я могу их смешать? Сложнее всего было бы взять StandardTokenizerImpl и скопировать его в новый файл, затем добавить пользовательское поведение, но я бы не хотел сейчас слишком углубляться в реализацию Lucene (постепенно изучая).

Возможно, уже реализовано нечто подобное, но я не смог его найти.

EDIT: Глядя на StandardTokenizerImpl, я думаю, что если мне придется расширить его, изменив фактическую реализацию, это не так удобно по сравнению с использованием lex или flex и выполнением этого самостоятельно ... 1028 *

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Этого легче всего достичь, предварительно обработав текст перед тем, как передать его на lucene для токенизации. Используйте html-анализатор, такой как Jericho , чтобы преобразовать ваш контент в текст без HTML, удалив ненужные теги и выделив текст из тех, которые вы делаете. Иерихон TextExtractor идеально подходит для этого и прост в использовании.

String text = "Pubblichiamo la presentazione di IBM riguardante DB2 per i vari sistemi operativi"
    +"Linux, UNIX e Windows.\r\n\r\nQuesto documento sta sulla piattaforma KM e lo potete"
    +"scaricare a questo <a href=\'https://sfkm.griffon.local/sites/BSF%20KM/BSF/CC%20T/Specifiche/Eventi2008/IBM%20DB2%20for%20Linux,%20UNIX%20e%20Windows.pdf\' target=blank>link</a>.";

TextExtractor te = new TextExtractor(new Source(text)){
    @Override
    public boolean excludeElement(StartTag startTag) {
        return startTag.getName() != HTMLElementName.A;
    }
};
System.out.println(te.toString());

Это выводит:

Публичная презентация IBM riguardante DB2 per i vari sistemi operativiLinux, UNIX e Windows. Анкета для подбора документов. KM e lo potetescaricare - ссылка на квест.

Вы можете использовать пользовательский Lucene Tokenizer с html-фильтром, но это не самое простое решение - использование Jericho определенно сэкономит вам время на разработку этой задачи. Существующие html-анализаторы для lucene, вероятно, не хотят делать именно то, что вы хотите, поскольку они сохранят весь текст на странице. Единственное предостережение в этом заключается в том, что вы в конечном итоге обработаете текст дважды, а не все как один поток, но если вы не обрабатываете терабайты данных, вы не будете заботиться об этом из соображений производительности, а работа с производительностью - это то, что лучше оставить, пока вы уточните ваше приложение и в любом случае определили его как проблему.

2 голосов
/ 01 декабря 2009

Как правило, при индексации документов, содержащих разметку HTML, с помощью Lucene, вы должны сначала разобрать HTML в текстовое представление с частями, которые вы хотите оставить, и только затем подать его на Tokenizer для индексации.

См. jGuru: Как я могу индексировать HTML-документы? , чтобы получить ответы на часто задаваемые вопросы о том, как это сделать.

...