中文分词程序源代码--DartSplitter

前几天因为好久没发blog了,就拿我毕设中的一段算法凑数,没想到引起很多人的兴趣。因此就把我的分词算法单独拎出来做了一个项目叫作DartSplitter。暂时把分词算法的名称叫做树状词库分词法。

 

刚刚统计了一下源代码,一共也就950多行代码,加上测试用例共1200行代码。看来确实还是想法比实现重要。说明如下:

1、由于不能用原来的专业词库,因此我特地去网上找了个Access的词库,一共有一万条记录左右,还有很多单字,因此分词的效果不会太理想。不过我这里只是为了演示一下功能,幸好从数据库转成我现的词库并不复杂,我的演示程序里提供了例子,后面还会有说明。而且,真正好的词库可能还要加入机器学习等功能,真正全面的分词可能还需要将基于词库的分词与无意义的分词结合,不过这些功能都不是那么简单的啦。

2、由于测试对词库的依赖性太强了,因此我的测试用例里没有用太多的assert,只是简单地log一下结果。而且考虑到大家用TestNG的还比较少,因此我把测试用例都改成JUnit了。测试用例与外部资源的依赖一直是困扰着我的问题,不知大家有何良策?

3、由于我现在写程序已经对Spring产生依赖症了,因此虽然我希望我程序依赖的包越少越好,但还是用了Spring,这样的好处是所有接口与关联都是可配置的。因此如果要替换掉某一部分实现也会比较简单,例如从关系数据库的词库取词的接口肯定是要重写,只要配置文件里修改一行就可以了,这个在后面说明。

4、为了方便大家使用我特意写了示例splitterTest,里面提供了两个main,一个是建词库(DictSerializationMain),另一个是对一篇文章的analysis(AnalysisTest),用了SimpleAnalyzer,StandardAnalyzer和我的TreeDictAnalyzer进行对比。

5、系统在设计的时候就是与lucene紧耦合,分词的单位也是lucene中token。这是通用性与效率平衡的结果,最后我选择了效率,而且毕竟lucene是大家用得最多的全文检索引擎包。

下面讲一下使用说明:

1、如果不需要修改源代码的话,只要下载dartsplitter-0.3.jar就可以了。

2、需要在新建项目的source的etc下放入以下配置文件(示例项目里都有,只要copy就行了):dartSplitter.properties, dictJdbc.properties, dartSplitterContext.xml。

dartSplitter.properties的大概内容如下:

splitter.dictDir=f:/WebDict (指定了词典的路径,主要用于lazy load,目前还没用到)

splitter.dictFile=f:/WebDict/common.dict (词典的文件名,只要将词典文件与配置对就行了)

splitter.maxWordLength=20 (放入词库的最大词长,load之后相当于树的高度)

演示的字典文件名位于dict文件夹下:common.dict。 commonDict.mdb则是当时找来的access文件。

dictJdbc.properties的内容如下:

dict.jdbc.driverClassName=sun.jdbc.odbc.JdbcOdbcDriver

dict.jdbc.url=jdbc:odbc:commonDict

dict.jdbc.username=

dict.jdbc.password=


其实就是词库文件对应的

dartSplitterContext.xml是Spring的配置文件,除了建词库时访问关系数据库的DAO配置要改动外,其它都不要去动。

3、建自己的词库

A、自己implements一下DictDAO接口,提供自己的实现,DictDAO的接口定义很简单,只要实现两个方法就行了,可参考CommonDictDAO的实现:

public interface DictDAO {

/**

* @param strPrefix 词的首个字

* @return 以这个字为首字的词对象(@see cn.edu.zju.dartsplitter.data.DictValue)的列表

*/

public List<DictValue> getDictValues(String strPrefix);


/**

* @return 词库中所有词的首字列表

*/

public List<String> getAllPrefixes();

}

B、修改dartSplitterContext.xml的配置:

<bean id="dictTree" class="cn.edu.zju.dartsplitter.impl.DictTreeImpl">

<property name="rebuild"><value>false</value></property>

<property name="maxWordLength"><value>${splitter.maxWordLength}</value></property>

<property name="fileName"><value>${splitter.dictFile}</value></property>

<property name="dictDAOList">

<list>

<ref local="commonDictDAO "/>

</list>

</property>

</bean>

只要在以下这段里将替换commonDictDAO为自己的DAO就行了,也可以加入新的DAO,因为我们考虑到有多个数据来源的情况,因此可以把多个DAO实现一起放入List里。

C、执行一下包里或者示例程序里的DictSerializationMain就OK了

最后感谢要一下blueGuitar,如果没有当时与他讨论时的灵感,就不会有现在的算法。还要谢谢车东,是他引导我使我对中文分词感兴趣的。

以下是项目的地址: http://ccnt.zju.edu.cn/projects/DartSplitter

我的blog地址: http://blog.itpub.net/xiecc 

Jdbc链接啦。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyz3051/archive/2008/01/11/2038577.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyz3051/archive/2008/01/11/2038577.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyz3051/archive/2008/01/11/2038577.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文分词是将中文文本按照一定的规则拆分成词语的过程,是中文自然语言处理的重要基础任务之一。C语言是一种高级计算机编程语言,广泛应用于软件开发领域,结合C语言编写中文分词源代码能够实现对中文文本进行分词处理。 中文分词源代码可以采用C语言编写,可以基于一些常用的算法和数据结构来实现。比如,可以使用正向最大匹配算法(Forward Maximum Match, FMM)或逆向最大匹配算法(Backward Maximum Match, BMM)来实现基于词典的分词。这些算法的基本思想是从文本的起始位置或末尾位置开始,根据词典进行最大长度匹配,不断向前或向后移动,直至将整个文本拆分成一系列词语。 基于C语言编写的中文分词源代码通常需要包含一些基础操作,比如读取文本文件、加载词典、进行字符串匹配和输出分词结果等。代码的实现需要注意处理中文字符的编码问题,可以使用Unicode编码或UTF-8编码来表示中文字符。 对于中文分词算法的优化处理,还可以考虑利用动态规划算法、前缀树结构等方法,提高分词的效率和准确率。此外,为了提高分词的准确性,还可以加入一些特定的规则和规则集,用于处理特殊情况或领域专用词汇。 总之,中文分词是中文自然语言处理的关键任务之一,通过使用C语言编写源代码,结合合适的算法和数据结构,可以实现对中文文本进行有效的分词处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值