2009-12-01 58 views
3

我试图为集体智能目的分析Drupal数据库的内容。在Lucene中编写Tokenizer的正确方法

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

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>)。

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

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

编辑: 看着StandardTokenizerImpl让我觉得,如果我要它通过修改实际执行它并不比使用柔性和自己做这么方便的扩展..

回答

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二IBM riguardante每个I VARI SISTEMI operativiLinux DB2,UNIXë视窗。 Questo公司知识管理知识管理系统是一个完整的链接。

你可以使用一个自定义的Lucene Tokenizer和一个html过滤器,但这不是最简单的解决方案 - 使用Jericho会定义为你节省这个任务的开发时间。现有的用于lucene的html分析器可能不想完全按照你想要的来做,因为它们将保留页面上的所有文本。唯一需要注意的是,你最终会处理文本两次,而不是所有的一个流,但除非你处理太字节的数据,否则你不会关心这个性能考虑因素,处理性能是最好的留给你无论如何,您的应用程序都已充实并已将其识别为问题。

2

通常,在使用Lucene索引包含HTML标记的文档时,首先应将HTML解析为带有要离开的部分的文本表示,然后将其馈送到要编入索引的Tokenizer。

请参阅jGuru: How can I index HTML documents?了解更多如何操作的FAQ。

相关问题