Lucene学习笔记(八)–完

  • Post author:
  • Post category:其他


八、搜索引擎的中文问题:

大纲:

1. 中文分词的一些常见问题

2. Lucene的StandardAnalyzer对中文的处理

3. CJKAnalyzer对中文的处理

4. 中科院的中文分词工具

1. 中文分词的问题:

1.1 分词:指的就是将一个完整的句子换分为一个个的分词(Term)对象的过程。

这种分词应当满足某种语言规则,以便于为其建立索引。

1.2 中文分词与英文分词的区别:

1.2.1 对于英语来说,分词是一件很容易的事。空格就是它们天然的分隔符。

1.2.2 对于中文来说,无疑是一个很复杂的事情。中文是世界上最复杂的语言之一,

语义的变换和句型结构的不规整使得中文分词一直以来都是一件头疼的事。

如:对”中华人民共和国”这段文本进行分词,可以分成”中华”、”人民”和”共和国”。

也可以分成”中”、”华人”、”民”、”共和国”,很显然第一种分法比较合理,但是怎样实现合理的词语切词呢?

1.3 中文分词的方法:共总结出三种方法。

1.3.1 单字切词法:顾名思意,就是按照中文一个字一个字的进行分词。

以这种方式切分出来的分词再进入索引,称之为字索引。

如StandardAnalyzer分析器。

** 说明:很显然这种方法很不合理,会严重影响创建索引和搜索的效率。

1.3.2 二分法:就是值每两个字进行一次切分。如:”中华人民共和国”使用二分法切词,

结果为:”中华/华人/人民/民共/共和/和国”

如CJKAnalyzer分析器。

** 说明:这种方式完全不考虑词义、语境,机械的对语句进行处理。

相对第一种方法虽然进步很多,可以跟理想的需求相比还是不足。

1.3.3 词库分词法:就是用一个寂静建立好的词的集合(按照某种算法创建的集合)去匹配目标,

当目标文档中遇到集合中已经存在的词时,就将之切分出来。例如词库中已经存在了”天涯若比邻”这个词,

那么目标文本中如果有”天涯若比邻”这段文本,那么分词器就不会对这段话切分,而是把它作为一个分词保存到索引。

** 具体:词库分词法:包括极易分词和庖丁分词。这两个基本一样。

下边我们使用极易分词MMAnalyzer分析器进行举例。

** 说明:一直以来,词库分词被认为是最理想的一种中文分词方式。

** 注意:很显然,词库的创建便成了”词库分词法”的关键。

通常词库的创建要统计大量的内容,然后根据各种词出现的频率、概率再来进行筛选,最终决定什么词应该放入词库。

另外,一个更加高级的词库还加入了语义和词性的标注,

甚至还有不同词的权重,使用这样的词库进行分词的效果应该非常理想。

2. Lucene对中文的处理

2.1 查看不同分析器的分词效果:

2.1.1 使用StandardAnalyzer对中文分词:

例子:

StringReader reader = new StringReader(“中华人民共和国”);

Analyzer analyzer = new StandardAnalyzer();

//得到TokenSream流对象:其实TokenSream抽象类的子类Tokenizer就是封装了一下Reader对象

TokenStream tokenStream = analyzer.tokenStream(reader);

//得到分词和过滤后的一个分词

Token token = tokenSream.next();

while(token != null){


//输出分词信息

System.out.println(token.termText());

//继续获得分词

token = tokenStream.next();

}

** 结果是单字分词效果:













2.1.2 使用SimpleAnalyzer对中文分词:

例子:同上只需修改Analyzer analyzer = new SimpleAnalyzer();

** 结果是没有对中文做任何处理:原样输出”中华人民共和国”

2.1.3 使用WhitespaceAnalyzer对中文分词:它只对空格进行分词,所以如果有空格它就分词,没有空格就不会分词。

例子:我们将文本中加入一个空格”中华人民 共和国”

** 结果是:如果没有空格那么还是原样输出。

中华人民

共和国

2.2 使用CJKAnalyzer对中文处理:在Lucene的非标准包中包含一个CJKAnalyzer。

这是Lucene的作者专门为中文、韩文和日文开发的一个分词工具。

** 注意:这个CJKAnalyzer需要开发者自己下载。

例子:只需将上面代码中改动一处Analyzer analyzer = new CJKAnalyzer();

** 结果:

中华

华人

人民

民共

共和

和国

** 说明:CJKAnalyzer使用了二分法进行分词,它的tokenStream方法如下

public final TokenSream tokenSream(){


//使用了CJKTokenizer分词器和StopFilter过滤器

return new StopFilter(new CJKTokenizer(reader), stopTable);

}

2.3 使用极易分词MMAnalyzer分析器进行对中文处理:

** 注意:该MMAnalyzer也是需要开发者下载后才能使用的(将下载得到的je.jar加入到项目lib即可).

例子:Analyzer analyzer = new MMAnalyzer();

我们将文本改为:”我们中国人”

** 结果:

我们

中国人

** 说明:MMAnalyzer使用的是词库分词法。使用方法同上

3. 中文分词工具 ICTCLAS :中国科学院计算机研究所在多年研究基础上,

耗时一年研制出了

基于多层隐马模型的汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),

该系统的功能包括中文分、词性标注、未登陆词识别等。

** 使用方法:原版的ICTCLAS工具是用C语言编写的。有些程序员为了Java和C#等其他语言中也可以使用,就编写了相应的版本。

这里我们当然是选用的Java版本。

例子:

//创建ICTCLAS分析器对象

ICTCLAS ictclas = ICTCLAS.getInstance();

String text = “乔丹是一位伟大的篮球运动员”;

//进行分词,并且打印:注意这里和Lucene中常用的方法不同

System.out.println(ictclas.paragraphProcess(text));

** 结果:

乔丹







伟大



篮球

运动员

九、Lucene搜索的高亮显示Highlighter :可以截取一段文本,并让与关键字匹配的文字高亮显示。

其实高亮的实现是通过找到文本后,在文本前、后加上css样式实现的。

如:加上<font color=”red”>匹配上的文字</font>

** 注意:高亮的对象是Document文档中Field中保存的文本,所以只有搜索得到Document后才能进行高亮操作。

例子:

1.准备高亮器

//创建高亮器对象:需要一些辅助类对象作为参数

Formatter formatter = new SimpleHTMLFormatter(“<font color=’red’>”, “</font>”);//被高亮文本前后加的标签前后缀

Scorer scorer = new QueryScorer(query);//创建一个Scorer对象,传入一个Lucene的条件对象Query

//正式创建高亮器对象

Highlighter highlighter = new Highlighter(formatter, scorer);

//设置被高亮的文本返回的摘要的文本大小

Fragmenter fragmenter = new SimpleFragmenter(50);//默认是50个字符

//让大小生效

highlighter.setTextFragmenter(fragmenter);

2.使用高亮器

/*

使用高亮器对Document中指定的Field中包含搜索关键字的文本进行高亮

传入分析器对象、传入被高亮的内容存在与哪个Field字段、和该字段的内容

高亮器通过它的机制对该内容进行分析和高亮,然后返回一个摘要(默认是100个字符,这里是50个,因为上边已经自定义)

注意:如果指定的字段中没有找到与搜索关键字匹配的要高亮的文字,那么该方法返回空值

*/

String resume = highlighter.getBestFragment(analyzer, “content”, doc.get(“content”));

if(resume != null){


//如果resume不为空,那么把高亮后的文本在保存到对应的Field中进行返回

doc.getField(“content”).setValue(resume);

}

十、Lucene SandBox :Lucene之所以成功与第三方开发者的支持也是密不可分的。

SandBox就是专门用于存储这些第三方开发者开发的代码的一个代码仓库。

** 说明:SandBox就是建立的一个CVS代码仓库,用来存放支持Lucene的代码。

** SandBox中的主要内容:

SandBox分类    基本介绍

分析器     使用于各种语言的分析器

Ant      完成批处理任务

数据库     伯克里数据库目录的实现

高亮显示    完成高亮显示

JavaScript脚本   适用于web浏览器的查询构造和验证

Lucli     在命令行与索引交互的接口

1. Lucene索引工具箱—-Luke :是Lucene的一个索引浏览器,作者是Andrzej Bialeckj。

Luke是一个使用Java开发的桌面应用程序,它可以非常细致的显示Lucene所建立的索引文件的内部结构,

以帮助开发者更好的监控和管理索引文件。

** 安装方法:

1.1 从官网下载Luke的源代码包

1.2 解压压缩包

1.3 用Eclipse导入工程

1.4 在org.getopt.luke.plugins包中找到Luke.java文件,然后运行就行了

2. Lucene索引监视器—-Limo :全称是”Lucene Index Monitir”,作者是Julien Nioche

使用limo可以在Web形式下浏览Lucene索引文件的状态信息。如:索引是否已经被锁定、索引文件的最后修改日期和索引中文档的数量。

** 安装方法:

2.1 官网下载包war文件

2.2 将war包放到tomcat的webapps中,改名limo

2.3 启动tomcat,浏览器中输入

http://localhost:8080/limo/

3. Lucene命令行接口—-LUCLI :全称Lucene Command-Line Interface,作者是Dror Matalon

是一个可以通过使用命令行操作索引信息的第三方工具。

** 安装方法:

3.1 官网下载LUCLI工具包

3.2 解压,使用Eclipse导入工程

3.3 在lucli中找到Lucli.java文件,然后运行

** 总结:至此Lucene笔记结束,其间如有不当或明显表达错误的地方希望大家多多指教,本人不尽感激。



版权声明:本文为lijie1051原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。