在Lucene中编写Tokenizer的正确方法

时间:2009-12-01 15:29:56

标签: java lucene collective-intelligence

我正在尝试分析Drupal数据库的内容以用于集体智能目的。

到目前为止,我已经能够找到一个简单的例子来标记各种内容(主要是论坛帖子)并在删除停用词后计算令牌。

Lucene提供的StandardTokenizer应该能够标记主机名和电子邮件,但内容也可以嵌入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>)。

我应该写一个过滤器还是一个不同的Tokenizer? Tokenizer应该替换标准的或者我可以将它们混合在一起吗?最难的方法是取StandardTokenizerImpl并将其复制到一个新文件中,然后添加自定义行为,但我现在不想在Lucene实现中过深(逐渐学习)。

也许已经有类似的东西已经实施,但我一直无法找到它。

修改 查看StandardTokenizerImpl让我觉得如果我必须通过修改实际实现来扩展它,那么与使用 lex flex 并通过自己..

2 个答案:

答案 0 :(得分:2)

通常,在使用Lucene索引包含HTML标记的文档时,您应首先将HTML解析为包含您要离开的部分的文本表示形式,然后将其提供给要编制索引的Tokenizer。

请参阅jGuru: How can I index HTML documents?以获取有关如何执行此操作的常见问题解答。

答案 1 :(得分:2)

通过在将文本赋予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());

输出:

  

Pubblichiamo la presentazione di IBM riguardante DB2 per i vari sistemi operativiLinux,UNIX e Windows。 Questo documento sta sulla piattaforma KM e lo potetescaricare a questo link。

您可以使用带有html过滤器的自定义Lucene Tokenizer,但这不是最简单的解决方案 - 使用Jericho会定义为您完成此任务的开发时间。 lucene的现有html分析器可能不希望完全按照您的要求进行操作,因为它们会将所有文本保留在页面上。唯一需要注意的是,您最终会将文本处理两次,而不是全部作为一个流处理,但除非您处理太字节数据,否则您不会关心这种性能考虑因素,处理性能是最好的事情,直到你让你的应用充实,并将其确定为一个问题。