C#汉字分词程序

来源:互联网 发布:变声软件手机版 编辑:程序博客网 时间:2024/06/04 19:36

       汉字分词有两种算法,一是正向最大匹配原则,另一个就是逆向正大匹配原则。顾名思义,正向最大与逆向最大是相反的思想,本人基于正向最大匹配与逆向最大匹配原则分别完成了汉字的分词程序,希望本人的程序对大家有所帮助。

        正向最大匹配原则即从字符串开始截取m个字符串并开始匹配,如若没有匹配则去掉最后一个字继续匹配直到匹配为止,逆向最大匹配原则即从字符串的末尾截取m 个字符串进行匹配如若没有匹配则去掉最全面的字继续匹配直到匹配为止,m为词典中最长的词汇长度。想必这些原理大家都清楚,那么咱就不啰嗦了直接切入正题。

        1、正向最大匹配

        1)对m个字符串进行匹配并返回已经匹配的字符串,应注意的是,若能够匹配,则返回的字符串必定是最开始的几个字符;

        2)整体字符串的匹配是在1)的基础之上,每次对m个字符串进行匹配,并且记录当前已经匹配的字符串以及其长度,注意,已经匹配的字符串是1)中返回的字符串的连接。如果1)返回结果为空则说明没有匹配到任何词汇则应该将当前正在匹配的字符串中第一个字划开作为一个单独的词汇。      

        2、逆向最大匹配与正向最大匹配的不同之处在于,逆向最大匹配一次返回的结果必定是当前进行匹配的字符串的最末端几个字符,当然前提是能够匹配到词典中的词汇。

        逆向最大匹配不同于正向最大匹配对整体字符串的匹配是从前往后的顺序,逆向最大匹配的方向是局部m个字符匹配是从后往前,整体匹配方向依旧是从前往后。

        3、这里要提到的是关于词典的创建,根据本人的实验结果,创建词典列表时,最好根据其词汇的开头字不同分批存储,这样匹配时的查询时间就大大的缩小了。对于5000字的分词,如果使用单一的表进行匹配其查询时间用到5分钟之久,而将词汇根据关键字不同分批存储时,正向最大匹配时间仅用了200ms多,逆向用了100ms多。

        注意:若原本要分词的字符串整体长度不大于m,直接进行匹配不用截取子字符串。

        以上是关于分词的算法思想。


        以下,是关于本人所写程序的用法:

        1、创建DictionaryCreation类词典对象:

        1)根据路径创建词汇列表

    

   List<string>  list =GetWordbaseList(strPath);


        2)根据词汇列表获取当前词汇中最长词汇长度:

      

 int m=GetM(list);


        3)根据词汇列表创建词典    

Dictionary<string,List<string>>    dic =GetDictionary(list) ;


 

        2、ForwardMM类为正向最大匹配算法:

      

 string  str = MatchStrForward(m,strSource, dic);


        m 为当前词汇列表中最长的词汇长度,strSource为要匹配的字符串,dic为词典;

 

        3、BackwardMM类为逆向最大匹配算法:

     
  string str = MatchStrBackward(m, strSource,dic);

      注意:要把DLL与XML文件放在同一目录级别,如下!!!


        程序下载地址:http://download.csdn.net/detail/u012935328/6600727       

       不用消耗积分,relax!!!