IKAnalyzer分词器及lucene使用IKAnalyzer分析报告_第1页
IKAnalyzer分词器及lucene使用IKAnalyzer分析报告_第2页
IKAnalyzer分词器及lucene使用IKAnalyzer分析报告_第3页
IKAnalyzer分词器及lucene使用IKAnalyzer分析报告_第4页
IKAnalyzer分词器及lucene使用IKAnalyzer分析报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IKAnalyzer 版本Jar包下载IKAn alyzer3.2.8_b in下载地址:http:/code.google.eom/p/ik-a nalyzer/dow nl oads/detail ?n ame=IKA nalyzer3.2.8%20bin. zip&can=2&q=阴礙E工am共拿新理文件夫 Tiffin (G).“新(D:j7新h聘(ejj 新怖巻(FJME (GJ二DVD RW呃刃 盘eD-ROM盟沏二 Ml 2rrdoc3J.s8extstopword.di圜TKAnalyzer3,2-8- 伽TKAnalyeiP 立5*a*V32.Eft 用手册” P出下载后包含

2、说明及API文档(在目录 doc3.2.8 中)。源码下载http:/eode.google.eom/p/ik-a nalyzer/dow nl oads/detail ?n ame=IKA nalyzer3.2.8%20so urce.zip&can=2&q=苕畫tXJT山rl邑,曰疋乂壮炭山nTKAnalyzer3,2.S sourc.Index of /pub/scftware/,/zerLAikiIssuesSdurcE Export to GitHub for1.1 MBWhst this?rzor3.2.8 源码starred this downloadSearchIKSegmen

3、tation 浅析(纯 IK 分词)IKSegmentation 是IK中独立的分词器,和lucene没有关系。不继承,不扩展,不使用lucene 相关的类。IK主分词器构造函数* IK主分词器构造函数* paraminput* paramisMaxWordLength当为true时,分词器进行最大词长切分*/public IKSegme ntati on( Reader in put , boolea n isMaxWordLe ngth) this .in put = in put ;segmentBuff = new char BUFF_SIZEcon text = n ewC on t

4、ext( segme ntBuff , isMaxWordLe ngth); segme nters = Con figurati on.loadSegme nter();Reader in put是一个输入流,用于读取文件内容。IKSegmentation的构造器,作了 3个事1、new Con text( segme ntBuff , isMaxWordLe ngth)创建上下文对象 Con text con text = n ewC on text( segme ntBuff , isMaxWordLe ngth);Con tex主要是存储分词结果集和记录分词处理的游标位置。2、Conf

5、iguration. loadSegmenter ()加载词典、创建分词器/*Configuration. loadSegmenter()方法实现在加载词典,创建分词器详情如下。初始化子分词器实现(目前暂时不考虑配置扩展)return List vISegmenter*/public static List loadSegme nter()/初始化词典单例,如果查看get In sta nee ()发现里面有详细的初始 化词典的相关方法Dicti on ary. getl nsta nee ();List segme nters = n ewArrayList(4);/处理数量词的子分词器se

6、gmenters.add( newQuantifierSegmenter();/处理中文词的子分词器segmenters.add( newCJKSegmenter();/处理字母的子分词器segmenters.add( newLetterSegmenter();return segme nters;得至U Lexeme这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于3.0版本被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。调用的next()方法,会返回Lexeme对象,如果没有下一个分词结果,会返回null。源码如下/*获取下

7、一个语义单元* return没有更多的词元,则返回null* throws IOException*/public synchronized Lexeme next()throws IOException if (context .getResultSize() = 0)/*从reader中读取数据,填充 buffer*如果reader是分次读入buffer的,那么buffer要进行移位处理*移位处理上次读入的但未处理的数据*/ int available = fillBuffer( in put );if (available = 0)con text .resetCo ntext(); r

8、eturn null ; else /分词处理int an alyzedLe ngth = 0;for (int buffIndex = 0 ; buffIndex available ;buffI ndex +)/移动缓冲区指针con text .setCursor( buffI ndex );/进行字符规格化(全角转半角,大写转小写处理)segmentBuff buffIndex = CharacterHelper. regularize (segmentBuffbuffindex );/遍历子分词器for (ISegmenter segmenter : segmenters)segme

9、nter. nextLexeme( segme ntBuff , con text );an alyzedLe ngth +;/*满足一下条件时,* l.available = BUFF_SIZE 表示 buffer 满载* 2.buffIndex available-BUFF_EXHAUST_CRITICAL示当前指针处于临界区内* 3.!context.isBufferLocked()表示没有 segmenter 在占用 buffer*要中断当前循环(buffer要进行移位,并再读取数据的 操作)*/ if (available = BUFF_SIZE& buffIndex availab

10、le - BUFF_EXHAUST_CRITICAL& ! con text .isBufferLocked()break;for (ISegmenter segmenter : segmenters)segme nter.reset();/System.out.pri ntln( available + : + buffi ndex);/记录最近一次分析的字符长度con text .setLastA nalyzed(an alyzedLe ngth );/同时累计已分析的字符长度con text .setBuffOffset(con text .getBuffOffset() +analyz

11、edLength );/如果使用最大切分,则过滤交叠的短词元if (context .isMaxWordLength()con text .excludeOverlap();/读取词元池中的词元return buildLexeme( con text .firstLexeme(); else /读取词元池中的已有词元return buildLexeme( con text .firstLexeme();Lexeme说明public int getBegi nPositi on()说明:获取诧义单元的起始字符在文本中的位置返回值:int ,诧义单元相对于文本的绝对起始位置public int g

12、etE ndPositi on()说明:获取诧义单元的结束字符的下一个位置返回值:int ,诧义单元相对于文本的绝对终止位置的下一个字符位置public int getLe ngth()说明:获取诧义单元包含字符串的长度返回值:int ,诧义单元长度=getEndPosition- getBeginPositionpublic Stri ng getLexemeText()说明:获取诧义单元包含字符串内容返回值:String ,诧义单元的实际内容,即分词的结果完整代码示例private static void IKFenCi()FileInputStream fis;try fis = new

13、 FileI nputStream( F:tmp1234.txt);InputStreamReader isr=new InputStreamReader(fis, UTF-8);BufferedReader br =new BufferedReader(isr);IKSegme ntati on ik =new IKSegme ntati on(br,true);Lexeme lex =null ;while (lex=ik.next()!=null )System.out .pr intln (lex.getLexemeText()+| LexemeType=+lex.getLexemeT

14、ype() +| TYPE_CJK_NORMAL= +lex. TYPE_CJK_NORMAL catch (FileNotFoundException e) / TOD8uto-ge nerated catch blocke.pri ntStackTrace(); catch (UnsupportedEncodingException e) / TOD8uto-ge nerated catch blocke.pri ntStackTrace(); catch (IOException e) / TODOuto-ge nerated catch blocke.pri ntStackTrace(

15、);Lucene 使用 IKAnalyzer 分词实例化IKAnalyzer分词器代码Analyzer analyzer =new IKAnalyzer(true );代码剖析Analyzer 类是 lucene 的一个类 org.apache.lucene.analysis.Analyzer, IKAnalyzer类继 承此类 (public final class IKAnalyzer extends Analyzer ) 并覆盖了 tokenStream 方法。IKAn alyzer构造方法说明它有一个构造方法接收一个参数isMaxWordLength,这个参数是标识IK是否采用最大词长

16、分词,还是采用最细粒度切分两种分词算法。实际两种算法的实现,最大词长切分是对最细 粒度切分的一种后续处理,是对最细粒度切分结果的过滤,选择出最长的分词结果。* IK分词器L頤朗g Analyzern5Jl类* param isMaxWordLength当为trueE,分词器迸行最犬词长切分 */public IKAnalyzer(boolean IsMaxWordLength)super();this * 5EtMaxWord Length(isMaxWard Length);)1调用tokenStream()方法返回分词对象Str in gReader reader=new Stri ngR

17、eader(这是要分的词”);TokenStream ts=analyzer.tokenStream( , reader);追踪源码查看真正的分词对象1、类 iKAnalyzer 的方法 tokenStreampublic TokenStream tokenStream(StringfieldName , Reader reader) return n ewIKToke ni zer( reader , isMaxWordLe ngth();返回一个IKTokenizer对象2、IKTokenizer 类的构造器中实例化了 IKSegmentation/TK分词器实现 private IKSe

18、gmentation _lKlmplement;/伺元文本属性=private Tc户mAtermAtt;/伺元检移属性 private OffsetAttribute offsetAtt; /记录盘后一个词元的誌東位畫 private int finalOffset;LuceneToken i适凱器类枸itlll埶* param in.iparam isMaxWordLength当为七广皿时,分诃55遍行最尢词怅切分;岂为fak电是,采用最细粒度*public IKTokenizer(Readier in t boolean isMaxWordLength) super(in);offset

19、Att = addAttribute(Of卡刍己七Attribute.ulmws); termAtt = add/Vtl:广ibuizE (丁匚口和心士七 rdbutc!. ulmss);TKImplement = new IKSegmentation(in , isMaxWordLength);由此可见IKSegmentation 才是真正的分词实现。IKSegmentation 详见上面的说 明。Lucene如何得到IKSegmentation 的分词结果i这里要说到几个类org.apache .lucen e.a nalysis.Toke nStream org.apache.luce

20、ne.a nalysis.Toke nizer org.wltea.a nalyzer.luce ne.l KToke nizer 它们之间的关系如下图所示二 ava * lein口 * 皿二 z匸tagac:匕牡-1 口c:己口己* anal丁吕丄吕.工ok皀nS匸MEairI org. apach住-lucene . analysis. Token! zerTokenizer 扩展了 TokenStreamj ava.lang.0bj ectI orgapache lucene util.AutributeSourceI org. apache lucene. analysis.Tcken

21、StreaicI arg apache Lucene.analysis.TokenizerI 5宀曰鱼*311&1址曰匕-1口匚吕nm -工IFTok总niz曰rIKTokenizer 扩展了 Tokenizer(Overridepublic TokenSt己日皿 tokenStream(String fieldName, Reader reader) return new IKTokenizer(reader isMaxWordLength();由上图可见,iKAnalyzer_类的tokenStream ()方法返回的是KTokenizer_。2、再看看IKTokenizer_类作了些什么

22、public final class IKTokenizer extends TokenizerIKToke nizer 的构造器* Lucene Tokenizer适配器类构詹函数* parm in* wmni isMaxWordLength当为trua时,分词器遊行最大诃长切知 当jfalse,乘用最卿 */public IKTokenizer(Reader in , boolean isMaxWordLength) super(in);offsetAtt = addAttribute(OffsetAttribute.class);termAtt =日birte (Tu厂僭Attribut

23、e * ulmsw);IKImplement = new IKSegmentationf in , isMaxWor-dLength);构造器实例化了 IKSegmentation用于分词。IKTokenizer 扩展了 Tokenizer覆盖了其中的几个方法方法in creme ntToke n()比较重要,这个方法用于测试是否还有下一个分词结果, 并生成分词结果。它会调用 Lexeme nextLexeme =KImplement.next(); 得到下一个分词结果, 如果有,会存入到属性(private TermAttribute_ termAtt ;)中,代码如下: if (nextL

24、exeme != null )/ 将 Lexeme转成 Attributes/设置词元文本termAtt .setTermBuffer( nextLexeme.getLexemeText();/设置词元长度termAtt .setTermLength( nextLexeme.getLength();/设置词元位移offsetAtt .setOffset( n extLexeme.getBegi nPositi on(),n extLexeme.getE ndPositio n();/记录分词的最后位置fin alOffset= n extLexeme.getE ndPositio n();/返

25、会true告知还有下个词元return true ;分词结果存在termAtt,那么通过什么方法得到呢。通过类 org.apache.lucene.analysis.Tokenizer的 getAttribute方法得至叽代码如下:TermAttribute term = ts.getAttribute(TermAttribute.class);通过循环调用in creme ntToke n()方法可不断得到分词结果,代码如下:try while (ts.incrementToken()System.out .print(term.toString()+|); catch (lOExcepti

26、on e) / TODOAuto-ge nerated catch blocke.pri ntStackTrace();完整代码/* LUCENE使用IK分词*/private static void LuceneJIKFenCi()String text=基于java语言开发的轻量级的中文分词工具包 /创建分词对象Analyzer anal=new IKAnalyzer(true );Strin gReader reader=n ewStri ngReader(text);/分词class );TokenStream ts=anal.tokenStream( , reader);TermAttribute term = ts.getAttribut

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论