基于Lucene的中文字典分词模块

合集下载

Lucene使用IKAnalyzer分词实例及IKAnalyzer扩展词库

Lucene使用IKAnalyzer分词实例及IKAnalyzer扩展词库

Lucene使⽤IKAnalyzer分词实例及IKAnalyzer扩展词库⽅案⼀: 基于配置的词典扩充项⽬结构图如下:IK分词器还⽀持通过配置IKAnalyzer.cfg.xml⽂件来扩充您的专有词典。

⾕歌拼⾳词库下载:在web项⽬的src⽬录下创建IKAnalyzer.cfg.xml⽂件,内容如下<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "/dtd/properties.dtd"><properties><comment>IK Analyzer 扩展配置</comment><!-- ⽤户可以在这⾥配置⾃⼰的扩展字典 --><entry key="ext_dict">/dicdata/use.dic.dic;/dicdata/googlepy.dic</entry><!-- ⽤户可以在这⾥配置⾃⼰的扩展停⽌词字典 --><entry key="ext_stopwords">/dicdata/ext_stopword.dic</entry></properties>词典⽂件的编辑与部署分词器的词典⽂件格式是⽆BOM 的UTF-8 编码的中⽂⽂本⽂件,⽂件扩展名不限。

词典中,每个中⽂词汇独⽴占⼀⾏,使⽤\r\n 的DOS ⽅式换⾏。

(注,如果您不了解什么是⽆BOM 的UTF-8 格式,请保证您的词典使⽤UTF-8 存储,并在⽂件的头部添加⼀空⾏)。

您可以参考分词器源码org.wltea.analyzer.dic 包下的.dic ⽂件。

词典⽂件应部署在Java 的资源路径下,即ClassLoader 能够加载的路径中。

基于Lucene的中文文本分词

基于Lucene的中文文本分词
转移 网络法 、 知识分 词语 义分 析法 、 邻接 约束法 、 合 匹配 法 、 综 后缀 分词 法 、 征词 库法 、 束矩 阵法 和语 特 约
法分析法 等.
1 1 3 人 工智 能法 . 称理 解分 词法 . 工智 能是 对信 息进 行 智能 化处 理 的 . 种模 式 , .. 又 人 一 主要 有两 种处
关键词: 中文文本分词 ; 文本检索;uee Lc n
中图 分类号 : P 1.1 文献 标识 码 : T 311 A
0 引 言
伴 随着 文本挖掘 技 术 的发展 , 文本 分词 技术 作为 文本 挖掘技 术 的一个 重要 研 究分支 , 也得 到了迅速 的发 展. 本 分词 技 术为 大 多数 文 本 挖掘 技术 ( 文 如文 本分 类 技 术 , 本 聚类 技 术 等 ) 供文 本 预处理 工 文 提 作, 分词 效果 的好坏 会直 接影 响到 后续 的处理 过 程 , 因此文本 分词 技术 是文 本 挖掘过 程 中的一个关 键环 节. 目前 , 文本 挖掘领 域 的一 项重 要 成果 —— Ap c eJk ra的开源 工 程 L c n ( ah a at u e e 一种 基于 J AVA语 言 的文本 检索工 具包 ) 已经 得到 了广 泛 的应用 和发 展. 国际上很 多 的大公 司都 以 L cn u e e作为开 发平 台 , 例 如 目前搜 索弓I 擎业 的 巨头 G o l 司 也在其 系统 中引入 了 L cn 平 台 , 在其 基础 上进行 深入 的开 o ge公 ue e 并
维普资讯
内蒙古 工 业大 学学 报
j oURNAL OF 3期
UNI VERSI TY OF TECHNOLOGY
文 章 编 号 :0 1 5 6 (0 7 0。 1 50 1 0 — 1 72 0 )30 8 —4

Lucene 3.0 的几种分词系统

Lucene 3.0 的几种分词系统
1、 StopAnalyzer
StopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。
2、 StandardAnalyzer
StandardAnalyzer根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。
3、 SimpleAnalyzer
SimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。
在全文检索系统开发中,通常用来支持西文符号的处理,不支持中文。由于不完成单词过滤功能,所以不需要过滤词库支持。词汇分割策略上简单,使用非英文字符作为分割符,不需要分词词库的支持。
13、 Paoding Analysis
Paoding Analysis中文分词具有极 高效率 和 高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G内存个人机器上,1秒可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。
7、 ChineseAnalyzer
ChineseAnalyzer功能与StandardAnalyzer分析器在处理中文是基本一致,都是切分成单个的双字节中文字符。在Lucene3.0版本中已经弃用。
8、 PerFieldAnalyzerWrapper
PerFieldAnalyzerWrapper功能主要用在针对不同的Field采用不同的Analyzer的场合。比如对于文件名,需要使用KeywordAnalyzer,而对于文件内容只使用StandardAnalyzer就可以了。通过addAnalyzer()可以添加分类器。

基于Lucene的中文分词技术研究

基于Lucene的中文分词技术研究

向或逆 向最大匹配 的方法来分 词。例如 ,假设词 典包括 如下
的 词语 :
今天 / 很好” 。

天气


很好
输入 “ 今天天气很好 ” ,最后 的分词结 果为 “ 今天 , 天气
正 向最大匹配 和逆向最大 匹配 的实 现大 同小 异 ,最 大的 区别 就是正 向最 大匹配是 正向扫描字符 串 ,逆 向最大 匹配是
除 了这 两种 ,另外 一种最 少切分 的方法是使 每一句 中切 出的词数最小 。 22 基于统计 的分词方法 .
所周 知 ,英 语等西方 语言是使 用空格 和标 点来分 隔单词 。但 是在 汉语等 亚洲语种 中 ,一 般使用 表意文 字 ,而 不是使 用 由
字母 组成 的单词 。所 以相对 于西方语 言 ,L c n 中文 分词 ue e对
a c a y c ur c ・
Ke r s h n s e me t t n; u e e; xma t h n ma i m rb b l y y wo d :C i e e s g n ai o L c n ma i lma c i g; x mu p a i t o i
1 引 言
的效果并不是很好 。L cn 处理 中文分词常用方法有 3种 : ue e ()单字方式 : 【 【 【 【 [ 【 。 1 咬】 死】 猎】 人】 的】 狗]
() 二元覆 盖方式 : 【 2 咬死】 [ 死猎】 [ 人1 【 的1 猎 人 【 的狗】 。
w r e e t t n meh d a d ma i m r b b l y p rii l t o i h i t ov h r b e o n e u t o o d s g n a i t o n x mu p o a i t a t p e me d wh c s o s le t e p o l m f ma y r s l f m o i c h s

lucene中文分词组件和分析器KTDictSeg

lucene中文分词组件和分析器KTDictSeg
急剧变慢。
V1.3.01
1、 修改字典格式,提高字典加载速度
2、 增加对英文专业名词的支持 如C++,C#等只要加入字典就可以被分出来
3、 增加词频判断功能,在无法取舍时根据词频取舍
4、 增加优先优先词频选项,通过这个选项动态决定分词粒度 需打开 FreqFirst
5、 增加中文人名前后缀统计和根据该统计定位人名的功能
7、 1.4版本新加了 KTDictSegTokenizer默认构造,没有全面考虑到锁的问题。导致多线程查询是会出错,已经更改这出错误。
使用KTDictSeg的lucene分词分析器
1. using System;
2. using System.Collections.Generic;
13、提供一个新闻搜索的简单例子,采用+KTDictSegAnalyzer+KTDictSeg,项目名为Demo.KTDictSegAnalyzer
14、将所有ArrayList 改为List<>
V1.4.01
1、 增加对的支持
2、 增加多元分词
3、 配置文件中增加对相对路径的支持(winform 和 )
36. {
37. m_SimpleDictSeg = null;
38. throw e1;
39. }
40. }
14. {
15. dictPath = _dictPath;
16. }
17ห้องสมุดไป่ตู้
18. public override TokenStream TokenStream(string fieldName, TextReader reader)

基于lucene4.6的SmartChineseAnalyzer中文切词源码

基于lucene4.6的SmartChineseAnalyzer中文切词源码

基于SmartChineseAnalyzer的中文分词Date:2014.1.1在搜索引擎的构建中,分词器是索引器和搜索器中重要的一部分。

分词器的好坏直接影响着搜索效果的优劣。

SmartChineseAnalyzer是lucene自带的中文分词器。

Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。

Lucene4.6是当前的最新版本。

作为最新版本的lucene,其自带的中文分词器效果也相当不错。

其分词测试代码如下:package com.lm.IndexTxt;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.TokenStream;import .smart.SmartChineseAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.util.Version;/***中文切词*@author lm*/public class AnalyzerCN_LM {// 分析器类型基本介绍// WhitespaceAnalyzer 以空格作为切词标准,不对语汇单元进行其他规范化处理// SimpleAnalyzer 以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符// StopAnalyzer 该分析器会去除一些常有a,the,an等等,也可以自定义禁用词// StandardAnalyzer Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号// CJKAnalyzer 能对中,日,韩语言进行分析的分词器,对中文支持效果一般。

一种基于LUCENE的中文分词算法研究

一种基于LUCENE的中文分词算法研究
检 索功 能 。
1 1 L C N 系 统 架 构 . U E E
L cn u e e系统 架构有 着 明显 的 面向对 象特 点 , 将 系统 核 心 功 能部 分 设 计 为抽 象 类 , 体 的实 现 部 分设 它 具 计 为抽 象类 的实 现 , 计一 种 与平 台无关 的索 引格 式类 , 设 与平 台相关 操 作也 设 计 为抽 象 类 , 过层 层 面 向对 通 象设 计 , L c n 成 为一 个 高 内聚 、 使 uee 低耦 合 、 易 进 行 二次 开 发 的检索 引擎 。L cn 系 统 架 构 主要 由基本 容 ue e 封装 结构 、 引核 心 和外部 接 口三部 分组 成 , 中索引核 心是 L cn 架 构 的关键 部 分 。L cn 索 其 uee u e e系统 架 构如
Vo . 4 NO 3 12 .
A ug 2 0 1 1 .
文 章 编 号 : 0 6 0 7 2 1 ) 3— 0 3—0 1 0 —1 3 ( 0 1 0 0 5 6
di1 . 9 9ji n 10 o : 0 3 6 /.s . 0 6—1 3 . 0 1 0 . 1 s 0721.802
器 。该算 法基 于字 符 串匹 配原 理 , 现 了正 向 和逆 向相 结 合 的最 大 增 字 匹配 分 词 算 法 。 实 通过 实验 仿真 , 比较 改进 后 的分 析器 与 L cn u e e自带 的两 种分 析器 在分 词效 果 和效率 上 的 差异 。结 果显示 , 进后 的分 析器 分词 效 果 明显 优 于 L cn 改 u e e自带 的 两种 分 析 器 , 高 了 提 全文 检索 系统 的 中文处 理能 力 , 系统 的查 全率 和查 准率都 达 到用 户 的需 求 。 关键 词 :全文 检 索 ;L cn ;中文分 词 u ee

lucene 中文分词方法

lucene 中文分词方法

lucene 中文分词方法Lucene 中文分词方法Lucene是一款开源的全文检索引擎库,支持中文分词。

中文分词是指将中文文本按照一定规则切分成一个个词语的过程,是中文文本处理的核心环节之一。

在Lucene中,中文分词方法采用了一种被称为“最大正向匹配”(Maximum Matching)的算法来实现。

最大正向匹配算法是一种基于词典的分词算法,其基本思想是从左到右遍历待分词文本,找出最长的匹配词,然后将其切分出来。

具体步骤如下:1. 构建词典:首先需要构建一个中文词典,词典中包含了常用的中文词语。

词典可以手动创建,也可以通过自动分词算法生成。

2. 正向匹配:对于待分词文本,从左到右遍历每个字符,依次匹配词典中的词语。

当匹配到一个词语时,将其切分出来,并将指针移动到下一个位置继续匹配。

3. 最长匹配:在匹配过程中,选择最长的匹配词语进行切分。

这样可以避免将一个词语切分成多个部分,提高分词的准确性。

4. 重复匹配:如果一个词语可以匹配多个词典中的词语,选择其中最长的词语进行切分。

这样可以避免将一个长词切分成多个短词,提高分词的准确性。

5. 后处理:对于一些特殊情况,例如未登录词(未在词典中出现的词语)或者歧义词(一个词语有多个意思),可以通过后处理来进行处理,例如利用统计信息或者上下文信息进行判断。

Lucene中的中文分词方法通过上述算法实现了对中文文本的分词。

在使用Lucene进行中文分词时,可以通过调用相关API来实现,具体步骤如下:1. 创建分词器:首先需要创建一个中文分词器,例如使用Lucene 中提供的SmartChineseAnalyzer分词器。

2. 分词:将待分词的中文文本传入分词器的分词方法,即可获取到分词结果。

分词结果是一个词语列表,包含了文本中的所有词语。

3. 处理分词结果:可以对分词结果进行一些后处理,例如去除停用词(常用但无实际意义的词语)或者对词语进行统计分析。

通过使用Lucene中的中文分词方法,可以有效地对中文文本进行分词处理,提高中文文本处理的效果。

基于Lucene的中文分词全文搜索引擎设计与实现

基于Lucene的中文分词全文搜索引擎设计与实现

C o mp u t e r K n o w l e d g e a n d T e c h n o l o g y电脑知识与技术
Vo 1 . 1 I , No . 1 3 , Ma y 2 0 1 5
基于 L u c e n e 的 中文分 词 全文 搜 索 引擎设 计 与 实现
L I Bi n g - l i a n
( Z h u h a i C i t y P o l y t e c h n i c C o l l e g e, Z h u h a i 5 1 9 0 9 0 , C h i n a )
Ab s t r a c t : T h i s p a p e r d e s i g n a n d i mp l e me n t a n e f f i c i e n t C h i n e s e s e g me n t a t i o n s e a r c h e n g i n e b a s e d o n L u c e n e a n d P a o d i n g An a l y z — e r , wh i c h ma i n l y f o r d e a l i n g wi t h C h i n e s e w o r d s t o i mp r o v e t h e a b i l i t y o f f u l l t e x t s e a r c h s y s t e m.
关键词: 全文搜索 ; 中文分词 ; 搜 索引擎 ; L u c e n e
中图 分 类 号 : T P 3 1 1 文献标识码 : A 文 章编 号 : 1 0 0 9 - 3 0 4 4 ( 2 0 1 5 ) 1 3 - 0 2 3 6 - 0 2

基于Lucene的中文分析器分词性能比较研究_义天鹏

基于Lucene的中文分析器分词性能比较研究_义天鹏

1 概述
对于中文信息的搜索引擎,中文分词是事先可用系统 的前提,没有中文分词,中文文本就无法建立高效快速的 索引结构。开源 Lucene 框架在改进传统全文搜索引擎倒 排索引的基础上,实现分块索引机制来提高小文件索引速 度,提供的索引优化机制便于动态更新索引文件[1],但它 给出的中文分析器性能不佳,因此,出现了不少第三方分 析器为其提供中文分词。现有的中文分词算法主要有基于 词典的字符串匹配、基于语义理解以及基于词频概率统 计,而歧义识别以及新词发现是分词中的难题。本文在实 验的基础上介绍各分析器,用大量实验结果数据进行比较 分析,用以表征分析器的分词性能,为 Lucene 中文分析 器的选择提供参考。
采 用 层 叠 隐 马 尔 科 夫 模 型 的 ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)汉 语词法分析系统,主要功能包括中文分词、词性标注、命 名实体识别、新词识别,同时支持用户词典。当用 C++开 发搜索引擎时,可以直接调用 ICTCLAS 分词;当用 Java 开发时,则需要在静态初始化段中加载它,使用 JNI 本地 接口调用 ICTCLAS.DLL,实现 Java 环境下的分词。
得到的结果中标点符号已经被删除。 2.1.2 CJKAnalyzer 中文分析器
CJKAnalyzer 中文分析器根据汉语中 2 个字组成一个
词居多的特点,实现对中文的二元切分,即将句子中每相 邻的 2 个字作为一个词,同时使用 StopFilter 过滤器以及
自己添加停用词表完成过滤功能。二元切分结果存在很大
更新,自动编译更新过的词库到二进制版本并加载。 2.2.4 mmseg4j 分析器

CLucene 中文分词

CLucene 中文分词
{
//是字母或数字或空格
rd.UnGet();
// wprintf(_T("[%s]"),str);
return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::CHINESE] );
}
}
else
{
//非汉字
// ch是汉字
if(((char_t)ch>>8)&&(char_t)ch>=0xa0)
{
// wprintf(_T("[%s]"),str);
rd.UnGet();
return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::CHINESE] );
if( isSpace((char_t)ch)!=0 )
{
continue;
}
// Read for Alpha-Nums and Chinese
if( isAlNum((char_t)ch)!=0 )
{
start = rd.Column();
return ReadChinese(ch);
{
//是数学或英语就读到下一个空格.或下一个汉字
//是汉字.就读下一个汉字组成词组,或读到空格或英文结束
if(isChinese)
{
//汉字,并且ch是汉字
if(((char_t)ch>>8)&&(char_t)ch>=0xa0)

基于Lucene的中文分词器的设计与实现

基于Lucene的中文分词器的设计与实现

基于Lucene的中文分词器的设计与实现彭焕峰【摘要】According to the low efficiency of the Chinese words segmentation machines of Lucene, this paper designs a new word segmentation machine based on all-Hash segmentation mechanism according to binary-seek-by-word by analyzing many old dictionary mechanisms. The new mechanism uses the word's Hash value to reduce the number of string findings. The maintenance of dictionary file is convenient, and the developers can customize the dictionary based on different application to improve search efficiency.%针对Lucene自带中文分词器分词效果差的缺点,在分析现有分词词典机制的基础上,设计了基于全哈希整词二分算法的分词器,并集成到Lucene中,算法通过对整词进行哈希,减少词条匹配次数,提高分词效率。

该分词器词典文件维护方便,可以根据不同应用的要求进行定制,从而提高了检索效率。

【期刊名称】《微型机与应用》【年(卷),期】2011(030)018【总页数】3页(P62-64)【关键词】Lucene;哈希;整词二分;最大匹配【作者】彭焕峰【作者单位】南京工程学院计算机工程学院,江苏南京211167【正文语种】中文【中图分类】TP391.1信息技术的发展,形成了海量的电子信息数据,人们对信息检索的要求越来越高,搜索引擎技术也得到了快速发展,并逐渐地被应用到越来越多的领域。

给Lucene添加中文分词3(猎兔的另一篇文章)

给Lucene添加中文分词3(猎兔的另一篇文章)

给Lucene添加中文分词3(猎兔的另一篇文章)给Lucene添加中文分词3(猎兔的另一篇文章)原文转贴如下:/en/The tokenizer compose of two part. The code in a jar file and a dictinary information(chinese language model) ,which is compressed in a zip file, you can uncompress it to a path.Make a CnAnalyzer class to test it:import java.io.Reader;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.LowerCaseFilter;import org.apache.lucene.analysis.TokenStream;import Tokenizer;import seg.result.PlaceFilter;/*** The Analyzer to demo CnT okenizer.**/public class CnAnalyzer extends Analyzer {//~ Constructors -----------------------------------------------------------public CnAnalyzer() {}//~ Methods ----------------------------------------------------------------/*** get token stream from input** @param fieldName lucene field name* @param reader input reader** @return TokenStream*/public final TokenStream tokenStream(String fieldName, Reader reader) {TokenStream result = new CnT okenizer(reader);result = new LowerCaseFilter(result);//还加入了地名过滤result = new PlaceFilter(result);return result;}}Use a test class to test CnAnalyzer:public static void testCnAnalyzer() throws Exception {long startTime;long endTime;StringReader input;CnT okenizer.makeT ag= false;String sentence="其中包括兴安至全州、桂林至兴安、全州至黄沙河、阳朔至平乐、桂林至阳朔、桂林市国道过境线灵川至三塘段、平乐至钟山、桂林至三江高速公路。

Lucene4.7+IK Analyzer中文分词入门教程

Lucene4.7+IK Analyzer中文分词入门教程

Lucene4.7+IK Analyzer中文分词入门教程作者:大明日期:2014-4-1环境:1.lucene版本:4.7下载地址:/apache/lucene/java/4.7.0/下载页面中的lucene-4.7.0.tgz2.IK Analyzer版本:IK Analyer 2012-FF Hotfix 1下载地址:/p/ik-analyzer/downloads/list选择最上面的源码包。

目前只有这个源码包才能支持lucene的4.7版本。

3.参考文章:/dennisit/archive/2013/04/07/3005847.html 此篇文章作者用的是lucene3.5版本,我做了一定幅度的修改,使其在4.7中可用。

下面进入正式部署阶段:1.在eclipse中新建一个java项目:lucenetest2.解压lucene-4.7.0.tgz3.进入到解压后的lucene-4.7.0目录,搜索*.jar4.搜索出来的结果是lucene4.7提供的所有的jar包,根据需要拷贝不同的jar包到自己的工程。

本例子需要如下几个jar包:5.将以上几个jar包拷贝到lucenetest下的lib文件夹下,如果没有lib,则新建。

6.在eclipse中,打开lib,选中这几个jar包,点右键——build parh——add tobuild path7.解压下载的IK Analyzer 2012FF_hf1_source.rar8.进入到IK Analyzer 2012FF_hf1_source\src将如下所有的文件拷贝到lucenetest\src下9.刷新eclipse工程。

如果源码报错,可能是编码格式的问题。

解决办法:在lucenetest上点右键,选择最后一项Properties。

如下图所示选择utf-8,点确定10.至此,环境已经搭建完毕。

如果嫌ik的源码烦,可以自行打成jar包。

目前eclipse项目的结构图如下:11.加入测试的例子。

Lucene中文分词

Lucene中文分词

Lucene中文分词Lucene 中文分词什么是中文分词众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。

例如,英文句子I am a student,用中文则为:“我是一个学生”。

计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。

把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。

我是一个学生,分词的结果是:我是一个学生。

回页首中文分词技术现有的分词技术可分为三类:基于字符串匹配的分词基于理解的分词基于统计的分词这篇文章中使用的是基于字符串匹配的分词技术,这种技术也被称为机械分词。

它是按照一定的策略将待分析的汉字串与一个“充分大的”词库中的词条进行匹配。

若在词库中找到某个字符串则匹配成功(识别出一个词)。

按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词法和分词与标注结合法。

常用的几种机械分词方法如下:正向最大匹配法(由左到右的方向)逆向最大匹配法(由右到左的方向)回页首分词器实现这个实现了机械分词中正向最大匹配法的Lucene分词器包括两个类,CJKAnalyzer和CJKT okenizer,他们的源代码如下:package org.solol.analysis;import java.io.Reader;import java.util.Set;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.StopFilter;import org.apache.lucene.analysis.TokenStream;/*** @author solo L**/public class CJKAnalyzer extends Analyzer {//实现了Analyzer 接口,这是lucene的要求public final static String[] STOP_WORDS = {};private Set stopTable;public CJKAnalyzer() {stopTable = StopFilter.makeStopSet(STOP_WORDS);}@Overridepublic TokenStream tokenStream(String fieldName, Readerreader) {return new StopFilter(new CJKT okenizer(reader), stopTable);}}package org.solol.analysis;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.util.TreeMap;import org.apache.lucene.analysis.Token;import org.apache.lucene.analysis.Tokenizer;/*** @author solo L**/public class CJKT okenizer extends Tokenizer {//这个TreeMap用来缓存词库private static TreeMap simWords = null;private static final int IO_BUFFER_SIZE = 256;private int bufferIndex = 0;private int dataLen = 0;private final char[] ioBuffer = new char[IO_BUFFER_SIZE]; private String tokenType = "word";public CJKT okenizer(Reader input) {this.input = input;}//这里是lucene分词器实现的最关键的地方public Token next() throws IOException {loadWords();StringBuffer currentWord = new StringBuffer();while (true) {char c;Character.UnicodeBlock ub;if (bufferIndex >= dataLen) {dataLen = input.read(ioBuffer);bufferIndex = 0;}if (dataLen == -1) {if (currentWord.length() == 0) {return null;} else {break;}} else {c = ioBuffer[bufferIndex++];ub = Character.UnicodeBlock.of(c);}//通过这个条件不难看出这里只处理了CJK_UNIFIED_IDEOGRAPHS,//因此会丢掉其它的字符,如它会丢掉LATIN字符和数字//这也是该lucene分词器的一个限制,您可以在此基础之上完善它,//也很欢迎把您完善的结果反馈给我if (Character.isLetter(c) && ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) { tokenType = "double";if (currentWord.length() == 0) {currentWord.append(c);} else {//这里实现了正向最大匹配法String temp = (currentWord.toString() + c).intern();if (simWords.containsKey(temp)) {currentWord.append(c);} else {bufferIndex--;break;}}}}Token token = new T oken(currentWord.toString(), bufferIndex - currentWord.length(), bufferIndex, tokenType);currentWord.setLength(0);return token;//装载词库,您必须明白它的逻辑和之所以这样做的目的,这样您才能理解正向最大匹配法是如何实现的public void loadWords() {if (simWords != null)return;simWords = new TreeMap();try {InputStream words = new FileInputStream("simchinese.txt");BufferedReader in = new BufferedReader(new InputStreamReader(words,"UTF-8"));String word = null;while ((word = in.readLine()) != null) {//#使得我们可以在词库中进行必要的注释if ((word.indexOf("#") == -1) && (word.length() < 5)) {simWords.put(word.intern(), "1");if (word.length() == 3) {if (!simWords.containsKey(word.substring(0, 2).intern())) {simWords.put(word.substring(0, 2).intern(), "2");}}if (word.length() == 4) {if (!simWords.containsKey(word.substring(0, 2).intern())) {simWords.put(word.substring(0, 2).intern(), "2");}if (!simWords.containsKey(word.substring(0, 3).intern())) {simWords.put(word.substring(0, 3).intern(), "2");}}}}in.close();} catch (IOException e) {e.printStackTrace();}}}回页首分词效果这是我在当日的某新闻搞中随意选的一段话:此外,巴黎市政府所在地和巴黎两座体育场会挂出写有相同话语的巨幅标语,这两座体育场还安装了巨大屏幕,以方便巴黎市民和游客观看决赛。

Lucene开发实例:Lucene中文分词(转载)

Lucene开发实例:Lucene中文分词(转载)

Lucene开发实例:Lucene中⽂分词(转载)2、从Oracle数据库中取数据创建索引(使⽤IK分词)1package lucene.util;23import org.apache.lucene.index.IndexWriter;4import org.apache.lucene.index.IndexWriterConfig;5import org.apache.lucene.index.CorruptIndexException;6import org.apache.lucene.store.FSDirectory;7import org.apache.lucene.store.Directory;8import org.apache.lucene.analysis.Analyzer;9import org.apache.lucene.analysis.standard.StandardAnalyzer;10import org.apache.lucene.util.Version;11import org.apache.lucene.document.Document;12import org.apache.lucene.document.Field;13import org.wltea.analyzer.lucene.IKAnalyzer;1415import java.sql.Connection;16import java.io.File;17import java.io.IOException;18import java.util.ArrayList;19import java.util.Date;2021import modules.gk.Gk_info;22import modules.gk.Gk_infoSub;23import web.sys.Globals;24import web.db.DBConnector;25import web.db.ObjectCtl;26import web.util.StringUtil;27//28public class LuceneIndex {29 IndexWriter writer = null;30 FSDirectory dir = null;31boolean create = true;3233public void init() {34long a1 = System.currentTimeMillis();35 System.out.println("[Lucene 开始执⾏:" + new Date() + "]");36 Connection con = DBConnector.getconecttion(); //取得⼀个数据库连接37try {38final File docDir = new File(Globals.SYS_COM_CONFIG.get("sys.index.path").toString());//E:\lucene39if (!docDir.exists()) {40 docDir.mkdirs();41 }42 String cr = Globals.SYS_COM_CONFIG.get("sys.index.create").toString();//true or false43if ("false".equals(cr.toLowerCase())) {44 create = false;45 }46 Directory dir = FSDirectory.open(docDir);47// Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);48 Analyzer analyzer = new IKAnalyzer(true);49 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);50if (create) {51// Create a new index in the directory, removing any52// previously indexed documents:53 iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);54 } else {55// Add new documents to an existing index:56 iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);57 }58 IndexWriter writer = new IndexWriter(dir, iwc);59 String sql = "SELECT indexno,title,describes,pdate,keywords FROM TABLEA WHERE STATE=1 AND SSTAG<>1 ";60int rowCount = ObjectCtl.getRowCount(con, sql);61int pageSize = StringUtil.StringToInt(Globals.SYS_COM_CONFIG.get("sys.index.size").toString()); //每页记录数62int pages = (rowCount - 1) / pageSize + 1; //计算总页数63 ArrayList list = null;64 Gk_infoSub gk = null;65for (int i = 1; i < pages+1; i++) {66long a = System.currentTimeMillis();67 list = ObjectCtl.listPage(con, sql, i, pageSize, new Gk_infoSub());68for (int j = 0; j < list.size(); j++) {69 gk = (Gk_infoSub) list.get(j);70 Document doc = new Document();71 doc.add(new Field("indexno", StringUtil.null2String(gk.getIndexno()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//主键不分词72 doc.add(new Field("title", StringUtil.null2String(gk.getTitle()), Field.Store.YES, Field.Index.ANALYZED));73 doc.add(new Field("describes", StringUtil.null2String(gk.getDescribes()), Field.Store.YES, Field.Index.ANALYZED));74 doc.add(new Field("pdate", StringUtil.null2String(gk.getPdate()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//⽇期不分词75 doc.add(new Field("keywords", StringUtil.null2String(gk.getKeywords()), Field.Store.YES, Field.Index.ANALYZED));76 writer.addDocument(doc);77 ObjectCtl.executeUpdateBySql(con,"UPDATE TABLEA SET SSTAG=1 WHERE indexno='"+gk.getIndexno()+"'");//更新已索引状态78 }80long b = System.currentTimeMillis();81long c = b - a;82 System.out.println("[Lucene " + rowCount + "条," + pages + "页,第" + i + "页花费时间:" + c + "毫秒]");83 }84 mit();8586 } catch (Exception e) {87 e.printStackTrace();88 } finally {89 DBConnector.freecon(con); //释放数据库连接90try {91if (writer != null) {92 writer.close();93 }94 } catch (CorruptIndexException e) {95 e.printStackTrace();96 } catch (IOException e) {97 e.printStackTrace();98 } finally {99try {100if (dir != null && IndexWriter.isLocked(dir)) {101 IndexWriter.unlock(dir);//注意解锁102 }103 } catch (IOException e) {104 e.printStackTrace();105 }106 }107 }108long b1 = System.currentTimeMillis();109long c1 = b1 - a1;110 System.out.println("[Lucene 执⾏完毕,花费时间:" + c1 + "毫秒,完成时间:" + new Date() + "]");111 }112 }3、单字段查询以及多字段分页查询⾼亮显⽰1package lucene.util;23import org.apache.lucene.store.FSDirectory;4import org.apache.lucene.store.Directory;5import org.apache.lucene.search.*;6import org.apache.lucene.search.highlight.SimpleHTMLFormatter;7import org.apache.lucene.search.highlight.Highlighter;8import org.apache.lucene.search.highlight.SimpleFragmenter;9import org.apache.lucene.search.highlight.QueryScorer;10import org.apache.lucene.queryParser.QueryParser;11import org.apache.lucene.queryParser.MultiFieldQueryParser;12import org.apache.lucene.analysis.TokenStream;13import org.apache.lucene.analysis.Analyzer;14import org.apache.lucene.analysis.KeywordAnalyzer;15import org.apache.lucene.document.Document;16import org.apache.lucene.index.IndexReader;17import org.apache.lucene.index.Term;18import org.apache.lucene.util.Version;19import modules.gk.Gk_infoSub;2021import java.util.ArrayList;22import java.io.File;23import java.io.StringReader;24import ng.reflect.Constructor;2526import web.util.StringUtil;27import web.sys.Globals;28import org.wltea.analyzer.lucene.IKAnalyzer;29//30public class LuceneQuery {31private static String indexPath;// 索引⽣成的⽬录32private int rowCount;// 记录数33private int pages;// 总页数34private int currentPage;// 当前页数35private int pageSize; //每页记录数3637public LuceneQuery() {38this.indexPath = Globals.SYS_COM_CONFIG.get("sys.index.path").toString();39 }4041public int getRowCount() {42return rowCount;43 }4445public int getPages() {46return pages;47 }49public int getPageSize() {50return pageSize;51 }5253public int getCurrentPage() {54return currentPage;55 }5657/**58 * 函数功能:根据字段查询索引59*/60public ArrayList queryIndexTitle(String keyWord, int curpage, int pageSize) {61 ArrayList list = new ArrayList();62try {63if (curpage <= 0) {64 curpage = 1;65 }66if (pageSize <= 0) {67 pageSize = 20;68 }69this.pageSize = pageSize; //每页记录数70this.currentPage = curpage; //当前页71int start = (curpage - 1) * pageSize;72 Directory dir = FSDirectory.open(new File(indexPath));73 IndexReader reader = IndexReader.open(dir);74 IndexSearcher searcher = new IndexSearcher(reader);75 Analyzer analyzer = new IKAnalyzer(true);76 QueryParser queryParser = new QueryParser(Version.LUCENE_36, "title", analyzer);77 queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);78 Query query = queryParser.parse(keyWord);79int hm = start + pageSize;80 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);81 searcher.search(query, res);8283 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");84 Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));85this.rowCount = res.getTotalHits();86this.pages = (rowCount - 1) / pageSize + 1; //计算总页数87 TopDocs tds = res.topDocs(start, pageSize);88 ScoreDoc[] sd = tds.scoreDocs;89for (int i = 0; i < sd.length; i++) {90 Document hitDoc = reader.document(sd[i].doc);91 list.add(createObj(hitDoc, analyzer, highlighter));92 }9394 } catch (Exception e) {95 e.printStackTrace();96 }9798return list;99100 }101/**102 * 函数功能:根据字段查询索引103*/104public ArrayList queryIndexFields(String allkeyword, String onekeyword, String nokeyword, int curpage, int pageSize) {105 ArrayList list = new ArrayList();106try {107if (curpage <= 0) {108 curpage = 1;109 }110if (pageSize <= 0) {111 pageSize = 20;112 }113this.pageSize = pageSize; //每页记录数114this.currentPage = curpage; //当前页115int start = (curpage - 1) * pageSize;116 Directory dir = FSDirectory.open(new File(indexPath));117 IndexReader reader = IndexReader.open(dir);118 IndexSearcher searcher = new IndexSearcher(reader);119 BooleanQuery bQuery = new BooleanQuery(); //组合查询120if (!"".equals(allkeyword)) {//包含全部关键词121 KeywordAnalyzer analyzer = new KeywordAnalyzer();122 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//AND 123 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, allkeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 124 bQuery.add(query, BooleanClause.Occur.MUST); //AND125 }126if (!"".equals(onekeyword)) { //包含任意关键词127 Analyzer analyzer = new IKAnalyzer(true);128 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//OR 129 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, onekeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 130 bQuery.add(query, BooleanClause.Occur.MUST); //AND131 }132if (!"".equals(nokeyword)) { //排除关键词133 Analyzer analyzer = new IKAnalyzer(true);134 BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};//NOT 135 Query query = MultiFieldQueryParser.parse(Version.LUCENE_36, nokeyword, new String[]{"title", "describes", "keywords"}, flags, analyzer); 136 bQuery.add(query, BooleanClause.Occur.MUST_NOT); //AND137138 }139int hm = start + pageSize;140 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);141 searcher.search(bQuery, res);142 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");143 Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(bQuery));144this.rowCount = res.getTotalHits();145this.pages = (rowCount - 1) / pageSize + 1; //计算总页数146 System.out.println("rowCount:" + rowCount);147 TopDocs tds = res.topDocs(start, pageSize);148 ScoreDoc[] sd = tds.scoreDocs;149 Analyzer analyzer = new IKAnalyzer();150for (int i = 0; i < sd.length; i++) {151 Document hitDoc = reader.document(sd[i].doc);152 list.add(createObj(hitDoc, analyzer, highlighter));153 }154155 } catch (Exception e) {156 e.printStackTrace();157 }158159return list;160161 }162163/**164 * 创建返回对象(⾼亮)165*/166167private synchronized static Object createObj(Document doc, Analyzer analyzer, Highlighter highlighter) {168169 Gk_infoSub gk = new Gk_infoSub();170try {171172if (doc != null) {173 gk.setIndexno(StringUtil.null2String(doc.get("indexno")));174 gk.setPdate(StringUtil.null2String(doc.get("pdate")));175 String title = StringUtil.null2String(doc.get("title"));176 gk.setTitle(title);177if (!"".equals(title)) {178 highlighter.setTextFragmenter(new SimpleFragmenter(title.length()));179 TokenStream tk = analyzer.tokenStream("title", new StringReader(title));180 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, title));181if (!"".equals(htext)) {182 gk.setTitle(htext);183 }184 }185 String keywords = StringUtil.null2String(doc.get("keywords"));186 gk.setKeywords(keywords);187if (!"".equals(keywords)) {188 highlighter.setTextFragmenter(new SimpleFragmenter(keywords.length()));189 TokenStream tk = analyzer.tokenStream("keywords", new StringReader(keywords));190 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, keywords));191if (!"".equals(htext)) {192 gk.setKeywords(htext);193 }194 }195 String describes = StringUtil.null2String(doc.get("describes"));196 gk.setDescribes(describes);197if (!"".equals(describes)) {198 highlighter.setTextFragmenter(new SimpleFragmenter(describes.length()));199 TokenStream tk = analyzer.tokenStream("keywords", new StringReader(describes));200 String htext = StringUtil.null2String(highlighter.getBestFragment(tk, describes));201if (!"".equals(htext)) {202 gk.setDescribes(htext);203 }204 }205206 }207return gk;208 }209catch (Exception e) {210211 e.printStackTrace();212return null;213 }214finally {215 gk = null;216 }217218 }219220private synchronized static Object createObj(Document doc) {221222 Gk_infoSub gk = new Gk_infoSub();223try {224225if (doc != null) {226 gk.setIndexno(StringUtil.null2String(doc.get("indexno")));227 gk.setPdate(StringUtil.null2String(doc.get("pdate")));228 gk.setTitle(StringUtil.null2String(doc.get("title")));229 gk.setKeywords(StringUtil.null2String(doc.get("keywords")));230 gk.setDescribes(StringUtil.null2String(doc.get("describes")));231 }232return gk;233 }234catch (Exception e) {235236 e.printStackTrace();237return null;238 }239finally {240 gk = null;241 }242243 }244 }单字段查询:1long a = System.currentTimeMillis();2try {3int curpage = StringUtil.StringToInt(StringUtil.null2String(form.get("curpage")));4int pagesize = StringUtil.StringToInt(StringUtil.null2String(form.get("pagesize")));5 String title = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("title")));6 LuceneQuery lu = new LuceneQuery();7 form.addResult("list", lu.queryIndexTitle(title, curpage, pagesize));8 form.addResult("curPage", lu.getCurrentPage());9 form.addResult("pageSize", lu.getPageSize());10 form.addResult("rowCount", lu.getRowCount());11 form.addResult("pageCount", lu.getPages());12 } catch (Exception e) {13 e.printStackTrace();14 }15long b = System.currentTimeMillis();16long c = b - a;17 System.out.println("[搜索信息花费时间:" + c + "毫秒]");多字段查询:1long a = System.currentTimeMillis();2try {3int curpage = StringUtil.StringToInt(StringUtil.null2String(form.get("curpage")));4int pagesize = StringUtil.StringToInt(StringUtil.null2String(form.get("pagesize")));5 String allkeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("allkeyword")));6 String onekeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("onekeyword")));7 String nokeyword = StringUtil.replaceLuceneStr(StringUtil.null2String(form.get("nokeyword")));8 LuceneQuery lu = new LuceneQuery();9 form.addResult("list", lu.queryIndexFields(allkeyword,onekeyword,nokeyword, curpage, pagesize));10 form.addResult("curPage", lu.getCurrentPage());11 form.addResult("pageSize", lu.getPageSize());12 form.addResult("rowCount", lu.getRowCount());13 form.addResult("pageCount", lu.getPages());14 } catch (Exception e) {15 e.printStackTrace();16 }17long b = System.currentTimeMillis();18long c = b - a;19 System.out.println("[⾼级检索花费时间:" + c + "毫秒]");4、Lucene通配符查询1 BooleanQuery bQuery = new BooleanQuery(); //组合查询2if (!"".equals(title)) {3 WildcardQuery w1 = new WildcardQuery(new Term("title", title+ "*"));4 bQuery.add(w1, BooleanClause.Occur.MUST); //AND5 }6int hm = start + pageSize;7 TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);8 searcher.search(bQuery, res);5、Lucene嵌套查询实现SQL:(unitid like 'unitid%' and idml like 'id2%') or (tounitid like 'unitid%' and tomlid like 'id2%' and tostate=1)1 BooleanQuery bQuery = new BooleanQuery();2 BooleanQuery b1 = new BooleanQuery();3 WildcardQuery w1 = new WildcardQuery(new Term("unitid", unitid + "*"));4 WildcardQuery w2 = new WildcardQuery(new Term("idml", id2 + "*"));5 b1.add(w1, BooleanClause.Occur.MUST);//AND6 b1.add(w2, BooleanClause.Occur.MUST);//AND7 bQuery.add(b1, BooleanClause.Occur.SHOULD);//OR8 BooleanQuery b2 = new BooleanQuery();9 WildcardQuery w3 = new WildcardQuery(new Term("tounitid", unitid + "*"));10 WildcardQuery w4 = new WildcardQuery(new Term("tomlid", id2 + "*"));11 WildcardQuery w5 = new WildcardQuery(new Term("tostate", "1"));12 b2.add(w3, BooleanClause.Occur.MUST);//AND13 b2.add(w4, BooleanClause.Occur.MUST);//AND14 b2.add(w5, BooleanClause.Occur.MUST);//AND15 bQuery.add(b2, BooleanClause.Occur.SHOULD);//OR6、Lucene先根据时间排序后分页1int hm = start + pageSize;2 Sort sort = new Sort(new SortField("pdate", SortField.STRING, true));3 TopScoreDocCollector res = TopScoreDocCollector.create(pageSize, false);4 searcher.search(bQuery, res);5this.rowCount = res.getTotalHits();6this.pages = (rowCount - 1) / pageSize + 1; //计算总页数7 TopDocs tds =searcher.search(bQuery,rowCount,sort);// res.topDocs(start, pageSize);8 ScoreDoc[] sd = tds.scoreDocs;9 System.out.println("rowCount:" + rowCount);10int i=0;11for (ScoreDoc scoreDoc : sd) {12 i++;13if(i<start){14continue;15 }16if(i>hm){17break;18 }19 Document doc = searcher.doc(scoreDoc.doc);20 list.add(createObj(doc));21 }这个效率不⾼,正常的做法是创建索引的时候进⾏排序,之后使⽤分页⽅法,不要这样进⾏2次查询。

一种基于Lucene的中文分词的设计与测试

一种基于Lucene的中文分词的设计与测试

一种基于Lucene的中文分词的设计与测试
王志嘉;薛质
【期刊名称】《信息技术》
【年(卷),期】2010(000)012
【摘要】设计实现了一个基于Lucene的中文分词模块,提出了一种更为有效的中文词处理方法,提高全文检索系统的中文处理能力.整个模块基于当前使用较为广泛的全文检索引擎工具包Lucene,结合正向最大匹配算法以及经过优化的中文分词词典,以实现更高效率和准确度的中文分词功能.在系统评测方面,通过实验仿真比较了该模块与StandardAnalyzer和CJKAnalyzer在功能和效率上的差异.对于如何构建一个高效的中文检索系统,提出了一种实现方案.
【总页数】5页(P50-54)
【作者】王志嘉;薛质
【作者单位】上海交通大学信息安全工程学院,上海200030;上海交通大学信息安全工程学院,上海200030
【正文语种】中文
【中图分类】TP391
【相关文献】
1.基于Lucene系统的中文分词算法设计与实现 [J], 梅震国
2.基于Lucene的中文分词全文搜索引擎设计与实现 [J], 李炳练
3.基于Lucene的自定义中文分词器的设计与实现 [J], 王桐;王韵婷
4.一种基于LUCENE的中文分词算法研究 [J], 戴洪;蒋静;樊程;于雪丽
5.基于Lucene的中文分词器的设计与实现 [J], 彭焕峰
因版权原因,仅展示原文概要,查看原文内容请购买。

基于lucene4.6的SmartChineseAnalyzer中文切词源码

基于lucene4.6的SmartChineseAnalyzer中文切词源码

基于SmartChineseAnalyzer的中文分词Date:2014.1.1在搜索引擎的构建中,分词器是索引器和搜索器中重要的一部分。

分词器的好坏直接影响着搜索效果的优劣。

SmartChineseAnalyzer是lucene自带的中文分词器。

Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。

Lucene4.6是当前的最新版本。

作为最新版本的lucene,其自带的中文分词器效果也相当不错。

其分词测试代码如下:package com.lm.IndexTxt;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.TokenStream;import .smart.SmartChineseAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.util.Version;/***中文切词*@author lm*/public class AnalyzerCN_LM {// 分析器类型基本介绍// WhitespaceAnalyzer 以空格作为切词标准,不对语汇单元进行其他规范化处理// SimpleAnalyzer 以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符// StopAnalyzer 该分析器会去除一些常有a,the,an等等,也可以自定义禁用词// StandardAnalyzer Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号// CJKAnalyzer 能对中,日,韩语言进行分析的分词器,对中文支持效果一般。

基于Lucene的自定义中文分词器的设计与实现

基于Lucene的自定义中文分词器的设计与实现

基于Lucene的自定义中文分词器的设计与实现王桐;王韵婷【期刊名称】《电脑知识与技术》【年(卷),期】2014(000)002【摘要】该文设计了一个基于复杂形式最大匹配算法(MMSeg_Complex)的自定义中文分词器,该分词器采用四种歧义消除规则,并实现了用户自定义词库、自定义同义词和停用词的功能,可方便地集成到Lucene中,从而有效地提高了Lucene的中文处理能力。

通过实验测试表明,该分词器的分词性能跟Lucene自带的中文分词器相比有了极大的提高,并最终构建出了一个高效的中文全文检索系统。

%This paper designed a custom Chinese word analyzer that based on a complex form of maximum matching algorithm (MMSEG_Complex). This analyzer use four kinds of disambiguation rules, and has achieved user-defined thesaurus、custom func-tion of synonyms and stop words , which can be easily integrated into Lucene, thus effectively improving the Chinese processing capabilities of Lucene. Through experiments we found that this analyzer's performance of Chinese word segmentation has been greatly improved compared to the Chinese word analyzer which built-in Lucene, and then we can eventually build an effective Chinese full-text retrieval system.【总页数】4页(P430-433)【作者】王桐;王韵婷【作者单位】哈尔滨工程大学信息与通信工程学院,黑龙江哈尔滨 150001;哈尔滨工程大学信息与通信工程学院,黑龙江哈尔滨 150001【正文语种】中文【中图分类】TP393【相关文献】1.基于Lucene和MMSEG算法的中文分词器研究 [J], 邓晓枫;蒋廷耀2.基于Lucene的中文分词器的改进与实现 [J], 罗惠峰;郭淑琴3.基于Lucene的中文分词器的设计与实现 [J], 彭焕峰4.基于Lucene的中文是非问答系统的设计与实现 [J], 罗东霞;卿粼波;吴晓红5.基于Lucene的中文是非问答系统的设计与实现 [J], 罗东霞;卿粼波;吴晓红因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Company name
2008年6月21日 年 月 日
致谢 在我的毕业设计即将完成之际,我 想感谢所有在毕设过程中帮助指导我的 老师和同学们。感谢程老师,在整个设 计过程中都给予了高度的关注和悉心的 指导。感谢各位答辩组的老师,感谢郭 师兄,还有我的同学孙琳,谢谢你们给 了我最无私的帮助,谢谢。
对结果的纠错功能实现过程
中文字典 不 存 在 查找
存 在
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
5.新词识别 新词识别
获得位 置连续的 碎片 组
计算每 两个 相邻碎 片的 条件 概率
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
总结 2)对分词歧义进行了研究。实现了最大正向匹配算法,对 中文文本分词。为了提高分词的准确率,在最大正向匹配算 法的基础做了改进,对文本分别实现了正向和逆向的最大匹 配,然后对两种结果进行基于规则的选择,实验证明,这种 分词算法可显著提高分词准确率。 3)在识别新词的问题上,对分词产生的碎片进行概率上的 统计,以此来判断是否将其认为是未登录词。通过测试验 证,系统可识别大部分的中文人名,提高了系统的实用性。 4)针对中文文本中可能会出现英文词语的特点,系统对英 文文本也进行了相应的处理,保证了分词的全面性,提高 了系统的处理能力。
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
双字哈希词典机制
为了使分词系统在具有较高的分词效率的同 时,维护和更新词典也相对简单,本研究采用了 一种新的词典机制来建立词典——双字哈希词典 机制。。
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
Company name
LOGO
2008年6月21日 年 月 日
Company name
基于Lucene的中文字典分词模块 的设计与实现
LOGO
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
1.中文分词的研究背景及现状 1.中文分词的研究背景及现状 中文分词的研究 2.中文分词的研究内容和意义 2.中文分词的研究内容和意义 中文分词的研究 3.分词模块的设计与实现 3.分词模块的设计与实现 4.对本文工作的总结 4.对本文工作的总结
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
中文分词面临的问题
计算机难以正确理 解并分析中文文本
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
中文分词的研究内容
语言是一个开放集,它的词条始终是处于不断的增长中, 所以很难有一个完善的词典来描述它,可能这个词在今天 不是词,在将来就被认定为一个词了。这就告诉我们,词 典的完备性始终是我们研究中文分词必须考虑的一个问题。 汉语自然语言处理的应用系统处理对象越来越多的是大规 模语料,因此分词的速度和分词算法的易实现性变得相当 关键。 词典规模、词典查找速度、切分预处理方式、切分排 歧方式、未登录词处理、词性标注等方面在前人的基 础上做进一步的改善
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
4 歧义识别 歧义识别——对结果的进一步处理 对结果的进一步处理
最大正向匹配算法 最大逆向匹配算法
Company name
2008年6月21日 日 年 月 6月21日 2008年 月 年 日
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
中文文本分词的一般过程
词典初始化 输入分词文本,对文本预处理 对文本进行初步的划分 消歧和未登陆词识别 保存结果
Company name
中文词典 更新词典
2008年6月21日 年 年月 日 2008年6月21日 月 日
Company name
2008年6月21日 年 月 日
总结 不过,此中文分词模块还存在一些固有的缺陷,如词 典结构的建立并未充分考虑到空间浪费的问题,对于碎片 的整理之后还应该添加权值计算和确定的功能,系统还未 实现向词典添加新词的功能,这些问题都有待进一步深入 研究后,再提出可行的方案进行完善。
与设定 的阈 值比较 大小 判断是 否为 词
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
新词识别
王军虎
计算碎片“虎”相对于“军” (“王军”)的条件概率 计算碎片“军”相对于 “王“的条件概率
碎片“ 碎片“虎”碎片“ Nhomakorabea片“军”
计算“王”在文本 中出现的概率 碎片“王” 碎片“
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
中文分词的研究现状
从70年代我国情报检索界从事到中文信息检索 领域的研究开始,一直有大量学者致力于中文自动 分词研究,至今已获得许多可喜的成果,出现了一 些实用的自动分词系统。这些系统在分词的精确度 和分词速度方面都具有相当的水平,但是仍然需要 进一步的研究。
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
中文分词的研究背景及现状 中文分词的研究背景及现状 网络资源爆炸性增长, 网络资源爆炸性增长,搜索引擎技术发展迅速 全文搜索引擎包Lucene在许多搜索引擎技术项 全文搜索引擎包Lucene在许多搜索引擎技术项 Lucene 目中得到了广泛且深入的应用和研究 中文分词技术成为计算机信息检索、 中文分词技术成为计算机信息检索、自然语言 理解、人工智能、 理解、人工智能、机器翻译和自动文摘等领域 突破的关键多种技术发展的瓶颈
基于Lucene的中文字典分词模块的设计与实现 基于Lucene的中文字典分词模块的设计与实现 Lucene 1词典建立 词典是汉语自动分词的基础,分词词典机制的 优劣直接影响到中文分词的速度和效率。
1 基于整词二分 的分词词典机 制 2 基于TRIE索引 树的分词词典 机制 3 基于逐字二分 的分词词典机 制
Company name
2008年6月21日 年 月 日
本课题的研究意义
由于Lucene支持的中文文本分词仅限于单字区分 和双字区分两种方式,不能满足大多数中文文本 信息检索技术的需求,所以在一定程度上限制了 它在中国的应用和开发。因此Lucene加入中文分 词的功能,对于Lucene在中国的广泛应用和发展 将会起到很大的推动作用
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于Lucene的中文字典分词模块的设计与实现 Lucene 本设计完成的功能:
设计词典结构,读入词库文件,初始化词典结构 对文本预处理,使用最大正向匹配算法初步分词 设计实现双向匹配算法,对结果进行基于规则的选择,实 现系统纠错功能 对分词后的结果产生的碎片进行概率统计,识别文本中的未 登陆词 将分词系统封装成Lucene分析器,并使用索引器建立索引, 实现系统检索功能
Company name
2008年6月21日 日 年 月年6月21日 2008年 日 月
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
3.对文本进行初步的分词 本分词系统选用机械分词算法中的最大匹配算 法作为中文分词算法,具体实现就是对于字符串s, 从前到后扫描,对扫描的每个字,从词表中寻找 最长匹配 。
双字哈希词典机制
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
2.对文本进行预处理
预处理,利用特殊的标记(0xa1)将输入的中文文本 分割成较短的汉字串,汉字串以中文空格分开,简化分 词算法要处理的特殊情况,这些标记包括所有的标点符 号,例如:“,”、“。”等等。由于本研究同时考虑 到了对英文文本和数字的处理,所以,也将英文单词, 数字等作为标记来分割中文文本。
系统设计界面和功能展示
Company name
2008年6月21日 年 月 日
系统设计界面和功能展示
Company name
2008年6月21日 年 月 日
系统设计界面和功能展示
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
对本文工作的总结 对本文工作的总结 本文在全文搜索引擎JAVA版的开源软件包LUCENE的基 础上,对中文分词技术进行了深入的研究,设计并完成了 中文文本字典分词系统,并将系统封装成LUCENE分析器添 加到LUCENE中使用,扩展了LUCENE的中文处理的功能。 1)对几种常用词典机制进行了分析和比较,针对中文文本 中双字词所占比例较高的特点,实现双层哈希词典机制策 略,在保证分词具有较高的效率的同时,简化了对词典的 维护和更新等操作,使系统维护简单易行。
Company name
2008年6月21日 年 年月 日 2008年6月21日 月 日
基于Lucene的中文字典分词模块的设计与实现 基于 的中文字典分词模块的设计与实现
5.将系统封装成Lucene分析器,建立索引
lucene.analysis(分析器)
相关文档
最新文档