• 一个基于词库的中文分词程序-ThesaurusAnalyzer

    前一段时间用lucene做一个搜索程序,找了好长时间的中文分词程序,都没找到合适的,最后自己弄了一个.现在共享出来.希望对大家有用.
          分词算法:    基于词库的正向最大匹配算法.
          分词词库用的是网上一个叫 segmenter 的分词程序使用的词库.
          地址:www.mandarintools.com/segmenter.html  

         
    这个segmenter分词程序是把文件按行读取出来,然后把一行假设为一个词,从库中匹配,如果匹配不成功,则去掉一个字,再继续匹配.这样的分词程
    序,其一,不便在lucene中使用,因为lucene的analyzer是通过Tokenizer分词的,而Tokenizer中一般是对字符流进行处
    理,每次next返回一个Token,并不是一次性把内容读取进来,处理后再返回结果.其二,按行读取会有个缺点,就是如果文本中恰好把一个词用换行符隔
    开了,这样这个词也就被切开了,没有被当作一个词处理.
       
         我的程序实现方式:把词库读进内存后构建一个词语树.树的每个节点包含一个字. 比方  中国   中国人  中华民族  中华人民共和国  几个词,构成的树的结构:
      
                     中
               国^    华
          人^        人    民
                       民       族^
                       共
                       和
                       国^

          
    懒得上传图片,所以将就着这样表示了.^表示该节点可以构成一个词.分词的过程类似于输入法的联想功能.读取一个字,然后联想,直到联想到不能为止.如果
    当前可以构成词,便返回一个Token.如果当前不能构成词语,便回溯到最近的可以构成词语的节点,返回.最差的情况就是返回第一个单字.然后从返回结果
    的下一个字重新开始联想.

          lucene自带的几个分词程序中,ChineseAnalyzer是按字分的,与StandardAnalyzer对中文的分词没有大的区别.CJKAnalyzer是按两字切分的,比较武断,并且会产生垃圾Token,影响索引大小.
     
         本分词程序的效果取决与词库.您可以用自己的词库替换程序自带的词库.词库是一个文本文件,名称为word.txt. 每一行一个词语,以#开头表示跳过改行.最后保存为UTF-8的文本.

        程序的缺陷:
            没有加入识别人名和地名的功能

    该分词的一个应用案例:http://www.cyonline.net          这个网站是我给学校做的,用lucene对pdf ,word,excel,html等多种格式的文档进行解析,索引,提供全文搜索,并实现摘要高亮.这个网站在教育网上,公网用户可能访问起来比较慢.     

          附件1为分词程序的jar包

         附件2为分词程序的源码,需要lucene-core.jar,一个比较Analyzer的测试类还需要lucene-analyzers.jar.

    注: 本文最早发表在javaeye上 http://jolestar.iteye.com/blog/58701 源码仓库几经辗转,现在在:https://github.com/jolestar/yaya-analyzer   

  • 瞻仰了一下Gavin King的风采

        收到个红帽子的邮件,说要在北京举行redhat企业版5的发布会,并且hibernate他爹--Gavin King也要来,于是申请了一张邀请函。今天早上起来,便去中山公园。上午讲关于redhat5的东西,下午参加了jboss的分会。

            下午第一场便是Gavin King讲Jboss seam.Gavin King的讲起来个性十足,有cowboy
    的风范。晚上的party上才知道他前两天骑摩托车遇到了点小事故,这还是带伤上阵。Jboss
    seam据我的理解,就是Jboss版的jsf框架。对jsf也有一些了解,有一段时间,想用jsf做一个东西,打印了1000多页的英文文档,研究了半
    个月,oracle的adf框架,apache的myface框架,都有接触,但最后还是放弃了。那东西太麻烦了,也不成熟。本来spring已经就有
    Ioc功能了,为了享受spring带来的许多好处,spring的配置文件麻烦一点还能接受。但jsf也弄了个Ioc,也整一堆bean,配来配去,太
    麻烦,还得和spring沟通。虽然暂时放弃了,但还是一直关注着jsf。前一段时间看到一个开源的jsf框架,frails,吸收了RoR
    的许多特征,消除了烦人的配置文件。感觉不错,不过还没顾上尝试。看Gavin King演示Jboss
    seam,感觉也不错,觉得也有RoR的风格。并且Jboss
    Seam能很好的和EJB,Hibernate以及Jboss的java工作流--jbpm集成。感觉这是个值得期待的东西。

           会议结束后,举行了一个Gavin King的签名售书会,Gavin King的大作--Hibernate
    实战。价格不菲,定价89元,英文版的,中文版还没出来。本来对hibernate已经比较了解了,现在一般看文档就可以了,不过还是买了本,让
    Gavin King签了个名。算是激励自己吧。Gavin
    King生于74年,长我10岁,希望我努力10年后,也能有点成果。同时感觉要好好学一下英语了,平时看书还行,但听说就有点烂了。Gavin
    King的演讲还能听听,毕竟对这方面比较了解并且有代码配合。别的就听不太懂了。尤其出来实习一段时间后,才真正明白学校时间的可贵。不过就剩最后两个
    月了。别的姑且不论,乘这点时间学学英语。

          从中山公园音乐堂出来后,顺便转了一下公园,随意穿行,不觉到了一个挺开阔的庭院里。时已傍晚,夕阳西下,几个孩子在院子里玩滑轮,笑声朗朗。坐在旁边的走廊长椅上,花香草气,扑面而来。闭上眼睛,春日的夕阳真温暖。

         明天该回校了。

  • 用ReflectionFactory实现不调用构造参数创建对象

      那天在sun的论坛上漂着,不经意发现了一篇帖子,大概意思是想构造一个对象,但又不想或不能调用其构造方法.我把代码整理了一下,如下:

     

     

    //Test.java
     import java.io.Serializable;
    
    public class Test implements Serializable {
         private Test() {
             System.out.println("Test");
         }
         public void say()
         {
           System.out.println("Hello!");
         }
    
     }
    

     

     

     

    //Main.java
     import java.lang.reflect.Constructor;
     import java.security.AccessController;
     import sun.reflect.ReflectionFactory;
    
    public class Main {
        private static final ReflectionFactory reflectionFactory = (ReflectionFactory) AccessController
                 .doPrivileged(new ReflectionFactory.GetReflectionFactoryAction());
    
         public static void main(String[] args) throws Exception {
            Constructor constr = reflectionFactory  
                     .newConstructorForSerialization(Test.class, Object.class
                            .getConstructor(new Class[0]));
             Test test = (Test) constr.newInstance(new Object[0]);
            test.say();
        }
     }
    

     

     

       由于Test类的构造方法是private的,因此在Main类中无法调用其构造方法创建对象.用ReflectionFactory可以给Test类动态创建一个构造方法,然后调用这个构造方法的newInstance方法创建对象.运行后我们可以发现,屏幕上打印出了”Hello”,但并没有打印出 “Test”.说明Test的原来的构造方法确实没被调用.     是不是挺有意思的?
        然后用eclipse查看了一下ReflectionFactory类中的方法,发现有许多有意思的方法.如:
    newField,newMethod,等等.但不知道参数具体是什么意思.但在google上,搜了半天,终于还是没有找到sun.reflect这个类库的api,或者相关说明.实在搞不明白,sun搞出来这么个类库,并且和java核心类库放在一起,但没有任何说明,不知道是让谁用的.

  • 北京的风

        来北京这段时间里,别的不说,对北京的风感觉尤为深刻.堪与家乡的风媲烈.我家在西北沙漠边上,刮起风来飞沙走石,天昏地暗,绝不夸张.但北京的风也逊色不到哪儿,只是沙尘少点.但这边的风,在高楼之间迂回穿梭,来回碰撞,寻找出口,一旦找到缝隙,冲将出来,迎风而行的人都得拼命顶着,弄不好就被刮了回来.记得小自然课上学过风级的口决,好像说,七级迎风路难行.估计三四级的风被这些高楼构成的鼓风机一加工,也七级以上了.

         
    刚来北京没几天,就遇到了这样的风.租的宿舍窗户不严实,风从缝隙中吹进来,正对床头,趟在床上点烟都点不着.无奈之下开始想办法.最后在床下角落里发现了一个窗帘,翻腾出来.窗户上面挂窗帘的那个铁杆坏了,没有办法固定.又找不到工具.最后拿了一个饮料瓶硬是把它挤在里面.不过从此再没敢动过窗帘.这样,风才稍缓了缓.不过同学过来看见后,都笑我在窗户上挂个尿布干什么.也难怪,那东西在床下放了不知道多久,皱皱巴巴不说,颜色也泛黄.

        
    那天半夜做了个恶梦,好不容易从梦中挣扎出来,还没缓过劲来,只听见门外客厅里蟋蟋碎碎作响,如脚步,似人语,心里一整紧张,然后吱呀一声,我的这间卧室门开了.惊得忙起身坐了起来,半天才明白是风在捣鬼.原来是风从厨房那边的窗户缝穿进来,进过客厅,吹开了我的卧室门.主要原因还是我的这间卧室的门锁坏了.

  • 在北京找不着北

    转眼间,来北京已经两个月了。2006年的最后一天我到了北京,希望在新的一年里开始新的生活。记得刚到北京时,正好遇到北京冬天的第一场雪。我懵懵懂懂,不知道从西站的哪个门里出来了,应该是最烂的一个门。我站在门外,开始打量这个陌生的城市。门外的雪化了,被搅拌成肮脏的雪水,浸湿了我的鞋子。给同学打电话,让他来接我。他问我在哪个门,我说不知道。天上一颗星星都没有,我怎么找着北?  

    上班后在网上漂来漂去,一直想找个博客,想记点什么。门户网的博客,不喜欢,想找个技术站点。csdn上开了一个,但那个博客问题太多,动辄坏掉,放弃。

    找来找去,家没安顿好,不过看了不少博客。记得一个外国人的中文博客,博客标题叫在北京找不着北,当时感觉这个题目很适合现在的我,于是心里一直积攒着,等家安顿好后,一定也要写这么一篇博客。现在基本算是在javaeye安家落户了,今天才得到点空开始动笔。

    用一个网友的话,我基本上属于『路痴』,不过我的经典理论是,像我这样的人对一个地方会永远保持新鲜感,因为你会老感觉这个地方好像没来过。两个月里,基本哪儿都没去过。每天坐地铁从宿舍到公司,再坐地铁回来。虽然只有两站地铁路,但还是没敢尝试过其他途径。最多周末坐地铁到中关村那边去找同学。日子就这样像地铁一样按部就班的前进着,很少发生点事故什么的。唯有一次在地铁上突然有人叫卖报纸,说特大新闻,刘德华被刺杀了。想到一个好友是刘德华的忠实funs,所以赶忙买了份,两元。打开看了新闻,连忙再看时间,才发现这个报纸竟然没有时间。抬头搜寻,卖报的早不知道哪儿去了。这个事情被朋友们嘲笑了好几天。

    在去中关村的路上来来回回也好多次了,每次都要从天安门经过。但一直没顾上下车看看这个小学一年级时就学到的地方,直到大年三十那天晚上。那天本来兴冲冲跑去是看烟花的,结果说天安门前不放烟花。失望之余,环顾四周,看着这个熟悉又陌生的地方。天安门前的广场马被路切得一点也没有想象中的『广场』的气派,令人甚是失落。长久以来,一直和电脑,程序打交道,看的书也多是电脑书籍,发现情感已经几近麻木。本来想我这么个农村娃,第一次来北京,看到天安门,多少历史事件发生的天安门,总应该产生些感慨什么的,再激动一下,说不定就能赋诗一首,怀怀古或者颂颂今。呆了半天,还没什么感觉。于是回宿舍。在北京的年,也是我第一个在他乡的年,就这么开始了。幸好有个同学年前来北京,准备年后在这边实习,所以还不至于大年三十独守空房。      
    到宿舍,才发现这边的小区里烟花已经放得如日中天。一点也不夸张,烟花映得地上惨白惨白。还有那放『雷管』的—-我把那种两响的大炮称之为雷管 ,一声炮响,整个小区的楼都在那儿发抖,挑逗得小区下面的所有的汽车都呜呜呜警报生响个不停。再加上爆炸声在楼与楼之间碰撞回荡,呆在宿舍里与同学互相聊天都得大喊。之后的数天里,我每天晚上都得承受这种痛苦。这才发现在这种城市,过年禁烟花确实是个利国利民的好政策。记得叔本华先生在自己的文章里曾经对在街道里赶马车扬响鞭的马车夫痛责批评,乃至诅咒,说是无法忍受那种尖锐的声响。但不知道如果生在此时此地,会作何感想。

    新的一年开始了。写这句话的时候心里感觉老别扭。这种两套日历纪年法,每年的元旦到春节这段时间,总不知道算到哪一年里好。对人说明年如何如何,总会产生歧义。时间是没有标志的,人们只能从空间的变化来感知时间,想起来感觉是如此渺渺。

  • java编程奇怪错误收集

    1.org.xml.sax.SAXParseException: The processing instruction target matching “[xX][mM][lL]“

         一般是xml文件头部出现空格或者空行导致.

    2.tomcat安装后,examples等context无法启动,报以下错误.
    SEVERE: Error configuring application listener of class listeners.ContextListener
    java.lang.ClassFormatError: Extra bytes at the end of class file listeners/ContextListener

    这个是tomcat5.5 的 windows 安装文件的bug.下载zip格式的文件,解压后用复制其中的webapps目录覆盖当前的webapps目录即可.

subscribe via RSS