`

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自带的词频分析功能,该源代码流程为:先从数据库中读取数据,写入TXT文本中,使用lucene进行索引,然后得出词频分析结果。

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

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

    基于lucene的分词

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

    Javaweb课程作业基于Hadoop的中文词频统计工具源码+使用说明.zip

    Javaweb课程作业基于Hadoop的中文词频统计工具源码+使用说明.zip 一、Linux下配置hadoop集群(伪分布式或完全分布式) 1、https://blog.csdn.net/z1148059382/article/details/89459182 2、Windows下管理HDFS的神器...

    Lucene提取新闻关键词Top-N

    Lucene提取新闻关键词Top-N JDK版本要求1.7,lucene版本要求5.5.3 使用说明: 1、在IndexDocs.java右键run as java application 2、在GetTopTerms.java右键run as java application

    java lucene 实现分词和词干抽取

    用java实现的,利用了lucene里面的standardAnalyzer分析器实现的分词,可以去停用词,再利用波特算法实现 词干提取 最后排序 和词频统计输出

    jiebaForLuceneNet-master

    jieba.NET与Lucene.Net的集成 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。具体来说,分词过程不会借助...

    lean:Lucene文本分析工具

    LEAN是一组Java工具,用于从文本文档中生成词频矩阵。 LEAN工具旨在与GTRI / GA Tech SmallK软件发行版兼容,该软件发行版消耗术语频率矩阵并执行分层和平面聚类。 LEAN软件发行版目前包含两个工具:DocIndexer和...

    C# 盘古分词

    3、 增加词频判断功能,在无法取舍时根据词频取舍 4、 增加优先优先词频选项,通过这个选项动态决定分词粒度 需打开 FreqFirst 5、 增加中文人名前后缀统计和根据该统计定位人名的功能 6、 增加中文人名和未登录...

    Search-Engine:基于文本的信息检索搜索引擎

    1.) 使用 Apache lucene 库索引了超过 25,000 个网页。 2.) 基于词频和逆文档频率的文本搜索。 3.) 实施向量空间模型(使用词频和逆文档频率权重)来对网页进行排名。 4.) 使用邻接矩阵的编码权限/集线器计算...

    word:Java分布式中文分词组件 - word分词

    能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、...

    Toke : Explore, Index and Search the Web-开源

    Toke是一个用于Web探索,索引和搜索Java的Webmining工具包。 Toke允许您爬网公共或私有网站,以创建Web统计信息,Web Pajek图形,Lucene索引和词频文件以进行数据聚类。

    KTDictSeg V1.3 版本

    KTDictSeg 是一个开源的C#.net编写的,分词准确率大于90%,分词速度非常快,支持人名识别,词性标注,词频判断,未登录词识别,字典管理,Lucene.net接口。 ...

    TF-IDF_Calculator

    作业的目的是展示我们对词频逆文档频率 (TF-IDF) 评分的理解。 我们得到的指导很少,并且在如何实施我们的 TF-IDF 方面获得了自由。 我决定使用改编自的实现,因为它看起来简单且接近(如果不完全相同)我们在讲座...

    python搜索引擎

    纯python编写的搜索引擎原型,适合入门学习,源代码一共1000多行...包括一个通过XML配置的多线程的网络爬虫,最简单的analyzer,indexer,query,ranker,实现了词频排序和pagerank排序。还有一个简单的服务器模型。&lt;原创&gt;

Global site tag (gtag.js) - Google Analytics