一个简单的中文分词

原创 2004年07月13日 21:04:00

 CLucene - a C++ search engine  http://sourceforge.net/projects/clucene/

    传统的全文检索都是基于数据库的,Sql Server  Oracle mysql 都提供全文检索,但这些比较大,不适合单机或小应用程序(Mysql4.0以上可以作为整合开发),Mysql也不支持中文。
    后来得知Apache有一个开源的全文检索引擎,而且应用比较广,Lucene是Apache旗下的JAVA版的全文检索引擎,性能相当出色,可惜是java版的,我一直在想有没有C或C++版的,终于有一天在http://sourceforge.net 淘到一个好东东,Clucene!CLucene是C++版的全文检索引擎,完全移植于Lucene,不过对中文支持不好,而且有很多的内存泄露,:P
    Cluene不支持中文的分词,我就写了一个简单的中文分词,大概思路就是传统的二分词法,因为中文的分词不像英文这类的语言,一遇到空格或标点就认为是一个词的结束,所以就采用二分词法,二分词法就是例如:北京市,就切成 北京 , 京市。这样一来词库就会很大,不过是一种简单的分词方法(过段时间我再介绍我对中文分词的一些思路) ,当然了,在检索时就不能输入“北京市”了,这样就检索不到,只要输入:“+北京 +京市”,就可以检索到北京市了,虽然精度不是很高,但适合简单的分词,而且不怕会漏掉某些单词。
    我照着Clucene的分词模块,做了一个ChineseTokenizer,这个模块就负责分词工作了,我把主要的函数写出来

    ChineseTokenizer.cpp:

 Token* ChineseTokenizer::next() {
 

  while(!rd.Eos())
  {
   char_t ch = rd.GetNext();
  
  
   if( isSpace((char_t)ch)!=0 )
   {
    continue;
   }
   // Read for Alpha-Nums and Chinese
   if( isAlNum((char_t)ch)!=0 )
   {
    start = rd.Column();

    return ReadChinese(ch);  
   }
  }
  return NULL;
 }

 Token* ChineseTokenizer::ReadChinese(const char_t prev)
 { 
  bool isChinese = false;
  StringBuffer str;
  str.append(prev);

  char_t ch = prev;

  if(((char_t)ch>>8)&&(char_t)ch>=0xa0)
   isChinese = true;
 
  while(!rd.Eos() && isSpace((char_t)ch)==0 )
  {
  
   ch = rd.GetNext();
  
   if(isAlNum((char_t)ch)!=0)
   {
    //是数学或英语就读到下一个空格.或下一个汉字
    //是汉字.就读下一个汉字组成词组,或读到空格或英文结束
    if(isChinese)
    {
     //汉字,并且ch是汉字
     if(((char_t)ch>>8)&&(char_t)ch>=0xa0)
     {
      // 返回上一个汉字
      str.append(ch);
      rd.UnGet();
     // wprintf(_T("[%s]"),str);
      return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::CHINESE] );
     }
     else
     {
      //是字母或数字或空格
      rd.UnGet();
     // wprintf(_T("[%s]"),str);
      return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::CHINESE] );
     }
    }
    else
    {
     //非汉字
     // ch是汉字
     if(((char_t)ch>>8)&&(char_t)ch>=0xa0)
     {
     // wprintf(_T("[%s]"),str);
      rd.UnGet();
      return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::CHINESE] );
     }
     str.append( ch );
    }   
   }

  }
 // wprintf(_T("[%s]"),str);
  return new Token(str.getBuffer(), start, rd.Column(), tokenImage[lucene::analysis::chinese::ALPHANUM] );
 }


   同时,这个中文分词不支持文件,只能支持内存流的形式,因为我用到了rd.UnGet();如果是文件的话,嘿嘿,只能回退半个字节哦 :P

嗯。先写到这里了,今天太急了,等我有空了我就把我对CLucene的改进发到上面来。

 

coursera 中计算概论的第七周 B-06作业

/* 描述 在一个字符串中找出元音字母a,e,i,o,u出现的次数。 输入 输入一行字符串(字符串中可能有空格,请用cin.getline(s,counts)方法把一行字符 串输入到字符数组s中,其中...
  • a871408893
  • a871408893
  • 2014年04月04日 15:01
  • 1604

openjudge 计算概论 字符串 4:最长单词2

4:最长单词2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式 输入 一个以'...
  • smartboysboys
  • smartboysboys
  • 2014年02月06日 09:29
  • 1100

一个简单词法分析器的C语言实现

一个简单词法分析器的C语言实现 1.1实验描述 例如:对源程序: begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,...
  • chenglinhust
  • chenglinhust
  • 2013年06月13日 14:07
  • 7384

一个简单的中文分词解决方案

中文分词是搜索引擎的关键技术之一,也是一个难点。我这里利用别人做好的一个分词工具api来实现中文分词。不敢独享:1. 准备环境 WAMP环境 CI框架 中文分词api http://api.pullw...
  • martinwangjun
  • martinwangjun
  • 2016年03月02日 22:50
  • 185

中科院开发的一个中文分词系统

  • 2010年03月09日 23:43
  • 5.64MB
  • 下载

一个不错的中文分词java程序

  • 2011年10月29日 10:52
  • 8.52MB
  • 下载

一个免费的中文分词组件

  • 2008年10月31日 17:47
  • 710KB
  • 下载

简单的中文分词程序(练习)

  • 2014年03月01日 11:33
  • 2.51MB
  • 下载

Delphi实现的简单中文分词.rar

  • 2009年10月17日 09:58
  • 223KB
  • 下载

7步从零开始搭建一个SOLR支持中文分词【solr3.3】

下载如下三个软件【请注意版本】 1:Solr的下载地址 http://labs.renren.com/apache-mirror//lucene/solr/3.3.0/apache-solr-...
  • yuwenruli
  • yuwenruli
  • 2012年12月24日 23:15
  • 1904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的中文分词
举报原因:
原因补充:

(最多只允许输入30个字)