5

我想用 Lucene 获得一些经常出现的短语。我从 TXT 文件中获取了一些信息,并且由于没有短语信息,例如“信息检索”被索引为两个单独的单词,我失去了很多上下文。

获得这样的短语的方法是什么?我在互联网上找不到任何有用的东西,感谢所有建议、链接、提示,尤其是示例!

编辑:我只按标题和内容存储我的文件:

 Document doc = new Document();
 doc.add(new Field("name", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
 doc.add(new Field("text", fReader, Field.TermVector.WITH_POSITIONS_OFFSETS));

因为对于我所做的最重要的是文件的内容。标题通常根本不是描述性的(例如,我有许多 PDF 学术论文的标题是代码或数字)。

我迫切需要从文本内容中索引出现最多的短语,刚才我看到这种简单的“词袋”方法效率不高。

4

3 回答 3

7

朱莉娅,您正在寻找的似乎是n-grams,特别是Bigrams(也称为搭配)。

这是Manning 和 Schutze 的Foundations of Statistical Natural Language Processing 中关于查找搭配的一章 (PDF)

为了使用 Lucene 执行此操作,我建议将SolrShingleFilterFactory一起使用。有关详细信息,请参阅此讨论

于 2010-06-29T10:27:19.513 回答
0

您是否可以发布您编写的任何代码?

基本上很大程度上取决于您在 lucene 中创建字段和存储文档的方式。

让我们考虑一个我有两个字段的情况:ID 和 Comments;在我的 ID 字段中,我允许像“finding nemo”这样的值,即带空格的字符串。而“评论”是一个自由流动的文本字段,即我允许我的键盘允许的任何内容以及 lucene 可以理解的内容。

现在在现实生活中,将我的 ID:'finding nemo' 作为两个不同的可搜索字符串是没有意义的。而我想索引评论中的所有内容。

所以我要做的是,我将创建一个文档(org.apache.lucene.document.Document)对象来处理这个......像这样的东西

Document doc = new Document();
doc.add(new Field("comments","Finding nemo was a very tough job for a clown fish ...", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("id", "finding nemo", Field.Store.YES, Field.Index.NOT_ANALYZED));

所以,基本上我创建了两个字段:

  1. 评论:我更喜欢通过使用来分析Field.Index.ANALYZED
  2. id:我指示 lucene 存储它但分析它的位置Field.Index.NOT_ANALYZED

这是您为 Default Tokenizer 和分析器自定义 lucene 的方式。否则,您可以编写自己的 Tokenizer 和分析器。

链接 http://darksleep.com/lucene/

希望对你有帮助... :)

于 2010-06-29T09:36:49.717 回答
0

那么丢失短语上下文的问题可以通过使用 PhraseQuery 来解决。

默认情况下,索引包含术语的位置信息,只要您没有通过使用 omitTermFreqAndPositions 选项进行索引创建纯布尔字段。PhraseQuery 使用此信息来定位术语彼此在一定距离内的文档。

例如,假设一个字段包含短语“the quick brown fox jumped over the lazy dog”。在不知道确切短语的情况下,您仍然可以通过搜索具有 quick 和 fox 的字段彼此靠近的文档来找到该文档。当然,一个普通的 TermQuery 可以在知道其中任何一个单词的情况下找到该文档,但在这种情况下,我们只需要包含单词完全并排(快速狐狸)或中间有一个单词的短语的文档(快速[无关]狐狸)。被视为匹配的术语之间的最大允许位置距离称为斜率。距离是按顺序重构短语的术语的位置移动次数。

查看Lucene 的 PhraseQuery 的 JavaDoc

请参阅演示如何使用各种查询对象的示例代码:

您还可以尝试在 BooleanQuery 类的帮助下组合各种查询类型。

关于短语的频率,我想 Lucene 的评分考虑了文档中出现的术语的频率。

于 2010-06-29T13:25:50.177 回答