首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>NET专区>C#语言>关于C#在lucene.net下的中文切词
关于C#在lucene.net下的中文切词
来源: 发布时间:2007-09-28 发布人: 浏览: 人次   字体: [ ]  
经过一天的研究,终于完成了C#在lucene.net下可以使用的中文切词方法。感到有些复杂,不过我还是拿下了。颇有点成就感的,发上来跟大家分享一下!

  在实现了中文切词的基础方法上,我将其封装在继承lucene的Analyzer类下

  chineseAnalzer的方法就不用多说了。

以下是引用片段:
  using System;
  using System.Collections.Generic;
  using System.Text;
  
  using Lucene.Net.Analysis;
  using Lucene.Net.Analysis.Standard;
  
  namespace Lucene.Fanswo
  {
   /**//// 
   ///
   /// 
   public class ChineseAnalyzer:Analyzer
   {
   //private System.Collections.Hashtable stopSet;
   public static readonly System.String[] CHINESE_ENGLISH_STOP_WORDS = new System.String[] { "a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", "or", "s", "such", "t", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with", "我", "我们" };
  
  
   /**//// Constructs a {@link StandardTokenizer} filtered by a {@link
   /// StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}.
   /// 
   public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
   {
   TokenStream result = new ChineseTokenizer(reader);
   result = new StandardFilter(result);
   result = new LowerCaseFilter(result);
   result = new StopFilter(result, CHINESE_ENGLISH_STOP_WORDS);
   return result;
   }
  
   }
  }
  

  ChineseTokenizer类的实现:

  这里通过词典来正向匹配字符,返回lucene下定义的token流

 

以下是引用片段:
  using System;
  using System.Collections.Generic;
  using System.Text;
  using Lucene.Net.Analysis;
  using System.Collections;
  using System.Text.RegularExpressions;
  using System.IO;
  
  namespace Lucene.Fanswo
  {
   class ChineseTokenizer : Tokenizer
   {
  
   private int offset = 0, bufferIndex = 0, dataLen = 0;//偏移量,当前字符的位置,字符长度
  
   private int start;//开始位置
   /**//// 
   /// 存在字符内容
   /// 
   private string text;
  
   /**//// 
   /// 切词所花费的时间
   /// 
   public double TextSeg_Span = 0;
  
   /**//// Constructs a tokenizer for this Reader. 
   public ChineseTokenizer(System.IO.TextReader reader)
   {
   this.input = reader;
   text = input.ReadToEnd();
   dataLen = text.Length;
   }
  
   /**//// 进行切词,返回数据流中下一个token或者数据流为空时返回null
   /// 
   ///
   public override Token Next()
   {
   Token token = null;
   WordTree tree = new WordTree();
   //读取词库
   tree.LoadDict();
   //初始化词库,为树形
   Hashtable t_chartable = WordTree.chartable;
   string ReWord = "";
   string char_s;
   start = offset;
   bufferIndex = start;
  
   while (true)
   {
   //开始位置超过字符长度退出循环
   if (start >= dataLen)
   {
   break;
   }
   //获取一个词
   char_s = text.Substring(start, 1);
   if (string.IsNullOrEmpty(char_s.Trim()))
   {
   start++;
   continue;
   }
   //字符不在字典中
   if (!t_chartable.Contains(char_s))
   {
   if (ReWord == "")
   {
   int j = start + 1;
   switch (tree.GetCharType(char_s))
   {
   case 0://中文单词
   ReWord += char_s;
   break;
   case 1://英文单词
   j = start + 1;
   while (j < dataLen)
   {
   if (tree.GetCharType(text.Substring(j, 1)) != 1)
   break;
  
   j++;
   }
   ReWord += text.Substring(start, j - offset);
  
   break;
   case 2://数字
   j = start + 1;
   while (j < dataLen)
   {
   if (tree.GetCharType(text.Substring(j, 1)) != 2)
   break;
  
   j++;
   }
   ReWord += text.Substring(start, j - offset);
  
   break;
  
   default:
   ReWord += char_s;//其他字符单词
   break;
   }
  
   offset = j;//设置取下一个词的开始位置
   }
   else
   {
   offset = start;//设置取下一个词的开始位置
   }
  
   //返回token对象
   return new Token(ReWord, bufferIndex, bufferIndex + ReWord.Length - 1);
   }
   //字符在字典中
   ReWord += char_s;
   //取得属于当前字符的词典树
   t_chartable = (Hashtable)t_chartable[char_s];
   //设置下一循环取下一个词的开始位置
   start++;
   if (start == dataLen)
   {
   offset = dataLen;
   return new Token(ReWord, bufferIndex, bufferIndex + ReWord.Length - 1);
   }
   }
   return token;
   }
  
   }
  }

  


共2页: 上一页 1 [2] 下一页
相 关 文 章   发布商链接
·关于C#程序中Bug的快速修复方法
·代码分析如何构造一个C#语言的爬虫程...
·c#中收发邮件处理代码(POP3,IMAP,...
·C#中正则表达式进行忽略大小写的字符...
·如何在C#中播放AVI短片并使背景透明...
·如何用C#读取Windows注册表中的多重...
·asp.net打造进度条窗口代码,还有取消...
·C#实现日期转换为大写代码
·C#装箱与拆箱的代码事例小解
·C#获取硬件标志代码示例
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·有助快速理解C#委托和事件之...
·C#泛型学习笔记总结
·c#语言从dbf数据库提取数据并
·C#编写控制线程的运行和线程...
·怎样在C#中删除只读文件及其...
·C#函数中返回多个值的两种方...
·如何在C#中插入照片到Excel文
·如何在c#中获取事件注册的方...
·C#对timer类的使用操作代码
·什么是泛型?泛型的一些概述
·C#如何从文本文件读取信息并...
·如何在c#中去掉字符串中的回...
·如何使用C#获取IIS服务器版本...
·什么是泛型编程思想?及其简...
·c#子线程控制进度条的一个简...
热 门 文 章
·c#中收发邮件处理代码(POP3,...
·C#如何获取文件路径中的文件...
·什么是c#深拷贝与浅拷贝及其...
·C#中关于四舍五入函数的讨论...
·c#中的ArrayList属性祥解及其...
·C#语言实现创建、删除和移动...
·快速进行List排序的通用方法...
·C#对timer类的使用操作代码
·String.Split 方法使用及其代...
·如何在c#中去掉字符串中的回...
·用C#编写ActiveX控件代码实例
·C#语言实现从XML文件导出数据...
·C#如何从文本文件读取信息并...
·浅谈接口和抽象类的区别,加...
·c#子线程控制进度条的一个简...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .