`
zcwfeng
  • 浏览: 106614 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

lucene第三步,分词

 
阅读更多

出自:http://blog.csdn.net/wxwzy738/article/details/8799656 的整理

1

2、语汇单元的结构解释


3、同义词的设计思路


4、分词器的比较和测试

  1. packageorg.lucene.test;
  2. importjava.io.File;
  3. importjava.io.IOException;
  4. importorg.apache.lucene.analysis.Analyzer;
  5. importorg.apache.lucene.analysis.SimpleAnalyzer;
  6. importorg.apache.lucene.analysis.StopAnalyzer;
  7. importorg.apache.lucene.analysis.WhitespaceAnalyzer;
  8. importorg.apache.lucene.analysis.standard.StandardAnalyzer;
  9. importorg.apache.lucene.document.Document;
  10. importorg.apache.lucene.document.Field;
  11. importorg.apache.lucene.index.CorruptIndexException;
  12. importorg.apache.lucene.index.IndexReader;
  13. importorg.apache.lucene.index.IndexWriter;
  14. importorg.apache.lucene.index.IndexWriterConfig;
  15. importorg.apache.lucene.index.Term;
  16. importorg.apache.lucene.search.IndexSearcher;
  17. importorg.apache.lucene.search.ScoreDoc;
  18. importorg.apache.lucene.search.TermQuery;
  19. importorg.apache.lucene.search.TopDocs;
  20. importorg.apache.lucene.store.Directory;
  21. importorg.apache.lucene.store.RAMDirectory;
  22. importorg.apache.lucene.util.Version;
  23. importorg.junit.Test;
  24. importorg.lucene.util.AnalyzerUtils;
  25. importorg.lucene.util.MySameAnalyzer;
  26. importorg.lucene.util.MyStopAnalyzer;
  27. importcom.chenlb.mmseg4j.analysis.MMSegAnalyzer;
  28. publicclassTestAnalyzer{
  29. /**
  30. *几种分词器在英文分词下面的比较
  31. */
  32. @Test
  33. publicvoidtest01(){
  34. //标准分词器
  35. Analyzera1=newStandardAnalyzer(Version.LUCENE_35);
  36. //停用词分词器
  37. Analyzera2=newStopAnalyzer(Version.LUCENE_35);
  38. //简单分词器
  39. Analyzera3=newSimpleAnalyzer(Version.LUCENE_35);
  40. //空格分词器
  41. Analyzera4=newWhitespaceAnalyzer(Version.LUCENE_35);
  42. Stringtxt="thisismyhouse,Iamcomefromyunnangzhaotong,"+
  43. "Myemailisynkonghao@gmail.com,MyQQis707807876";
  44. AnalyzerUtils.displayToken(txt,a1);
  45. //[my][house][i][am][come][from][yunnang][zhaotong][my][email][ynkonghao][gmail.com][my][qq][707807876]
  46. AnalyzerUtils.displayToken(txt,a2);
  47. //[my][house][i][am][come][from][yunnang][zhaotong][my][email][ynkonghao][gmail][com][my][qq]
  48. AnalyzerUtils.displayToken(txt,a3);
  49. //[this][is][my][house][i][am][come][from][yunnang][zhaotong][my][email][is][ynkonghao][gmail][com][my][qq][is]
  50. AnalyzerUtils.displayToken(txt,a4);
  51. //[this][is][my][house,I][am][come][from][yunnang][zhaotong,My][email][is][ynkonghao@gmail.com,My][QQ][is][707807876]
  52. }
  53. /**
  54. *几种分词器在中文分词下面的比较
  55. */
  56. @Test
  57. publicvoidtest02(){
  58. //标准分词器
  59. Analyzera1=newStandardAnalyzer(Version.LUCENE_35);
  60. //停用词分词器
  61. Analyzera2=newStopAnalyzer(Version.LUCENE_35);
  62. //简单分词器
  63. Analyzera3=newSimpleAnalyzer(Version.LUCENE_35);
  64. //空格分词器
  65. Analyzera4=newWhitespaceAnalyzer(Version.LUCENE_35);
  66. Stringtxt="我来自云南昭通昭阳区师专";
  67. AnalyzerUtils.displayToken(txt,a1);
  68. //[我][来][自][云][南][昭][通][昭][阳][区][师][专]
  69. AnalyzerUtils.displayToken(txt,a2);
  70. //[我来自云南昭通昭阳区师专]
  71. AnalyzerUtils.displayToken(txt,a3);
  72. //[我来自云南昭通昭阳区师专]
  73. AnalyzerUtils.displayToken(txt,a4);
  74. //[我来自云南昭通昭阳区师专]
  75. }
  76. /**
  77. *打印分词的详细信息
  78. */
  79. @Test
  80. publicvoidtest03(){
  81. //标准分词器
  82. Analyzera1=newStandardAnalyzer(Version.LUCENE_35);
  83. //停用词分词器
  84. Analyzera2=newStopAnalyzer(Version.LUCENE_35);
  85. //简单分词器
  86. Analyzera3=newSimpleAnalyzer(Version.LUCENE_35);
  87. //空格分词器
  88. Analyzera4=newWhitespaceAnalyzer(Version.LUCENE_35);
  89. Stringtxt="howareyouthankyou";
  90. AnalyzerUtils.displayAllToken(txt,a1);
  91. AnalyzerUtils.displayAllToken(txt,a2);
  92. AnalyzerUtils.displayAllToken(txt,a3);
  93. AnalyzerUtils.displayAllToken(txt,a4);
  94. }
  95. /**
  96. *停用词的测试
  97. */
  98. @Test
  99. publicvoidtest04(){
  100. Analyzera1=newMyStopAnalyzer(newString[]{"I","you","hate"});
  101. Analyzera2=newStopAnalyzer(Version.LUCENE_35);
  102. Stringtxt="howareYouthAnk'syouIhateyou";
  103. AnalyzerUtils.displayToken(txt,a1);
  104. AnalyzerUtils.displayToken(txt,a2);
  105. }
  106. /**
  107. *中文分词测试
  108. *使用词库分词,自己可扩展词库
  109. */
  110. @Test
  111. publicvoidtest05(){
  112. //Analyzera1=newMMSegAnalyzer();//未加入该分词器自带的词库
  113. //[我][来][自][云][南][昭][通][昭][阳][区][师][专]
  114. //导入分词的词典便有词库
  115. Analyzera1=newMMSegAnalyzer(newFile("D:\\Workspaces\\03_lucene_analyzer\\mmseg4j-1.8.4\\data"));
  116. //[我][来自][云南][昭][通][昭][阳][区][师专]
  117. //可以在data文件下面的words-my.dic扩展自己的词典,比如加了昭通,分词结果为:
  118. //[我][来自][云南][昭通][昭][阳][区][师专]
  119. Stringtxt="我来自云南昭通昭阳区师专";
  120. AnalyzerUtils.displayToken(txt,a1);
  121. }
  122. /**
  123. *同义词测试
  124. *@throwsIOException
  125. *@throwsCorruptIndexException
  126. */
  127. @Test
  128. publicvoidtest06()throwsCorruptIndexException,IOException{
  129. Analyzera1=newMySameAnalyzer();
  130. Stringtxt="我来自中国云南昭通昭阳区师专";
  131. AnalyzerUtils.displayAllToken(txt,a1);
  132. Stringkeyword="俺";
  133. Directorydire=newRAMDirectory();
  134. IndexWriterindexWriter=newIndexWriter(dire,newIndexWriterConfig(Version.LUCENE_35,a1));
  135. Documentdoc=newDocument();
  136. doc.add(newField("content",txt,Field.Store.YES,Field.Index.ANALYZED));
  137. indexWriter.addDocument(doc);
  138. indexWriter.close();
  139. IndexSearchersearch=newIndexSearcher(IndexReader.open(dire));
  140. TopDocstopDoc=search.search(newTermQuery(newTerm("content",keyword)),10);
  141. ScoreDoc[]scoreDoc=topDoc.scoreDocs;
  142. for(ScoreDocscore:scoreDoc){
  143. Documentdoc1=search.doc(score.doc);
  144. System.out.println(doc1.get("content"));
  145. }
  146. }
  147. }

5、扩展自己的停用词分词器
  1. packageorg.lucene.util;
  2. importjava.io.IOException;
  3. importjava.io.Reader;
  4. importjava.util.Set;
  5. importorg.apache.lucene.analysis.Analyzer;
  6. importorg.apache.lucene.analysis.LetterTokenizer;
  7. importorg.apache.lucene.analysis.LowerCaseFilter;
  8. importorg.apache.lucene.analysis.StopAnalyzer;
  9. importorg.apache.lucene.analysis.StopFilter;
  10. importorg.apache.lucene.analysis.TokenStream;
  11. importorg.apache.lucene.analysis.Tokenizer;
  12. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  13. importorg.apache.lucene.util.Version;
  14. /**
  15. *扩展自己的停用词分词器
  16. *@authoruser
  17. *
  18. */
  19. publicclassMyStopAnalyzerextendsAnalyzer{
  20. privateSetstops;
  21. publicMyStopAnalyzer(String[]sws){
  22. //会自动将字符串数组转化为Set
  23. stops=StopFilter.makeStopSet(Version.LUCENE_35,sws,true);
  24. //把原来的停用词给加进来
  25. stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
  26. }
  27. publicMyStopAnalyzer(){
  28. //获取原有的停用词
  29. stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
  30. }
  31. @Override
  32. publicTokenStreamtokenStream(StringfieldName,Readerreader){
  33. System.out.println("//------------------------------------");
  34. Tokenizertokenizer=newLetterTokenizer(Version.LUCENE_35,reader);
  35. //Tokenizertokenizer=newStandardTokenizer(Version.LUCENE_35,reader);
  36. CharTermAttributecta=tokenizer.addAttribute(CharTermAttribute.class);
  37. try{
  38. while(tokenizer.incrementToken()){
  39. System.out.println(cta);
  40. }
  41. }catch(IOExceptione){
  42. e.printStackTrace();
  43. }
  44. System.out.println("------------------------------------\\");
  45. //为这个分词器设定过滤链和Tokenizer
  46. returnnewStopFilter(Version.LUCENE_35,
  47. newLowerCaseFilter(Version.LUCENE_35,
  48. newLetterTokenizer(Version.LUCENE_35,reader)),
  49. stops);
  50. }
  51. }
6、分词器的扩展,同义词分词器
  1. packageorg.lucene.util;
  2. importjava.io.Reader;
  3. importorg.apache.lucene.analysis.Analyzer;
  4. importorg.apache.lucene.analysis.TokenStream;
  5. importcom.chenlb.mmseg4j.Dictionary;
  6. importcom.chenlb.mmseg4j.MaxWordSeg;
  7. importcom.chenlb.mmseg4j.analysis.MMSegTokenizer;
  8. /**
  9. *分词器的扩展,同义词分词器
  10. *@authoruser
  11. *
  12. */
  13. publicclassMySameAnalyzerextendsAnalyzer{
  14. @Override
  15. publicTokenStreamtokenStream(StringfieldName,Readerreader){
  16. Dictionarydic=Dictionary.getInstance("D:\\Workspaces\\03_lucene_analyzer\\mmseg4j-1.8.4\\data");
  17. returnnewMySameTokenFilter(newMMSegTokenizer(newMaxWordSeg(dic),reader));
  18. }
  19. }

7、同义词过滤器的扩展
  1. packageorg.lucene.util;
  2. importjava.io.IOException;
  3. importjava.util.HashMap;
  4. importjava.util.Map;
  5. importjava.util.Stack;
  6. importorg.apache.lucene.analysis.TokenFilter;
  7. importorg.apache.lucene.analysis.TokenStream;
  8. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  9. importorg.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
  10. importorg.apache.lucene.util.AttributeSource;
  11. /**
  12. *同义词过滤器的扩展
  13. *@authoruser
  14. *
  15. */
  16. publicclassMySameTokenFilterextendsTokenFilter{
  17. privateCharTermAttributecta=null;
  18. privatePositionIncrementAttributepia=null;
  19. privateAttributeSource.Statecurrent=null;
  20. privateStack<String>sames=null;
  21. protectedMySameTokenFilter(TokenStreaminput){
  22. super(input);
  23. cta=this.addAttribute(CharTermAttribute.class);
  24. pia=this.addAttribute(PositionIncrementAttribute.class);
  25. sames=newStack<String>();
  26. }
  27. /**
  28. *思想如下:
  29. *其实每个同义词都要放在CharTermAttribute里面,但是如果直接cta.append("大陆");的话
  30. *那会直接把原来的词和同义词连接在同一个语汇单元里面[中国大陆],这样是不行的
  31. *要的是这样的效果[中国][大陆]
  32. *那么就要在遇到同义词的时候把当前的状态保存一份,并把同义词的数组放入栈中,
  33. *这样在下一个语汇单元的时候判断同义词数组是否为空,不为空的话把之前的保存的一份状态
  34. *还原,然后在修改之前状态的值cta.setEmpty(),然后在把同义词的值加入cta.append("大陆")
  35. *再把位置增量设为0,pia.setPositionIncrement(0),这样的话就表示是同义词,
  36. *接着把该同义词的语汇单元返回
  37. */
  38. @Override
  39. publicbooleanincrementToken()throwsIOException{
  40. while(sames.size()>0){
  41. //将元素出栈,并获取这个同义词
  42. Stringstr=sames.pop();
  43. //还原状态
  44. restoreState(current);
  45. cta.setEmpty();
  46. cta.append(str);
  47. //设置位置
  48. pia.setPositionIncrement(0);
  49. returntrue;
  50. }
  51. if(!input.incrementToken())returnfalse;
  52. if(getSameWords(cta.toString())){
  53. //如果有同义词将当前状态先保存
  54. current=captureState();
  55. }
  56. returntrue;
  57. }
  58. /*
  59. *使用这种方式是不行的,这种会把的结果是[中国]替换成了[大陆]
  60. *而不是变成了[中国][大陆]
  61. @Override
  62. publicbooleanincrementToken()throwsIOException{
  63. if(!input.incrementToken())returnfalse;
  64. if(cta.toString().equals("中国")){
  65. cta.setEmpty();
  66. cta.append("大陆");
  67. }
  68. returntrue;
  69. }
  70. */
  71. privatebooleangetSameWords(Stringname){
  72. Map<String,String[]>maps=newHashMap<String,String[]>();
  73. maps.put("中国",newString[]{"大陆","天朝"});
  74. maps.put("我",newString[]{"咱","俺"});
  75. String[]sws=maps.get(name);
  76. if(sws!=null){
  77. for(Strings:sws){
  78. sames.push(s);
  79. }
  80. returntrue;
  81. }
  82. returnfalse;
  83. }
  84. }

8、打印语汇单元的信息
  1. packageorg.lucene.util;
  2. importjava.io.IOException;
  3. importjava.io.StringReader;
  4. importorg.apache.lucene.analysis.Analyzer;
  5. importorg.apache.lucene.analysis.TokenStream;
  6. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  7. importorg.apache.lucene.analysis.tokenattributes.OffsetAttribute;
  8. importorg.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
  9. importorg.apache.lucene.analysis.tokenattributes.TypeAttribute;
  10. /**
  11. *打印语汇单元的信息
  12. *@authoruser
  13. *
  14. */
  15. publicclassAnalyzerUtils{
  16. publicstaticvoiddisplayToken(Stringstr,Analyzera){
  17. TokenStreamstream=a.tokenStream("content",newStringReader(str));
  18. /*
  19. *TokenStream相当于一条流
  20. *CharTermAttribute相当于一个碗
  21. *然后把碗丢进流里面,当碗得到一个元素后,碗又会自动流到了下
  22. *一个元素进行取值
  23. *这是一种设计模式:创建一个属性,这个属性会添加流中,
  24. *随着这个TokenStream增加
  25. */
  26. CharTermAttributecta=stream.addAttribute(CharTermAttribute.class);
  27. try{
  28. while(stream.incrementToken()){
  29. System.out.print("["+cta+"]");
  30. //System.out.println(stream);
  31. //如果直接打印Stream的话,toString打印如下:
  32. //(来,startOffset=1,endOffset=2,positionIncrement=1,type=<IDEOGRAPHIC>)
  33. }
  34. System.out.println();
  35. }catch(IOExceptione){
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. *打印详细信息的语汇单元
  41. *@paramstr
  42. *@parama
  43. */
  44. publicstaticvoiddisplayAllToken(Stringstr,Analyzera){
  45. TokenStreamstream=a.tokenStream("content",newStringReader(str));
  46. //位置增量
  47. PositionIncrementAttributepia=stream.addAttribute(PositionIncrementAttribute.class);
  48. //偏移量
  49. OffsetAttributeoa=stream.addAttribute(OffsetAttribute.class);
  50. //词元
  51. CharTermAttributecta=stream.addAttribute(CharTermAttribute.class);
  52. //分词的类型
  53. TypeAttributeta=stream.addAttribute(TypeAttribute.class);
  54. try{
  55. while(stream.incrementToken()){
  56. System.out.print(pia.getPositionIncrement()+":");
  57. System.out.print(cta+"["+oa.startOffset()+"-"+
  58. oa.endOffset()+"-"+ta.type());
  59. System.out.println();
  60. }
  61. System.out.println();
  62. }catch(IOExceptione){
  63. e.printStackTrace();
  64. }
  65. }
  66. }

工程下载路径:http://download.csdn.net/detail/wxwzy738/5284705
分享到:
评论

相关推荐

    lucene.NET 中文分词

    在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...

    如何使用Lucene的中文分词搜索

    1. **中文分词器**:在Lucene中,针对中文的分词通常使用第三方插件,如IK Analyzer、jieba分词库或SmartChinese Analyzer。这些分词器能识别中文词汇并将其拆分为单个词元(Token)。 2. **配置分析器**:在...

    运用在lucene中的中文分词算法源码

    Lucene本身并不直接支持中文分词,而是通过集成第三方分词器来实现。常见的中文分词器有IK Analyzer、HanLP、jieba分词等。这些分词器基于不同的分词策略,如基于词典的分词、基于统计的分词、HMM(隐马尔科夫模型)...

    Lucene5+HanLP分词例子

    然而,`Lucene5`默认的分词器对中文支持不够完善,因此需要借助第三方分词工具来增强其中文处理能力。 `HanLP`(全称:High-performance Natural Language Processing)是由网易有道公司开源的一个自然语言处理工具...

    lucene、solr中文分词器

    在Solr中,我们可以直接配置这些第三方分词器,例如在solrconfig.xml文件中设置Analyzer,以实现对中文文档的高效索引和检索。 在使用这些中文分词器时,需要注意以下几点: 1. 配置:正确配置分词器的字典文件和...

    盘古分词+Lucene

    对于中文文本的处理,分词是关键的第一步,而Lucene则是广泛使用的全文搜索引擎库。本文将深入探讨盘古分词和Lucene如何协同工作,为中文全文检索提供高效且精准的支持。 首先,让我们来了解一下盘古分词。盘古分词...

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    标题中的“lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是...

    lucene 中文分词 庖丁解牛

    在处理中文文档时,Lucene需要依赖于第三方的分词器,以便对中文文本进行有效的切分。 二、中文分词的重要性 中文分词是中文信息处理的核心环节,因为中文词汇之间没有明显的分隔符,因此需要通过特定算法将连续的...

    lucene中文分词(庖丁解牛)庖丁分词

    在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨如何在Lucene中结合“庖丁解牛”这一中文分词工具,实现高效、准确的中文文本处理。 一...

    lucene3.5中文分词案例

    此外,还有如HanLP、jieba等第三方分词工具,它们提供了更丰富的分词效果和自定义功能。 二、Lucene 3.5中文分词实践 1. 安装与配置:在使用Lucene进行中文分词前,首先需要引入IK Analyzer或其他中文分词库的依赖...

    lucene Analyzer 庖丁解牛 中文分词

    而`IKAnalyzer`(Intelligent Chinese Analyzer)则是一款第三方的开源Analyzer,它具有较好的分词效果和较高的灵活性,支持自定义词典和热更新。 1. **词典分词**:无论是`SmartChineseAnalyzer`还是`IKAnalyzer`...

    Lucene关于几种中文分词的总结

    3. IK_CAnalyzer(MIK_CAnalyzer):这是基于Lucene 2.0开发的第三方分词器,由用户自行维护和更新。IKAnalyzer(包括MIK_CAnalyzer的改进版)以词典为基础,具有较好的分词效果和可扩展性,支持动态词典更新,适用...

    基于词典的最大匹配的Lucene中文分词程序

    在Lucene中,我们可以使用IK Analyzer、Smart Chinese Analyzer或HanLP等第三方分词器,它们都实现了基于词典的最大匹配分词策略。这些分词器通常包括以下步骤: - 读取词典:加载词典文件,构建Trie树或其他高效的...

    基于Lucene的中文分词器代码paoding,IK,imdict,mmseg4j

    在自然语言处理领域,中文分词是至关重要的第一步,它涉及到文本分析、信息检索、机器学习等多个方面。本文将深入探讨基于Lucene的四种中文分词器:Paoding、IK、Imdict和Mmseg4j,它们都是针对Java开发的高效、开源...

    Lucene分词查询

    由于中文没有明显的分隔符,Lucene需要依赖第三方分词器。例如,IKAnalyzer是一个流行的开源分词器,它支持灵活的词典定制和多种分词模式,能够很好地处理常见词汇和网络用语。另一个选择是SmartChineseAnalyzer,它...

    分词器LUcene

    在信息检索和自然语言处理领域,分词是至关重要的第一步。Lucene,作为Java最著名的全文搜索引擎库,其强大的分词能力使得它在各种信息检索系统中广泛应用。本文将深入探讨Lucene中的分词器特性,特别是其对分词歧义...

    Lucene建立索引jar包和Paoding分词jar包

    Lucene自身的分词能力对于中文来说相对较弱,因此引入了第三方分词工具,如Paoding分词。 三、Paoding分词 Paoding(庖丁)是一款高性能、易用的中文分词工具,尤其适合大规模文本处理。它的特点包括支持多种分词...

    lucene 中文分词

    在Lucene中,进行中文分词是通过第三方分词器来完成的,如jieba分词、IK分词等。 在Lucene中实现中文检索,我们通常会遵循以下步骤: 1. **创建索引**:首先,我们需要对要搜索的文档进行分词,然后将这些词汇和...

    lucene分词程序

    分词是文本处理的第一步,它将连续的字符序列分割成有意义的词语,为后续的索引和搜索操作奠定基础。不同的分词策略会直接影响到搜索引擎对用户查询的理解和匹配。 3. **Lucene中的分词器(Analyzer)** 在Lucene...

    Lucene的使用Demo(含分词)

    - 实现分词策略,可能包括自定义分词器或第三方分词库的集成 - 在ASP.NET Web应用程序中嵌入全文搜索功能 - 解决方案和项目结构的组织 - 使用Visual Studio进行开发和调试 为了深入理解这个Demo,开发者需要熟悉...

Global site tag (gtag.js) - Google Analytics