使用肖波的KTDictSeg分词器 为Lucene.net服务

最近在看Lucene.net 发现Lucene.net的中文分词资料不是很多,很早就在看肖波的KTDictSeg,觉的分词效果不错,但是没有lucene接口,看他的blog也是很长时间没有更新了 他在他的blog中提到将在下一个版本中提供对lucene的支持,我这里期待中...同时blog中提到一挥的修改版本,但是一挥的站打不开了,不知道什么原因,我刚刚看这个时间不长,查了些资料 写了下面的代码实现了KTDictSeg在Lucene.net中的调用,期待有更好的方法出现

下面附上代码

1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5using Lucene.Net;
6using Lucene.Net.Analysis;
7
8namespace Lucene.Net.Analysis.KTDictSeg
9{
10  public class KTDictSegAnalyzer:Analyzer
11  {
12    public KTDictSegAnalyzer()
13    {
14    }
15
16    public override TokenStream TokenStream(string fieldName, TextReader reader)
17    {
18      TokenStream result = new KTDictSegTokenizer(reader);
19      result = new LowerCaseFilter(result);      
20      return result;
21    }
22  }
23}
  
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using Lucene.Net;
using Lucene.Net.Analysis;
using KTDictSeg;
  
namespace Lucene.Net.Analysis.KTDictSeg
{
  public class KTDictSegTokenizer:Tokenizer
  {
    public static CSimpleDictSeg m_SimpleDictSeg;
    private ArrayList ioBuffer;
    private int offSet = 0 ;  //偏移量.
    private int position = -1 ; //词汇在缓冲中的位置.
    private int length = 0 ;  //词汇的长度.
    private int start = 0 ;   //开始偏移量.
  
    public KTDictSegTokenizer(System.IO.TextReader input)
      : base(input)
    {
      //这里用了一个第三方的中文分词组件.
      //ioBuffer = Sj110.Com.Chinese.Tokenizer.Tokenize(input.ReadToEnd());
      if (m_SimpleDictSeg == null)
      {
        try
        {
          m_SimpleDictSeg = new CSimpleDictSeg();
          m_SimpleDictSeg.DictPath = Path.Combine(Environment.CurrentDirectory, "Data") + Path.DirectorySeparatorChar;
          m_SimpleDictSeg.LoadDict();
        }
        catch (Exception e1)
        {
          m_SimpleDictSeg = null;
          throw e1;
        }
      }
  
      m_SimpleDictSeg.FilterStopWords = true;
      m_SimpleDictSeg.MatchName = true;
      ioBuffer = m_SimpleDictSeg.Segment(input.ReadToEnd());     
      
    }
  
    //DotLucene的分词器简单来说,就是实现Tokenizer的Next方法,把分解出来的每一个词构造为一个Token,因为Token是DotLucene分词的基本单位。
    public override Token Next()
    {
      position++;
      if (position < ioBuffer.Count)
      {
        length = ioBuffer[position].ToString().Length;
        start = offSet ;
        offSet += length ;
        return new Token(ioBuffer[position].ToString(), start, start + length);
      }
  
      return null;
    }
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索lucene
, private
, 分词器
, position
, using
, system
, ik analyzer分词器
, public
, lucene.net
, lucene net
, 中科院分词器
, tokenstream
, 接口分词工具c++
Lucene.net 
,以便于您获取更多的相关知识。

时间: 2024-11-03 21:42:50

使用肖波的KTDictSeg分词器 为Lucene.net服务的相关文章

Lucene 3.6.2入门(4) 中文分词器

package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.StopAnalyzer; import org.apache.lucene

Lucene 3.6.2入门(5) 自定义停用词分词器和同义词分词器

首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.toke

lucene和solr的分词器词库如何从数据库加载?求代码

问题描述 lucene和solr的分词器词库如何从数据库加载?求代码 1,由于我们加入了同义词,所以需要定义一个IK的同义词工厂类IKSynonymFilterFactory继承TokenFilterFactory类并实现ResourceLoaderAware接口和Runnable接口,并重写create方法,在solr的里使用 2,我们定义一个ISSAnalyer类继承Analyzer,并重写必要方法,方便在控制台下测试. 3,定义一个IKTokenizerFactory类继承Tokenize

跟益达学Solr5之使用IK分词器

   在Solr中该如何使用IK分词器呢,这是小伙伴们问的频率比较高的一个问题,今晚特此更新此篇博客.其实之前我在其他博客里已经使用了IK分词器,只是我没做详细说明.        在schema.xml配置中其实有很多关于分词器的配置示例,我从中摘录一段配置示例,比如: Xml代码   <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100&qu

pynlpir对多行分词-pynlpir中为什么分词器对于多行的文件不能分词

问题描述 pynlpir中为什么分词器对于多行的文件不能分词 问题是这样的:我用了中科院分词器的python版本的api,pynlpir,它可以支持对文件进行分词操作.但是对于单行的文本文件可以分词,对于多行的文本文件不能分词,这是什么情况.这是我下面的调用接口:#对文件进行分词def splitFile(sSrcFileName sDstFileName): if not nlpir.Init(nlpir.PACKAGE_DIR nlpir.UTF8_CODE None): logging.I

Lucene5学习之使用MMSeg4j分词器

     MMSeg4j是一款中文分词器,详细介绍如下:        1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用.          2.MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配.Complex 加了四

Solr配置中文分词器IKAnalyzer及增删改查调用

一.配置IKAnalyzer中文分词器 Solr 版本5.2.1 IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决 解决lucene4.0与IKAnalyzer的冲突.解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStrea

跟益达学Solr5之使用Ansj分词器

        OK,直接开门见山,不绕弯子啦!基于上篇博客,我们知道了在Solr中配置分词器有两种方式,一种是直接配置分词器类,比如: Xml代码   <fieldType name="text_ik" class="solr.TextField">                 <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />         <

跟益达学Solr5之使用MMSeg4J分词器

   要想在Sor中使用MMSeg4J分词器,首先你需要自定义一个TokenizerFactory实现类,虽然直接配置Analyzer类也可以,但那样无法配置Analyzer构造函数的参数,不够灵活,存在弊端,所以我一直都是以扩展TokenizerFactory的方式来讲解类似MMSeg4J这样的中文分词器在Solr中的使用.       MMSegTokenizerFactory类我花了3个多小时修改了源码并经过N多测试,表示已经可以使用,我主要的是针对Lucene5 API对MMSegTok