Lucene学习之——停用词

        做中文文本聚类,研究中科院的imdict-chinese-analyzer分词器时,我自己加载的停用词表一直都跑不出正确的结果,于是,就追踪lucene是怎么加载自己的停用词表的。在源代码的WordListLoader.java类中,发现了这样的代码:

 
 
  1. public static HashSet getWordSet(Reader reader) throws IOException {  
  2.    HashSet result = new HashSet();  
  3.    BufferedReader br = null;  
  4.    try {  
  5.      if (reader instanceof BufferedReader) {  
  6.        br = (BufferedReader) reader;  
  7.      } else {  
  8.        br = new BufferedReader(reader);  
  9.      }  
  10.      String word = null;  
  11.      while ((word = br.readLine()) != null) {  
  12.        result.add(word.trim());  
  13.      }  
  14.    }  
  15.    finally {  
  16.      if (br != null)  
  17.        br.close();  
  18.    }  
  19.    return result;  
  20.  } 

问题就变得清晰了,于是我在这行代码中加入了输出语句,把从文件中加载进去的停用词打印出来。这样,就找到了问题的根源了:停用词表的编码格式问题(我设置的编码格式为:Unicode)

       把研究的结果总结如下:

      1、Lucene支持的停用词表文件有utf-8.

     2、停用词表的格式很简单:每词一行.

     3、Luence中支持停用词的方式有5种(见org.apache.lucene.analysis.StopAnalyzer.java类的5种构造方法):StopAnalyzer.java类默认停用词,以String[]传入,以Set传入,以File传入,以Reader传入

   4、  关于停用词处理的参考代码如下:

 

 
 
  1. package com.xh.TextClustering;  
  2.  
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.io.StringReader;  
  6.  
  7. import org.apache.lucene.analysis.Analyzer;  
  8. import org.apache.lucene.analysis.Token;  
  9. import org.apache.lucene.analysis.TokenStream;  
  10. import org.apache.lucene.index.CorruptIndexException;  
  11. import org.apache.lucene.store.LockObtainFailedException;  
  12. public class StopAnalyzerTestChinese  
  13. {  
  14.       static  String  source="我 是 中国人。";  
  15.      public static void main(String args[])  
  16.      {  
  17.          Indexer();  
  18.      }  
  19.     private static void Indexer()   
  20.     {  
  21.         //Analyzer analyzer=new StopAnalyzer();  
  22.       
  23.         try {  
  24.             Analyzer analyzer=new StopAnalyzer(new File("chinese_stopword.dic"));  
  25. //          IndexWriter writer=new IndexWriter(IndexPath,analyzer,true,MaxFieldLength.UNLIMITED);  
  26. //          Document document=new Document();  
  27. //          Field field_content=new Field("content",source,Field.Store.YES,Field.Index.ANALYZED);  
  28. //          document.add(field_content);  
  29. //          ArrayList ItemList=new ArrayList();  
  30.             TokenStream stream=analyzer.tokenStream("content"new StringReader(source));  
  31.             while(true)  
  32.             {  
  33.                 Token item=stream.next();  
  34.                 if(null==item)break;  
  35.                 System.out.println("{"+item.termText()+"}");  
  36.             }  
  37. //          writer.optimize();  
  38. //          writer.close();  
  39.         } catch (CorruptIndexException e) {  
  40.             e.printStackTrace();  
  41.         } catch (LockObtainFailedException e) {  
  42.             e.printStackTrace();  
  43.         } catch (IOException e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  

注:参考中文停用词表在附件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值