Lucene分词原理与方式

--------------------------------------------------------

lucene的分词_分词器的原理讲解

--------------------------------------------------------

几个默认分词

SimpleAnalyzer

StopAnalyzer

WhitespaceAnalyzer(根据空格分词)

StandardAnalyzer

分词流程

Reader  ---->Tokenizer---->大量的TokenFilter---->最后生成TokenStream

Tokenizer:主要负责接收Reader字节流,将Reader进行分词操作。

TokenFilter:对已经分好词的语汇单元进行各种各样的过滤操作

TokenStream:分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以tokenStream有效的获取到分词单元信息

在这个流中分词需要存储的涉及的信息

CharTermAttribute:保存相应的词汇

OffsetAttribute:以增量的方式保存次序,各个词汇的偏移量

PositionIncrementAttribute:保存词与词之间的位置增量(0:同位词。2:表示中间有词汇)

TypeAttribute:类型信息

---------------------------------------------------------

lucene的分词_通过TokenStream显示分词

---------------------------------------------------------

/*
* 显示分词(TokenStream流再用CharTermAttribute捕获)
*/
public static void displayToken(String str, Analyzer a) {
	try {
		// "content"没有任何意义
		// 通过分词器Analyzer创建TokenStream流
		TokenStream stream = a.tokenStream("content", new StringReader(str));
		// 创建用于接收信息的CharTermAttribute,这个属性会添加到流中,随着TokenStream增加
		CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
		while (stream.incrementToken()) {
			System.out.print("[" + cta + "]");
		}
			System.out.println();
	} catch (IOException e) {
			e.printStackTrace();
	}
}
/*
*测试
*/
@Test
public void test01() {
	// 创建几个analyzer
	Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35);
	Analyzer a2 = new StopAnalyzer(Version.LUCENE_35);
	Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);
	Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);

	String txt = "this is my house,I am come from HuNan";
	new AnalyzerUtils().displayToken(txt, a1);
	new AnalyzerUtils().displayToken(txt, a2);
	new AnalyzerUtils().displayToken(txt, a3);
	new AnalyzerUtils().displayToken(txt, a4);
}

-------------------------------------------------------------

lucene分词_通过TokenStream显示分词的详细信息

-------------------------------------------------------------

/*
 * 显示所有重要的分词信息
*/
public static void displayAllTokenInfo(String str, Analyzer a) {
	try {
	 TokenStream stream = a.tokenStream("content", new StringReader(str));
	// 增量信息
	PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
	// offset偏移量信息OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
	// 分词词汇信息
	CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
	// 类型信息
	TypeAttribute ta = stream.addAttribute(TypeAttribute.class);
	while (stream.incrementToken()) {
		System.out.print("位置增量" + pia.getPositionIncrement() + ":");
		System.out.print("词汇信息&偏移量&类型" + cta + "[" + oa.startOffset()+ "-" + oa.endOffset() + "]" + ta.type()+"\n");
                }
	} catch (Exception e) {
		e.printStackTrace();
	}
}

----------------------------------------------------------

lucene的分词_扩展stop分词(自定义stopfilterAnalyzer,增加过滤数组)

----------------------------------------------------------

/*
 * 自定义过滤分词器
 */
public class MystopAnalyzer extends Analyzer {
	private Set stops;

	public MystopAnalyzer(){
		stops=StopAnalyzer.ENGLISH_STOP_WORDS_SET;
	}
	public MystopAnalyzer(String[] sws) {
		// 查看默认过滤的词汇单元
		System.out.println(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
		// 创建分词器(会自动将字符串数组转化成set)
		stops = StopFilter.makeStopSet(Version.LUCENE_35, sws, true);
		// 给自定义的过滤分词器添加原来默认的过滤数组
		stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
	}

	@Override
	public TokenStream tokenStream(String fieldName, Reader reader) {
	// 添加过滤器链(filter)(过滤掉set数组,忽略大小写)和Tokenizer
		return new StopFilter(Version.LUCENE_35,
		          new LowerCaseFilter(Version.LUCENE_35,
		          new LetterTokenizer(Version.LUCENE_35,reader)), stops);
	}

}
//测试
// 创建自定义的analyzer(添加需要过滤掉的词汇单元	)
Analyzer a1 = new MystopAnalyzer(new String[]{"I","YOU"});

时间: 2024-10-12 18:29:37

Lucene分词原理与方式的相关文章

Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索引原理 2. Lucene优化经验总结 1. Lucene简介和索引原理 该部分从三方面展开:Lucene简介.索引原理.Lucene索引实现. 1.1 Lucene简介 Lucene最初由鼎鼎大名Doug Cutting开发,2000年开源,现在也是开源全文检索方案的不二选择,它的特点概述起来就是

中文分词技术(中文分词原理)

一.       为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键. Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分.除此之外,还有最大切分(包括向前.向后.以及前后相结合).最少切分.全切分等等. 二.       中文分词技术的分类 我们讨论的分词算法可分为三大类:基于字典.词库匹配的分词方法:基于词频度统计的分词方法

Lucene 工作原理

Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too. 文章2的内容为:He once lived in Shanghai. 1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施 a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词

Lucene 工作原理 之倒排索引

1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index).带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file). 倒排文件(倒排索引),索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制. 搜索引擎的关键步骤就是

lucene分词流程

这一个星期花时间好好学习了一下lucene/solr,今天好好总结一下,写点文章记录点重要的东西,以便日后不至于丈二和尚摸不着头脑, 这一篇文章主要是简单的介绍一下lucene分词过程中的分词流程,和一些简单原理的讲解,希望不妥这处读者能够指正,不胜感激!! (一)主要分词器 WhitespaceAnalyzer.StopAnalyzer.SimpleAnalyzer.KeywordAnalyzer,他们都的父类都是Analazer,在Analazer类中有一个抽象方法叫做tokenStream

Lucene分词器之庖丁解牛

留意:这儿配置环境变量要重新启动体系后收效 我如今测验用的Lucene版本是lucene-2.4.0,它现已可以支撑中文号码大全分词,但它是关键词挖掘工具选用一元分词(逐字拆分)的方法,即把每一个汉字当作是一个词,这样会使树立的索引非常巨大,会影响查询功率.所以大多运用lucene的兄弟,都会思考使用其它的中文分词包,这儿我就介绍最为常用的"厨子解牛"分词包,当然它也是一个值得引荐的中文分词包. 这篇文章首要解说Lucene怎么结合"厨子解牛"分词包,在结合前,仍是

lucene 分词器

分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An IndexWriter creates and maintains an index . 2,去除停用词 IndexWriter creates maintains index 3,转为小写 indexwriter creates maintains index 1 package cn.itcast.e_a

自定义Lucene分词器示例

集团的内部通讯工具搜同事时,需要根据姓名后缀进行搜索.譬如"徐欢春",我们要能根据"欢春"搜出这个人:"黄继刚",要根据"继刚"为关键字搜出"黄继刚".这是个很人性化的用户体验,当我们有同事的名字是三个字的时候,我们通常会叫他们名字的最后两个字.Lucene本身并没有提供这种分词器,只能自己照着Lucene已有的分词器进行模仿开发. 参照ngram分词器进行开发. 实现一个Tokenizer和一个工厂类就可

中文分词原理和实现

三大主流分词方法:基于词典的方法.基于规则的方法和基于统计的方法. 1.基于规则或词典的方法 定义:按照一定策略将待分析的汉字串与一个"大机器词典"中的词条进行匹配,若在词典中找到某个字符串,则匹配成功. 按照扫描方向的不同:正向匹配和逆向匹配 按照长度的不同:最大匹配和最小匹配 1.1正向最大匹配思想MM 从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数. 查找大机器词典并进行匹配: 若匹配成功,则将这个匹配字段作为一个词切分出来. 若匹配不成功,则将这个匹