- 浏览: 944473 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (385)
- 搜索引擎学习 (62)
- 算法 (1)
- 数据库 (15)
- web开发 (38)
- solr开发 (17)
- nutch 1.2 系统学习 (8)
- cms (1)
- 系统架构 (11)
- linux 与 unix 编程 (16)
- android (15)
- maven (1)
- 关注物流 (1)
- 网址收集 (1)
- 分布式,集群 (1)
- mysql (5)
- apache (1)
- 资料文档备份 (7)
- 上班有感 (0)
- 工作流 (15)
- javascript (1)
- weblogic (1)
- eclipse 集成 (1)
- JMS (7)
- Hibernate (1)
- 性能测试 (1)
- spring (6)
- 缓存cache (1)
- mongodb (2)
- webservice (1)
- HTML5 COCOS2D-HTML5 (1)
- BrowserQuest (2)
最新评论
-
avi9111:
内陷到android, ios, winphone里面也是随便 ...
【HTML5游戏开发】二次开发 BrowserQuest 第一集 -
avi9111:
呵呵,做不下去了吧,没有第二集了吧,游戏是个深坑,谨慎进入,其 ...
【HTML5游戏开发】二次开发 BrowserQuest 第一集 -
excaliburace:
方案3亲测完全可用,顺便解决了我其他方面的一些疑问,非常感谢
spring security 2添加用户验证码 -
yuanliangding:
Spring太强大了。
Spring Data JPA 简单介绍 -
小高你好:
什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?
现在实现基本中文分词功能的代码和软件模块很多,性能也还可以,但是怎样将其应用到NUTCH中的方法介绍相对较少,下面我就实现NUTCH中文分词的NUTCH代码修改方法与步骤,抛砖引玉的介绍一下。
代码修改的切入点是通过对NUTCH处理中文的切分器Tokenizer的修改或者替换(这里介绍的是替换),使中文分词由单字切分变为词语切分。对于相关的NUTCH基本知识,我就不赘述了。因为NUTCH的检索功能基于Lucene,所以你用来替换的切分器必须满足Lucene的Tokenizer特征,最主要的是保证输入与输出相符,分词后输出的必须是Token流。幸运的是,现存的分词程序或软件模块基本上都满足此需要,即使有所偏差,一般通过对其输入输出的修改就可以满足需要。我前面提供给大家的那个分词程序就可以经过简单修改应用于NUTCH中。
设我们实现中文分词功能模块的主类名为MYTokenizer,package为org.apache.nutch.analysis.myt. MYTokenizer,将模块假如项目后,NUTCH代码修改如下:
(需要修改或新增的行后有注释,否则其它行只是为了定位,不修改)
一、修改org\apache\nutch\analysis下的NutchAnalysis.jj文件(此文件由JACC生成)
文件第33行附近:
import org.apache.nutch.searcher.Query.Clause;
import org.apache.lucene.analysis.StopFilter;
+import org.apache. nutch.analysis. myt. MYTokenizer; //新增此行,加入你的切分器
import java.io.*;
import java.util.*;
文件第8 1行附近:
PARSER_END(NutchAnalysis)
TOKEN_MGR_DECLS : {
/** use MYTokenizer to process cjk character */ //新增此行注释
private MYTokenizer myTokenizer = null; //新增此行
/** a global cjk token */ //新增此行注释
private org.apache.lucene.analysis.Token cjkToken = null; //新增此行,输出流
/** start offset of cjk sequence */ //新增此行注释
private int cjkStartOffset = 0; //新增此行
/** Constructs a token manager for the provided Reader. */
public NutchAnalysisTokenManager(Reader reader) {
文件第106行附近:
}
// chinese, japanese and korean characters
| <SIGRAM: <CJK> > //删除此行
| <SIGRAM: (<CJK>)+ > //新增此行(#行)
//以下所有行均为新增,紧接上行代码(#行)书写
{
/**
* use an instance of myTokenizer, myTokenizer, hold the maximum
* matched cjk chars, and cjkToken for the current token;
* reset matchedToken.image use cjkToken.termText();
* reset matchedToken.beginColumn use cjkToken.startOffset();
* reset matchedToken.endColumn use cjkToken.endOffset();
* backup the last char when the next cjkToken is valid.
*/
if(myTokenizer == null) {
myTokenizer = new MYTokenizer (new StringReader(image.toString()));
cjkStartOffset = matchedToken.beginColumn;
try {
cjkToken = myTokenizer.next();
} catch(IOException ioe) {
cjkToken = null;
}
}
if(cjkToken != null && !cjkToken.termText().equals("")) {
//sometime the myTokenizer returns an empty string, is it a bug?
matchedToken.image = cjkToken.termText();
matchedToken.beginColumn = cjkStartOffset + cjkToken.startOffset();
matchedToken.endColumn = cjkStartOffset + cjkToken.endOffset();
try {
cjkToken = myTokenizer.next();
} catch(IOException ioe) {
cjkToken = null;
}
if(cjkToken != null && !cjkToken.termText().equals("")) {
input_stream.backup(1);
}
}
if(cjkToken == null || cjkToken.termText().equals("")) {
myTokenizer = null;
cjkStartOffset = 0;
}
}
二、修改org\apache\nutch\searcher下的Summarizer.java文件(此处修改为提高搜索性能)
文件第189行附近:
将原代码段
if (highlight.contains(t.termText())) {
excerpt.addToken(t.termText());
excerpt.add(new Fragment(text.substring(offset, t.startOffset())));
excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset())));
offset = t.endOffset();
endToken = Math.min(j+SUM_CONTEXT, tokens.length);
}
修改为:
if (highlight.contains(t.termText())) {
if(offset * 2 == (t.startOffset() + t.endOffset() )) { // cjk bi-gram
excerpt.addToken(t.termText().substring(offset - t.startOffset()));
excerpt.add(new Fragment(text.substring(t.startOffset() + 1,offset)));
excerpt.add(new Highlight(text.substring(t.startOffset() + 1 ,t.endOffset())));
}
else {
excerpt.addToken(t.termText());
excerpt.add(new Fragment(text.substring(offset, t.startOffset())));
excerpt.add(new Highlight(text.substring(t.startOffset() ,t.endOffset())));
}
offset = t.endOffset();
endToken = Math.min(j+SUM_CONTEXT, tokens.length);
}
为了提高运行效率,你的分词模块在运行中最好可以将词表读入内存。至于代码修改的原理,说来话长,容后再叙。
发表评论
-
nutch1.4 环境变量设置
2012-04-06 12:52 1686Exception in thread "main& ... -
正则使用
2010-06-18 00:19 1104java正则表达式(java.Regex)HtmlParser ... -
nutch 1.0 读源码,过滤掉不正确的URL实现方法
2010-06-18 00:17 3337nutch 1.0 读源码,过滤掉不正确的URL实现方法: ... -
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputExnutch新发现,为以后备忘
2010-06-16 23:16 2266urls -dir mycrawl -depth 3 -top ... -
HTMLParser 解析html字符串,提取纯文本
2010-05-14 09:59 8293今天在群里问别人怎么提取文本,也没有具体告诉我用什么,只是说用 ... -
HTMLParser的两种使用方法[转]
2010-05-13 23:37 1885HTMLParser的两种使用方法 文章分类:Java编程 ... -
搜索引擎术语
2010-05-05 11:40 1398附录. 术语 B: 半结构化 ... -
影响Lucene索引速度原因以及提高索引速度技巧[转]
2010-04-25 00:11 2715影响Lucene索引速度原因以及提高索引速度技巧 关键字: ... -
如何配置compass的索引位置为相对路径
2009-09-01 19:28 1482Compass是对lucene进行封装 ... -
heritrix 基本介绍
2009-08-01 10:35 3858Heritrix使用小结 1. H ... -
我对HtmlParser 提取网页各属性的总结及示例说明
2009-07-08 13:50 1907/** * 属性过滤器 * @param parser ... -
数学之美 系列十三 信息指纹及其应用
2009-06-25 22:34 10142006年8月3日 上午 11:17:00 ... -
数学之美系列二十一 - 布隆过滤器(Bloom Filter)
2009-06-25 22:27 14872007年7月3日 上午 09:35:00 ... -
用HTMLParser提取URL页面超链接的一段代码(小试牛刀)
2009-06-06 16:54 7059用HTMLParser提取URL页面超 ... -
深入学习Heritrix---解析处理器(Processor)
2009-06-06 13:17 1600键字: heritrix processor 本节解析与 ... -
深入学习Heritrix---解析Frontier(链接工厂)
2009-06-06 10:02 1175Frontier是Heritrix最核心的组成部分之一,也是最 ... -
深入学习Heritrix---解析CrawlController
2009-06-06 10:00 1347当我们以Web UI方式使用Heritrix时,点击任务开始( ... -
深入学习Heritrix---解析Frontier(链接工厂)
2009-06-03 21:50 1488原创作者: pengranxiang 阅读:231次 ... -
lucene2.0+heritrix示例补充
2009-06-03 21:31 1514由于lucene2.0+heritrix一书示例用的网站( ... -
htmlparser 使用手册
2009-05-30 16:47 28832009-05-08 14:20 需要做一 ...
相关推荐
作为舆情监测系统的一部分,本文的目标是基于Nutch,同时,结合目前最常用中文分词技术,根据不同的中文分词方法,实验并得出不同分词方法在性能以及使用环境上的优缺点,以此为舆情监测系统选择合适的中文分词方法...
Nutch中文分词插件的编写与配置,由于Internet的迅猛发展,使得用户查找信息犹如大海捞针,而搜索引擎则能帮用户很好的解决这个问题。 Nutch是用java语言开发的,基于Lucene的...下面介绍Nutch中文分词插件的实现与配置。
nutch应用,nutch中文分词,nutch中文乱码
关于nutch的搜索引擎的中文分词的研究,包括了编写与实现
给个免费的吧!!大家也都不容易,pdf文件,论文
Nutch是一个优秀的开放源代码的Web...分析开源搜索引擎Nutch代码,研究了Nutch的页面排序方法。在Nutch原有的结构基础上提出了3种修改Nutch 排序的方法,对每种方法的实现进行了阐述,最后对这些方法的特点进行了比较
利用Nutch和IKanalyzer构造中文分词搜索引擎
nutch 源代码的详细分析,对于自己实现自己的搜索引擎很有帮助,尤其是将nutch项目嵌入到 自己的项目 当中很有帮助!
nutch 0.9分页代码(粘贴可用)
基于Nutch的中文分词插件实现,张文龙,刘一伟,中文分词是中文垂直搜索引擎中的一个关键技术,分词的好坏直接影响提取文本的精确度。Nutch是一个开源的Web搜索引擎,它为英文用户�
nutch开发工程代码2nutch开发工程代码2nutch开发工程代码2
用于Nutch的中文分词,效果向单簧管得得好,强烈建议支持这种格式的数据,这是一个里程碑
word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene...
Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。 本资源官网上下的源代码。 nutch-2.1 适用于windows系统
nutch开发工程代码1,一些源代码,拿去看看吧,说不定能帮上忙
提高nutch运行效率的原理与方法,nutch的运行过程相对来说还是很慢的,对于一些特殊的应用来说,必须对nutch做很多修改来达到提高速度的目的,本人在这方面有深入研究,可以提高2-5倍性能。
Nutch 解析器parse部分代码笔记
Nutch 是一个开源的、Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。 目 录 1. nutch简介...1 1.1什么是nutch..1 1.2研究nutch的原因...1 1.3 nutch的目标..1 1.4 nutch VS lucene.....2 2....
为了使它能够支持中文搜索,本文在分析了Nutch结构的基础上,采用词表分词技术和前向匹配分词算法对中文信息进行分词,以JavaCC脚本实现上下文相关文法中文分析模块,成功实现了Nutch中文搜索功能。 关键词:搜索...