【问题标题】:Correct way to write a Tokenizer in Lucene在 Lucene 中编写 Tokenizer 的正确方法
【发布时间】:2009-12-01 15:29:55
【问题描述】:

我正在尝试分析 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标签(如&lt;pre&gt;&lt;strong&gt;)。

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

也许已经实现了类似的东西,但我一直找不到。

编辑: 看着StandardTokenizerImpl 让我觉得如果我必须通过修改实际实现来扩展它,与使用 lexflex 并自己做相比并不那么方便。 .

【问题讨论】:

    标签: java lucene collective-intelligence


    【解决方案1】:

    这是最容易实现的,方法是在将文本交给 lucene 进行标记之前对其进行预处理。使用 html 解析器,例如 Jericho,通过去除您不关心的标签并从您关心的标签中提取文本,将您的内容转换为没有 html 的文本。 Jericho 的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 是一个 questo 链接。

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

    【讨论】:

      【解决方案2】:

      通常,当使用 Lucene 索引包含 HTML 标记的文档时,您应该首先将 HTML 解析为包含您想要留下的部分的文本表示,然后才将其提供给 Tokenizer 以进行索引。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2017-01-03
        • 1970-01-01
        相关资源
        最近更新 更多