如何在lucene中使用中文自动分词技术- -

偶在http://yuanlang.blogdriver.com/yuanlang/index.html上看到的一篇关于分词的文章

前段时间我试着在lucene中使用了自动分词技术,有不少朋友都很感兴趣。大致方法就是生成自动分词的dll,然后在java中用jni调用。前几天我整理一下,做了一个方便使用的jar包,并写了一个演示的例子和一篇说明文档,以上资料和dll文件还有java源程序可以到我们的网站-新闻收割机下载http://www.newsreaper.info/download/AutoSplit.rar

在使用dll的前提下,在lucene中使用自动分词的方法如下:
建索引时:
1)先调用SplitCaller将要处理的内容进行分词处理。示例代码如下:(下面的代码是对RSS文档进行建索引操作)
---RSSDocument.java-------
import com.blogever.RssReader.SplitCaller;
...
...
public static Document makeDocument(ItemIF item) {
    Document doc = new Document();
    //现在加了自动分词功能
    doc.add(Field.Text(TITLE, SplitCaller.splits("将标题进行分词")));
    doc.add(Field.Text(CONTENT,SplitCaller.splits("将内容进行分词")));
   
    //下面的内容没有分词
    doc.add(new Field("uid", uid(item), false, true, false));
  
   
    return doc;
  }
...

2)使用Analyzer时注意要使用 WhitespaceAnalyzer 分析器,因为自动分词程序已经将文档进行了分词,并用空格

空开,此时只要按空格进行解析就行了。如:“将标题进行分词”已经分成“将 标题 进行 分词”。
-----ChannelIndexer.java------
   ...
   import org.apache.lucene.analysis.WhitespaceAnalyzer;
   ...
   //其他代码
   ...
   Analyzer analyzer = new WhitespaceAnalyzer();
   ...

   public void indexItems(boolean createNewIndex, Collection items) throws java.io.IOException
   {
     ArrayList al = (ArrayList) items;
     Collections.sort(al, new ItemComparator());
     writer = new IndexWriter(indexDir, analyzer, createNewIndex);
     writer.maxFieldLength = 1000000;
     ...
     //其他代码
     ...
     writer.addDocument(RssDocument.makeDocument(item));
     ...
     writer.optimize();
     nrOfIndexedItems = writer.docCount();
     writer.close();
     logger.info("Finished writing index.");
   }
   ...

3)检索时,对检索词也采用上面同样的方法即可:
    ...
    Searcher searcher = new IndexSearcher("d://NewsSpider//index");
    Analyzer analyzer = new WhitespaceAnalyzer();

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      while (true) {
        System.out.print("Query: ");
        String line = in.readLine();

        if (line.length() == -1)
          break;

        Query query = QueryParser.parse(SplitCaller.splits(line), "title", analyzer);
        System.out.println("Searching for: " + query.toString("title"));

        Hits hits = searcher.search(query);
        System.out.println(hits.length() + " total matching documents");
      ...

通过上面的方法,就可以在lucene中使用自动分词的了。有人也许会问为什么不直接写一个能自动分词的Analyzer。其实本来我想写一个的,但是我发现那样很不方便,还不如先分词然后再用WhitespaceAnalyzer解析来得方便。如果有人有更好的办法,请一定和我探讨一下。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值