- 浏览: 480934 次
- 性别:
- 来自: 湖南
文章分类
- 全部博客 (201)
- j2ee (43)
- oracle (9)
- mysql (7)
- db2 (1)
- j2se (3)
- spring (1)
- hibernate (3)
- struts (0)
- Berkeley DB (0)
- linux (60)
- Apache2+PHP+MYSQL (2)
- solr (15)
- svn (1)
- IntelliJ Idea (1)
- eclipse,myeclipse (4)
- ant (2)
- vim (8)
- IT生活 (4)
- 测试 (6)
- lucene (4)
- shell (1)
- nutch (18)
- thread (1)
- hadoop (5)
- mapreduce (0)
- Python (4)
- 硬件 (1)
- database (1)
- maven (1)
- 正则表达 (0)
- 互联网 (1)
最新评论
-
youngcoder:
good job
HTTP协议头部与Keep-Alive模式详解 -
javazdq:
受教了 解释的不错。
lucene创建索引高级特性和索引创建参数优化 -
josico:
有几个问题想问下楼主1. LinkedBlockingQueu ...
生产者-消费者-BlockingQueue -
annybz:
有没有关于 BlockingQueue和ConcurrentL ...
生产者-消费者-BlockingQueue -
uniquejava:
多谢,记录的很真实。
DB2 学习记录
1 中文分词介绍
中文分词是在做检索类系统时需要重点考虑的一个因素。Nutch的本土化过程也需要更改对中文分词的支持。目前,Nutch中文分词方式大致有两种方式:
一是修改源代码。这种方式是直接对Nutch分词处理类进行修改,调用已写好的一些分词组件进行分词。
二是编写分词插件。这种方式是按照Nutch定义的插件编写规则重新编写或者添加中文分词插件。
以上两种方式都是可取的。目前,由于开源社区的活跃,已经有很多种分词组件的出现,无论是修改源代码的方式还是编写分词插件的方式,都是依赖于这些分词组件的。下面列出了主要的一些分词组件:
1、CJKAnalyzer
Lucene自带的一种中日韩分词器。
2、ChineseAnalyzer
Lucene自带的对中文的分词器
3、IK_CAnalyzer(MIK_CAnalyzer)
一种基于词典的分词器,Lucene自带,相对而言较简单。
4、Paoding分词
比较有名的庖丁解牛分词组件,效率高分词速度快,分词准确度高。
5、JE分词
网友编写的分词组件,性能也不错。
6、ICTCLAS
中科院的一组分词工具,其中有开源的也有收费版本,他基于HMM模型。主要的几个如下:
ICTCLAS_OpenSrc_C_windows、ICTCLAS_OpenSrc_C_Linux为中科院计算所张华平和刘群老师研制。
SharpICTCLAS为.net平台下的ICTCLAS,是由河北理工大学经管学院吕震宇根据Free版ICTCLAS改编而成,并对原有代码做了部分重写与调整。
ictclas4j中文分词系统是sinboy在中科院张华平和刘群老师的研制的FreeICTCLAS的基础上完成的一个java开源分词项目,简化了原分词程序的复杂度,旨在为广大的中文分词爱好者一个更好的学习机会。
imdict-chinese-analyzer是 imdict智能词典的智能中文分词模块,作者高,算法基于隐马尔科夫模型(Hidden
Markov Model,
HMM),是中国科学院计算技术研究所的ictclas中文分词程序的重新实现(基于Java),可以直接为lucene搜索引擎提供中文分词支持。
2 分词结构分析
在进行实验之前需要对Nutch分词结构进行分析。本文仔细研究了一下Nutch的org.apache.nutch.anlysis包,其中大多的类都
是与Nutch在爬行网页时候对网页中的文本分词解析相关的。Nutch解析文本类的架构得非常好,下面就让我们来研究下它的架构吧,了解清楚之后就可以
为我们之后加入中文分词打下很好的基础。
Nutch分词的最底层使用的是lucene的Analyzer抽象类,它位于org.apache.lucene.analysis包
中,NutchAnalyzer继承了Analyzer类、实现了Configurable、Pluggable接口,该抽象类中定义了一个公有的抽象方
法tokenStream(String fieldName, Reader
reader)返回的类型是TokenStream。该方法是用于分析文本,其后的具体类中在这个方法中实现了从文本中提取索引词组的策略、算法。而返回
的TokenStream类是即可以从文本或者从查询词组中枚举token序列的抽象类,在Lucene中继承了它的具体类有Tokenizer、
TokenFilter。
NutchAnalyzer类是Nutch中扩展分析文本的扩展点,所有用于解析文本的插件都得实现这个扩展点。对于Analyzer一个典型的扩展就是
首先建立一个Tokenizer(org.apache.lucene.analysis.Tokenizer),它是用于将Reader中读入的
Stream分解成最原始的词组(Token---org.apache.lucene.analysis.Token),在Tokenzier分解
Stream之后,一个或多个TokenFilter会用于过滤这些词组中无意义的词组。
NutchDocumentAnalyzer类继承了NutchAnalyzer,其中有三个静态私有内部类ContentAnalyzer、
AnchorFilter、AnchorAnalyzer
它们分别继承了Analyzer(org.apache.lucene.analysis.Analyzer)、
TokenFilter(org.apache.lucene.analysis.TokenFilter)、
Analyzer(org.apache.lucene.analysis.Analyzer)。在ContentAnalyzer中调用了
CommonGrams类(org.apache.nutch.analysis),该类构建了一个n-grams的分词方案,因为需要在索引中考虑词组
的出现频率,并且实现了对n-grams方案词组查询的优化措施。在n-grams方案中单个的词组同样会被该方案索引,索引期间大量使用了
Token(org.apache.lucene.analysis.Token)的各种方法,并且还会调用nutch/conf/nutch-
default.xml中analysis.common.terms.file的配置属性。
其上各个类与接口的uml图如下:
对应前面一篇文章就可以再仔细研究Nutch其他结构就可以大概知道如何在Nutch中加入中文的分词方法了,从分析中我们可以看出来,Nutch的分词
大量使用了Lucene的基本抽象类或接口,这也是与两个项目的主持人同为Doug
Cutting分不开的,当然了Lucene的良好架构也奠定了各种应用对其扩展使用的基础。
3 实验过程
本次实验选择了paoding分词组件和imdict-chinese-analyzer作为实验工具。
3.1 paoding plugin
以下是paoding分词组件的实验:
1、实验准备
下载paoding分词组件(下载地址:http://code.google.com/p/paoding/
)将下载下的文件paoding-analysis-2.0.4-beta.zip解压,得到paoding-analysis.jar。
本次实验假设Nutch已配置好。
2、在src/plugin下面新建一个目录:analysis-zh作为分词组件包,新建一个lib-paoding-analyzers存放paoding-analysis.jar。
3、在analysis-zh包中建立两个文件一个文件夹,分别为:
build.xml:
<project name="analysis-zh" default="jar-core">
<import file="../build-plugin.xml"/>
<!-- Build compilation dependencies -->
<target name="deps-jar">
<ant target="jar" inheritall="false" dir="../lib-paoding-analyzers"/>
</target>
<!-- Add compilation dependencies to classpath -->
<path id="plugin.deps">
<fileset dir="${nutch.root}/build">
<include name="**/lib-paoding-analyzers/*.jar" />
</fileset>
</path>
</project>
plugin.xml:
<plugin
id="analysis-zh"
name="Paoding Analysis Plug-in"
provider-name="net.paoding">
<runtime>
<library name="paoding-analysis.jar">
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="nutch-extensionpoints"/>
<import plugin="lib-lucene-analyzers"/>
</requires>
<extension id="org.apache.nutch.analysis.zh"
name="Paoding Analyzer"
point="org.apache.nutch.analysis.NutchAnalyzer">
<implementation id="PaodingAnalyzer"
class="org.apache.nutch.analysis.zh.PaodingAnalyzer">
<parameter name="lang" value="fr"/>
</implementation>
</extension>
</plugin>
Src/Java文件夹,里面新建一个包:org/apache/nutch/analysis/zh,在该包内新建文件PaodingAnalyzer.java:
package org.apache.nutch.analysis.zh;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
public class PaodingAnalyzer {
private final static Analyzer ANALYZER =
new net.paoding.analysis.analyzer.PaodingAnalyzer();
/** Creates a new instance of ChineseAnalyzer */
public PaodingAnalyzer() { }
public TokenStream tokenStream(String fieldName, Reader reader) {
return ANALYZER.tokenStream(fieldName, reader);
}
}
在lib-paoding-analyzers文件夹下建立如下文件:
build.xml:
<?xml version="1.0"?>
<project name="lib-paoding-analyzers" default="jar">
<import file="../build-plugin.xml"/>
<!--
! Override the compile and jar targets,
! since there is nothing to compile here.
! -->
<target name="compile" depends="init"/>
<target name="jar" depends="compile">
<copy todir="${build.dir}" verbose="true">
<fileset dir="./lib" includes="**/*.jar"/>
</copy>
</target>
</project>
plugin.xml:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="lib-paoding-analyzers"
name="Paoding Analysers"
provider-name="net.paoding">
<runtime>
<library name="lib-paoding-analyzers.jar">
<export name="*"/>
</library>
</runtime>
</plugin>
新建一个lib文件夹,将paoding-analysis.jar放入其中。
另外,修改NutchDocumentAnalyzer为:
package org.apache.nutch.analysis;
// JDK imports
import java.io.Reader;
import java.io.IOException;
// Lucene imports
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Token;
import org.apache.hadoop.conf.Configuration;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
/**
* The analyzer used for Nutch documents. Uses the JavaCC-defined lexical
* analyzer {@link NutchDocumentTokenizer}, with no stop list. This keeps it
* consistent with query parsing.
*/
public class NutchDocumentAnalyzer extends NutchAnalyzer {
//加入庖丁解牛分词器属性
private static Analyzer PAODING_ANALYZER;
/** Analyzer used to index textual content. */
private static Analyzer CONTENT_ANALYZER;
// Anchor Analysis
// Like content analysis, but leave gap between anchors to inhibit
// cross-anchor phrase matching.
/**
* The number of unused term positions between anchors in the anchor field.
*/
public static final int INTER_ANCHOR_GAP = 4;
/** Analyzer used to analyze anchors. */
private static Analyzer ANCHOR_ANALYZER;
/**
* @param conf
*/
public NutchDocumentAnalyzer(Configuration conf) {
this.conf = conf;
CONTENT_ANALYZER = new ContentAnalyzer(conf);
ANCHOR_ANALYZER = new AnchorAnalyzer();
PAODING_ANALYZER = new PaodingAnalyzer();
}
/** Analyzer used to index textual content. */
private static class ContentAnalyzer extends Analyzer {
private CommonGrams commonGrams;
public ContentAnalyzer(Configuration conf) {
this.commonGrams = new CommonGrams(conf);
}
/** Constructs a {@link NutchDocumentTokenizer}. */
public TokenStream tokenStream(String field, Reader reader) {
return this.commonGrams.getFilter(new NutchDocumentTokenizer(reader),
field);
}
}
private static class AnchorFilter extends TokenFilter {
private boolean first = true;
public AnchorFilter(TokenStream input) {
super(input);
}
public final Token next() throws IOException {
Token result = input.next();
if (result == null)
return result;
if (first) {
result.setPositionIncrement(INTER_ANCHOR_GAP);
first = false;
}
return result;
}
}
private static class AnchorAnalyzer extends Analyzer {
public final TokenStream tokenStream(String fieldName, Reader reader) {
return new AnchorFilter(CONTENT_ANALYZER.tokenStream(fieldName, reader));
}
}
/** Returns a new token stream for text from the named field. */
public TokenStream tokenStream(String fieldName, Reader reader) {
Analyzer analyzer;
/*
if ("anchor".equals(fieldName))
analyzer = ANCHOR_ANALYZER;
else
analyzer = CONTENT_ANALYZER;
*/
analyzer = PAODING_ANALYZER;
return analyzer.tokenStream(fieldName, reader);
}
}
4 编辑src/plugin下面的build.xml新增入如下内容:
<ant dir="analysis-zh" target="deploy"/><!--maojin 20090503 add-->
<ant dir="lib-paoding-analyzers" target="deploy"/><!--maojin 20090503 add-->
。。。。。。
<ant dir="analysis-zh" target="clean"/><!--maojin 20090503 add-->
<ant dir="lib-paoding-analyzers" target="clean"/><!--maojin 20090503 add-->
5 下载配置ant运行ant,需要进入nutch目录:
D:\nutch>D:\program\ant\bin\ant
6 将paoding-analysis.jar加入到系统的classpath中。测试:
$ bin/nutch index plainindex/paodingindexes plainindex/crawldb plainindex/linkdb plainindex/segments/20090528132511 plainindex/segments/20090528132525 plainindex/segments/20090528132602
Indexer: starting
Indexer: done
bin/nutch index plainindex2/paodingindexes plainindex2/crawldb plainindex2/linkdb plainindex2/segments/20090528132918 plainindex2/segments/20090528132934 plainindex2/segments/20090528133008
合并:
$ bin/nutch merge plainindex/paodingindex plainindex/paodingindexes
merging indexes to: plainindex/paodingindex
Adding file:/d:/nutch/plainindex/paodingindexes/part-00000
done merging
去重:
Administrator@d6369c401d1240d /cygdrive/d/nutch
$ bin/nutch dedup plainindex/paodingindex
Dedup: starting
Dedup: adding indexes in: plainindex/paodingindex
Dedup: done
试着去索引:
用luke查看:
7 修改索引名称,将原来的index和indexes分别改为index_old和indexes_old,将paodingindexes和paodingindex改为indexes和index。
8 修改查询NutchAnalysis.jj将这一行改为:| <SIGRAM: (<CJK>)+ >,用JAVACC重新编译后替换相应文件,若有错误更改(实验时报的错误是ParseException没有throw)。
9 用ant重新编译。
10将nutch-0.x.x.job文件拷贝出来替换nutch目录下的同名文件。
将\build\classes\org\apache\nutch\analysis目录下的所有文件拷贝替换nutch-0.x.x.jar中org\apache\nutch\analysis目录下的文件。
11将nutch-0.x.x.jar文件和你的分词包(我的是analysis-zh.jar)拷贝到tomcat中WEB-INF\lib下面。
12 查询。
3.2 imdict-chinese-analyzer
中科院的ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis
Syst em)是在层叠隐马尔可夫模型(Cascaded Hidden Markov
Model,CHMM)上发展起来的。它的一个特色是几乎把汉语词法分析的所有环节都统一到了一个完整的理论框架中,获得很好的总体效果,而且它在分词精
度与分析速度这两个相互制约的因素上达到了一个较好的平衡,它已成为目前最好的汉语词法的分析器。具体使用版本为高编写的imdict-
chinese-analyzer,它是imdict智能词典的智能中文分词模块,能直接为Lucene和Nutch使用。基于它二次开发相对灵活,因此
本文采用在该组件的基础上对原代码直接进行修改来实现,同时本文加入了停止词处理功能。
进行中文分词二次开发关键步骤为:
第一,将imdict-chinese-analyzer生成jar包,并导入到Nutch的class-pa th中。
第二,修改NutchDocumentAnalyzer的tokenStream方法体为:
Set<String> stopWords = ChineseAnalyzer.loadStopWords(AnalyzerProfile.ANALYSIS_D
ATA_DIR+ "/stopwords_utf8.txt");
Analyzer analyzer = new ChineseAnalyzer(stopWords);
return analyzer.tokenStream(field, reader);
第三,修改NutchAnalysis.jj文件。将|<SIGRAM: <CJK >>改为|< SIGRAM:
(<CJK>)+>,再用JavaCC 编译NutchAnalysis.jj这个文件,将生成的7个文件覆盖analysis包相应内容。
发表评论
-
网页去重
2011-01-11 09:34 2101搜索引擎判断复制网页一般都基于这么一个思想:为每个网页计算出一 ... -
nutch 抓取动态网页设置
2010-12-04 22:48 3812nutch过滤规则crawl-urlfilter.t ... -
nutch 中的MapReduce详细分析
2010-12-02 22:48 1831作者:马士华 发表于: ... -
提高Nutch局域网抓取的速度
2010-11-30 19:36 1319提高Nutch局域网抓取的速度 如果想要提高N ... -
nutch 过滤掉不正确的URL实现方法:
2010-11-29 22:39 1980nutch 1.0 读源码,过滤掉不正确的URL实现方法: ... -
nutch中Nutch-defaul.xml相关配置
2010-11-28 22:27 1875Nutch-default.XML相关 ... -
nutch的核心流程分析
2010-11-26 00:09 2260Crawl类的时序图。 流程如下 ... -
nutch累积式抓取
2010-11-13 22:48 2337最近在网上查了好多关于nutch增量式抓取的脚本,但是我 ... -
提高Nutch局域网抓取的速度
2010-11-13 22:25 1589如果想要提高Nutch局域网抓取的速度,大家第一个想到 ... -
nutch如何才能抓取到动态的url
2010-11-13 08:09 3050nutch如何才能抓取到动 ... -
Nutch-0.9源代码:Crawl类整体分析
2010-11-09 19:43 1353Nutch-0.9源代码:Crawl类整体分析 N ... -
网络爬虫调研报告
2010-11-09 19:26 1834网络爬虫调研报 ... -
配置完成nutch容易出现的错误
2010-11-09 09:14 2408配置完成nutch容易出现的错误 1.1.2 ... -
Nutch1.0的配置与运行
2010-11-09 09:10 966Nutch1.0的配置与运行 ... -
Nutch1.0的配置与运行
2010-11-08 11:17 1034Nutch1.0的配置与运行 ... -
Nutch的资料
2010-11-08 10:59 1449Nutch的资料 http://issues. ... -
nutch的基本工作流程理解
2010-11-08 10:57 1452(一): Nutch 的工作流程: ...
相关推荐
- **分词插件**: Nutch支持使用第三方分词库,如IK Analyzer或HanLP,进行中文分词。 - **URL过滤**: 可以通过编写或配置URL过滤器(如`regex-urlfilter.txt`)来控制哪些URL被爬取。 - **插件结构**: Nutch的灵活性...
5. **分词与索引**:使用Analyzer进行中文或英文等语言的分词,然后将分词结果建立倒排索引。 6. **存储**:Nutch使用HDFS(Hadoop分布式文件系统)存储抓取的数据和索引。 7. **检索**:通过Solr或Elasticsearch等...
本部分将简要介绍Nutch插件的实际应用案例,包括中文分词插件、索引字段增强插件等。通过具体实例,读者可以更好地理解Nutch插件是如何在实际场景中发挥作用的,以及如何根据自身需求开发和集成插件。 #### 五、在...
Apache Nutch 是一个...总结来说,Apache Nutch 1.3 是一个强大的网络爬虫框架,其源码包为开发者提供了深入理解爬虫技术的宝贵资源。无论是用于学术研究还是实际项目开发,Nutch 1.3 都是值得学习和探索的优秀工具。
总结来说,Lucene 2.4与Nutch的结合使用使得在大量文本文档中高效搜索特定关键词成为可能。通过Nutch的爬取和预处理,以及Lucene的索引和查询机制,我们可以快速定位到包含目标关键词的文档,这对于信息检索和数据...
5. **分词和索引**:Nutch 内置了Lucene库,用于对抓取的网页内容进行分词和创建倒排索引,便于后续的搜索操作。 6. **国际化支持**:Nutch 支持多种语言的网页抓取和处理,包括中文,通过插件机制可以添加新的语言...
总结,Apache Nutch 2.2 在 Linux 环境下提供了强大的网络爬虫功能,结合 Hadoop 分布式计算框架,能高效处理海量网页数据。其灵活性和可扩展性使其成为开发自定义搜索引擎或进行大数据分析的重要工具。正确配置和...
中文分词是将连续的汉字序列切分成具有语义的词汇序列的过程。本研究提出了一种改进的RMM(Reverse Maximum Matching)中文分词算法,通过对词典存储格式和切词算法的优化,提高了分词的准确性和效率。 ##### 2.3 ...
介绍了Lucene的基础知识,包括Lucene的历史和发展情况、使用Lucene创建索引和执行搜索的基本方法以及中文分词的应用,最后做了两个应用项目。第2部分:数据解析。介绍解析不同格式数据(如Word、PDF等)的方法,包括...
例如,使用Java的Jieba分词库进行中文分词。 4. 索引构建模块:利用Lucene或Solr创建倒排索引。在Hadoop上,这通常通过多个MapReduce任务完成,每个任务处理一部分数据,最后合并成全局索引。 5. 查询服务模块:...
- **Ikanalyzer**:一种针对中文文本的分词器。 - **Sphinx**:另一个高性能的全文搜索引擎,主要用于数据库的全文检索。 - **Lucene**:Solr 的基础技术栈之一,是 Java 中最流行的信息检索工具包。 ##### 3.2 ...
3. 分词器(Tokenizer):分词器是将输入的文本分割成可索引的词项(Token)的过程,如中文分词器IK Analyzer用于处理中文文本。 4. 索引(Index):Lucene通过建立倒排索引(Inverted Index)实现快速搜索,索引将...
- Lietu中文分词的使用 - 中文分词原理 - 查找词典算法 - 最大概率分词方法 - 新词发现 - 隐马尔可夫模型 **5.2 语法解析树** - **解析树构建:** 构建文档的语法解析树,帮助理解句子结构。 **5.3 文档排重...
1. **中文处理**:百度在中文处理方面具有优势,包括中文分词、拼音转换、繁简体识别等,提高了搜索的准确性和用户体验。 2. **个性化推荐**:百度利用大数据和机器学习技术,根据用户的搜索历史和行为习惯提供个性...
Solr的schema.xml文件用于定义索引字段的类型和属性,而IKAnalyzer是一个Java编写的开源中文分词器,可在solr中配置使用,以增强其中文搜索能力。 通过以上内容,我们可以了解到,搭建Hadoop单机云平台不仅需要对...
- **5.1 中文分词处理**:深入探讨中文分词的各种技术和方法。 - **5.2 语法解析树**:介绍语法解析树的概念及其在自然语言处理中的应用。 - **5.3 文档排重**:避免重复文档被多次索引,提高搜索引擎的质量。 - **...
3. **分词器**:Lucene提供多种语言的分词器,可以处理不同语言的文本,支持中文、英文等。 4. **模糊搜索**:允许用户进行近似匹配和拼写纠错,提高搜索的准确性和用户体验。 5. **评分系统**:Lucene根据相关性...