`

lucene中的词频

阅读更多

lucene in action作为action系列,确实坚持了其实用性的特色。全书花了很大的篇幅来讲解查询的解析,结果的优化和lucene应用上。很适合要做全文检索的人学习使用。但是lucen的功能决不仅仅在做搜索引擎上。如果不是最近看到一篇介绍用lucene作词频,文档统计的文章的话,我可能到现在还在为寻找一种用于专业研究的工具而苦恼。其实lucene可以很轻松地实现信息检索课中提到的要求,例如:

* 统计,实现以下功能
* (1) 统计term在整个collection中的文档频度(document frequency, DF);
(2) 统计term在整个collection中出现的词次(term frequency in whole collection);
(3) 统计term在某个文档中出现的频度(term frequency, TF);
(4) 列出term在某文档中出现的位置(position);
(5) 整个collection中文档的个数;

下面是我参考那篇文章写的一个程序:

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.index.TermPositions;


public class Statistic {
/*
* 统计,实现以下功能
* (1) 统计term在整个collection中的文档频度(document frequency, DF);
(2) 统计term在整个collection中出现的词次(term frequency in whole collection);
(3) 统计term在某个文档中出现的频度(term frequency, TF);
(4) 列出term在某文档中出现的位置(position);
(5) 整个collection中文档的个数;

* */
static final Log log = LogFactory.getLog(Statistic.class);

public static void printIndex(IndexReader reader) throws Exception{
  
   //显示document数
   log.debug(new Date()+"\n");
   log.debug(reader+"\t该索引共含 "+reader.numDocs()+"篇文档\n");
  
   for(int i=0;i<reader.numDocs();i++){
    log.debug("文档"+i+":"+reader.document(i)+"\n");
   }
  
   //枚举term,获得<document, term freq, position* >信息
   TermEnum termEnum=reader.terms();
   while(termEnum.next()){
    log.debug("\n"+termEnum.term().field()+"域中出现的词语:"+termEnum.term().text());
    log.debug(" 出现改词的文档数="+termEnum.docFreq());
   
    TermPositions termPositions=reader.termPositions(termEnum.term());
    int i=0;
    int j=0;
    while(termPositions.next()){
     log.debug("\n"+(i++)+"->"+"    文章编号:"+termPositions.doc()+", 出现次数:"+termPositions.freq()+"    出现位置:");
     for(j=0;j<termPositions.freq();j++) log.debug("["+termPositions.nextPosition()+"]");
     log.debug("\n");
     }
   
    /*TermDocs termDocs=reader.termDocs(termEnum.term());
    while(termDocs.next()){
     log.debug((i++)+"->DocNo:"+termDocs.doc()+",Freq:"+termDocs.freq());
    }*/
   }
  
}

public static void main(String args[]) throws Exception{
   String index=ReadConfig.getPara("indexdir");
   IndexReader reader=IndexReader.open(index);
   printIndex(reader);
  
}
}

对资料《传记》进行统计,选取结果片断如下:

contents域中出现的词语:责任 出现改词的文档数=9


0->    文章编号:3, 出现次数:2    出现位置:[3150][3811]

1->    文章编号:6, 出现次数:7    出现位置:[715][738][1046][1846][4437][6319][6463]

2->    文章编号:7, 出现次数:2    出现位置:[4676][5856]

3->    文章编号:8, 出现次数:1    出现位置:[5824]

4->    文章编号:9, 出现次数:2    出现位置:[1840][8946]

5->    文章编号:10, 出现次数:2    出现位置:[2275][3252]

6->    文章编号:11, 出现次数:2    出现位置:[2456][6870]

7->    文章编号:12, 出现次数:3    出现位置:[6062][8090][8124]

8->    文章编号:15, 出现次数:3    出现位置:[100][1055][3078]

注:我使用的是log4j+commons logging作为输出方法(呵呵,感觉比BufferedWriter好用多了),中文分词方面选用的是基于词典的IK_CAnalyzer分词类,效果较好,基本可以满足使用。

分享到:
评论
3 楼 qq272936993 2013-06-04  
你好..你这个功能貌似还是简单了点,不知道是否有Lucene自带的能多这些词语的过滤以及排序功能?(但获取词频的角度,不调用query).谢谢!!
2 楼 linshouyi 2012-07-26  
非常好,学习了,但是想问一下,对于给定的term,比如new Term("标题","中国"),能否得到 指定id的document中的tf?而不是像你这里的用termDocs.next()遍历每一个document。不是遍历,而是通过document的id。不知道是否可以。
1 楼 zuoxiaofei123 2011-09-06  
您好,我想问下,
String index=ReadConfig.getPara("indexdir");
IndexReader reader=IndexReader.open(index);
这段代码中,IndexReader的open方法能传入字符串做参数吗,好像是Directory类型的参数才能传入。
我修改之后,运行您写的程序还是报错,如下:
Exception in thread "main" org.apache.lucene.index.IndexNotFoundException: no segments* file found in org.apache.lucene.store.SimpleFSDirectory@E:\SogouC.reduced\Reduced\C000008 lockFactory=org.apache.lucene.store.NativeFSLockFactory
请问,这是什么原因呢?怎么解决?

相关推荐

    基于lucene的词频分析源代码

    **基于Lucene的词频分析源代码** 在信息检索和自然语言处理领域,词频分析是一种重要的技术,它用于理解文本中的关键词分布和频率。Lucene,作为一个强大的全文搜索引擎库,提供了内置的分析器和工具,支持对文本...

    引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar

    标题中的“引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar”表明这是一个基于Lucene的中文分词工具,它利用了局部统计信息来识别和处理中文文本中的高频词汇。Lucene是一个开源全文检索库,广泛...

    Lucene示例 BM25相似度计算

    TF-IDF是“词频-逆文档频率”的缩写,它重视在少有文档中出现的词项,认为这样的词项更能区分文档。然而,TF-IDF并未考虑文档长度,可能会导致短文档被过度评价。 BM25引入了文档长度正常化的概念,使得长文档不会...

    基于lucene的分词

    java代码,基于Lucene和mysql的简单的字符串匹配分词系统

    lucene in action源码

    8. **相关性排名**:Lucene使用TF-IDF(词频-逆文档频率)算法计算文档与查询的相关性,得分高的文档排在搜索结果前列。 9. **多字段搜索**:Lucene支持在多个字段上同时进行搜索,例如可以在标题、内容等多个字段...

    lucene的jar包,欢迎下载

    Lucene的主要目标是为软件开发人员提供一个简单易用的工具包,使他们能够在自己的应用中实现全文检索功能。 【描述】中提到的"lucene.jar包"是Lucene的核心库文件,包含了执行全文检索所需的所有类和方法。"全文...

    lucene整理文档,lucene详细描述,安装使用过程。

    TF-IDF(词频-逆文档频率)是 Lucene 默认的评分算法,但也可以自定义评分函数以满足特定需求。 **优化与更新** 为了提高性能,Lucene 提供了合并段(Merge Segments)的操作,可以定期或在添加大量新数据后进行,...

    lucene3源码分析

    - **反向信息**:涉及词典、文档号和词频等信息。 - **其他信息**:例如标准化因子和删除文档信息。 #### 四、Lucene索引过程分析 Lucene的索引过程是一个复杂而有序的操作流程,主要步骤如下: - **1. 创建...

    lucene3.6 搜索例子

    3. 结果排序:Lucene提供TF-IDF(词频-逆文档频率)算法进行默认的排名。开发者也可以自定义评分函数,根据实际需求调整结果的排序。 4. 结果集获取:使用TopDocs类来获取搜索结果,它包含了匹配文档的数量以及按...

    lucene 小资源

    同时,理解信息检索的基本理论,如TF-IDF(词频-逆文档频率)和布尔模型,也有助于深入理解Lucene的工作原理。 总的来说,这个“lucene 小资源”很可能包含了一些示例代码、笔记、教程或者是作者在实践过程中遇到...

    lucene jar包

    4. **搜索与评分**:Lucene的搜索算法基于TF-IDF(词频-逆文档频率)和BM25,能准确评估文档与查询的相关性,并按照相关性对结果进行排序。此外,还可以自定义评分函数以满足特定需求。 5. **更新与优化**:Lucene...

    lucene1.4.3.jar

    这个过程涉及到了TF-IDF(词频-逆文档频率)算法,它综合考虑了术语在文档中的出现频率和在整个文集中的普遍程度,以评估文档的相关性。 此外,Lucene 1.4.3还提供了丰富的API供开发者使用,例如,IndexWriter用于...

    Lucene实战

    Lucene采用TF-IDF(词频-逆文档频率)算法进行相关性排名。同时,它还支持布尔查询、短语查询、近似查询等多种复杂的搜索模式。 7. **过滤与排序** 除了基本的搜索外,Lucene还支持过滤器(Filter)和排序(Sort...

    luceneDemo(完整代码)

    在Lucene中,搜索结果默认按照相关度进行排序,这主要依赖于TF-IDF(词频-逆文档频率)算法。Term Frequency (TF) 衡量一个词在文档中的重要性,Inverse Document Frequency (IDF) 则衡量一个词在整个文集中的独特性...

    spring-lucene简单项目

    在"spring-lucene简单项目"中,你还会遇到一些关键概念,例如倒排索引、TF-IDF(词频-逆文档频率)相关性计算、以及布尔查询等。这些都是Lucene实现高效搜索的基础。 通过这个项目,你不仅能够掌握Spring和Lucene的...

    Lucene实战源码(Lucene in Action Source Code)part1

    TF-IDF(Term Frequency-Inverse Document Frequency)是常见的评分算法,它结合了词频和文档频率来衡量一个词项在文档中的重要性。 此外,Lucene还支持多种搜索类型,如全文搜索、范围搜索、前缀搜索和模糊搜索。...

    Lucene介绍的PPT

    Lucene的目标是简化中小型应用程序的全文检索集成,使开发者能够轻松地在其应用中添加这一功能。 **历史发展** Lucene最初由Doug Cutting创建并发布在他的个人网站www.lucene.com,随后在2001年底成为Apache基金会...

    lucene

    2. 匹配(Scoring):Lucene使用TF-IDF(词频-逆文档频率)算法计算文档与查询的相关性得分。 3. 排序与返回(Ranking & Retrieval):根据得分对匹配文档进行排序,并按需返回前N个结果。 四、扩展与优化 1. 近...

    lucene索引文件格式介绍

    这方面的信息存储在各种文件中,如segments_N(段信息),fnm(域名和索引方式),fdx/fdt(文档域信息),tvx/tvd/tvf(Term Vector信息,包含词频、位置等)。 反向信息(Inverted Index)则提供了从词到文档的...

Global site tag (gtag.js) - Google Analytics