- 浏览: 958375 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1722Exception in thread "main& ... -
正则使用
2010-06-18 00:19 1132java正则表达式(java.Regex)HtmlParser ... -
nutch 1.0 读源码,过滤掉不正确的URL实现方法
2010-06-18 00:17 3397nutch 1.0 读源码,过滤掉不正确的URL实现方法: ... -
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputExnutch新发现,为以后备忘
2010-06-16 23:16 2294urls -dir mycrawl -depth 3 -top ... -
HTMLParser 解析html字符串,提取纯文本
2010-05-14 09:59 8323今天在群里问别人怎么提取文本,也没有具体告诉我用什么,只是说用 ... -
HTMLParser的两种使用方法[转]
2010-05-13 23:37 1938HTMLParser的两种使用方法 文章分类:Java编程 ... -
搜索引擎术语
2010-05-05 11:40 1431附录. 术语 B: 半结构化 ... -
影响Lucene索引速度原因以及提高索引速度技巧[转]
2010-04-25 00:11 2744影响Lucene索引速度原因以及提高索引速度技巧 关键字: ... -
如何配置compass的索引位置为相对路径
2009-09-01 19:28 1506Compass是对lucene进行封装 ... -
heritrix 基本介绍
2009-08-01 10:35 3908Heritrix使用小结 1. H ... -
我对HtmlParser 提取网页各属性的总结及示例说明
2009-07-08 13:50 1934/** * 属性过滤器 * @param parser ... -
数学之美 系列十三 信息指纹及其应用
2009-06-25 22:34 10382006年8月3日 上午 11:17:00 ... -
数学之美系列二十一 - 布隆过滤器(Bloom Filter)
2009-06-25 22:27 15122007年7月3日 上午 09:35:00 ... -
用HTMLParser提取URL页面超链接的一段代码(小试牛刀)
2009-06-06 16:54 7092用HTMLParser提取URL页面超 ... -
深入学习Heritrix---解析处理器(Processor)
2009-06-06 13:17 1627键字: heritrix processor 本节解析与 ... -
深入学习Heritrix---解析Frontier(链接工厂)
2009-06-06 10:02 1216Frontier是Heritrix最核心的组成部分之一,也是最 ... -
深入学习Heritrix---解析CrawlController
2009-06-06 10:00 1385当我们以Web UI方式使用Heritrix时,点击任务开始( ... -
深入学习Heritrix---解析Frontier(链接工厂)
2009-06-03 21:50 1518原创作者: pengranxiang 阅读:231次 ... -
lucene2.0+heritrix示例补充
2009-06-03 21:31 1543由于lucene2.0+heritrix一书示例用的网站( ... -
htmlparser 使用手册
2009-05-30 16:47 29212009-05-08 14:20 需要做一 ...
相关推荐
在Nutch 1.2中集成IKAnalyzer,需要修改NutchAnalysis.jj文件,将SIGRAM规则调整为支持连续的汉字,然后在代码中初始化IKTokenizer,使其能够处理输入的文本流。通过这种方式,Nutch现在能够对抓取的网页内容进行...
Nutch的源代码包含了整个项目的完整实现,包括爬虫、索引器、搜索器以及相关的配置和文档。这对于开发者和研究者来说是一个宝贵的资源,他们可以深入理解搜索引擎的工作原理,学习如何处理大规模的网络数据,或者对...
Nutch支持多种中文分词工具,如HanLP、jieba和IK Analyzer等,这些工具能够将中文句子分割成有意义的词语,为后续的索引和查询提供基础。 4. **Nutch工作流程**:Nutch的工作流程主要包括URL发现(抓取种子URL并...
2. **分词与词性标注**:在中文环境下,Nutch 可能会使用分词工具,如 IK 分词器或 HanLP,来将文本切分成词汇。但为了处理书名号,需要跳过书名号内的完整词汇,不进行分词。 3. **查询分析**:在用户输入搜索词时...
在这个特定的“Nutch1.0修改版”中,开发者已经对原始代码进行了调整,以整合中文分词功能。这使得Nutch能够更有效地处理中文网页的抓取和索引,从而在中文搜索引擎应用中发挥更大的作用。 中文分词是中文信息处理...
- **可扩展性**:通过简单的接口实现,开发者可以轻松地增加新功能,而无需修改Nutch的核心代码。 - **灵活性**:丰富的插件库使得用户可以根据自身需求选择或开发适合的插件。 - **可维护性**:每个插件专注于独立...
本部分将简要介绍Nutch插件的实际应用案例,包括中文分词插件、索引字段增强插件等。通过具体实例,读者可以更好地理解Nutch插件是如何在实际场景中发挥作用的,以及如何根据自身需求开发和集成插件。 #### 五、在...
5. **优化Nutch源代码**:对于Nutch的源代码进行适当的修改,例如调整摘要长度、改进分词策略等,使其更加符合实际需求。 配合上述方法,我们还可以参考提供的图像和文本资源。"解决摘要问题1.png"、"解决摘要问题2...
Nutch 0.9 允许开发者通过修改配置文件来调整其行为,如设置抓取间隔、选择爬行策略、定义解析规则等。这使得 Nutch 可以适应各种不同的需求和场景。 7. **Hadoop 集成**: 在 Nutch 0.9 中,Hadoop 被用来处理...
6. **自定义开发**:Nutch 提供了丰富的插件机制,允许开发者根据需求自定义解析器、索引器、分词器等。通过修改或创建新的插件,你可以实现特定的抓取策略或处理逻辑。 7. **大数据处理**:Nutch是基于Hadoop构建...
- **修改配置**:对于高级用户,可能需要调整Nutch的默认行为,例如改变分词规则、增加新的数据源或优化索引策略,这都需要修改配置文件。 - **集成其他系统**:Nutch可以与Solr、Elasticsearch等搜索服务器集成,...
1. 使用Git克隆Nutch 1.2的源代码库: ``` git clone https://github.com/apache/nutch.git -b branch-1.2 ``` **构建Nutch** 1. 进入Nutch源代码目录: ``` cd nutch ``` 2. 使用Maven构建Nutch: ``` mvn...
1. **Java编程基础**:由于Nutch是用Java编写的,因此理解和修改Nutch源代码需要扎实的Java基础知识。 2. **搜索引擎原理**:理解搜索引擎的基本工作流程,包括爬虫、预处理、索引和查询处理。 3. **Hadoop和...
如果你想自定义Nutch,你可以根据项目需求修改配置文件,编写新的插件,或者对现有的代码进行调整。例如,你可以创建一个新的解析器来处理特定格式的网页,或者实现一个特殊的搜索算法以提升搜索质量。 总的来说,...
4. **配置文件**: 修改Nutch的配置文件,如`conf/nutch-site.xml`,设置爬虫的基本参数,如抓取间隔、抓取策略等。 5. **初始化数据库**: 创建并初始化HBase或MySQL等数据库,用于存储Nutch抓取的URL和元数据。 6. *...
9. **版本控制**:使用SVN(Subversion)意味着你可以获取到Nutch项目的最新版本,跟踪代码的修改历史,这有利于开发人员协作和代码维护。 10. **社区支持**:作为开源项目,Nutch有一个活跃的开发者社区,提供持续...
Nutch 1.16是该项目的一个稳定版本,已经预先编译完成,方便开发者直接在Eclipse或IntelliJ IDEA这样的集成开发环境中导入使用,无需自行配置和编译源代码。 **Nutch的组成部分** 1. **Web爬虫**:Nutch的爬虫负责...
通过阅读提供的Nutch.pdf文档,你可以更深入地了解Nutch的原理、配置、使用方法以及最佳实践。在学习过程中,不断实践操作,结合源码阅读,将有助于更好地理解和掌握Nutch的功能和用法。祝你在Nutch的学习旅程中取得...
4. **配置 Nutch**: 修改 `conf/nutch-site.xml` 文件,设置爬虫的基本参数,如抓取频率、存储路径、Hadoop 配置等。 5. **创建 Hadoop 目录结构**: 在 HDFS 上创建必要的目录,如 segments 和 crawldb。 6. **启动 ...
在Nutch中,这个过程由其内部机制自动完成,无需手动编写代码。 搜索时,使用QueryParser解析用户输入的关键词,生成Query对象,再通过IndexSearcher执行搜索,获取ScoreDoc数组,表示匹配的文档及其相关性得分。...