在前一段时间,使用了贵所的ICTCLAS分词系统,总体下来有两点不太满意:
1、分词速度奇慢,分词速度勉强能达到600KB/s
2、词库拓展麻烦,不加词库则分词效果欠佳。
3、无可用的授权
其实ICTCLAS本身,在贵所内部就存在诸多争议,譬如版权之争……具体细节不方便描述了。
国内有很多人,特别是学术界很推崇ICTCLAS,大家都觉得隐马是高级算法,效果自然会很好,譬如这篇很偏激的争论帖子:
http://www.oschina.net/question/96003_19055
然而,我比较同意Google工程师的说法:More data usually beats better algorithms.
大数据+简单算法往往能完胜设计复杂的算法,无论在效果还是在性能方面。
SCWS(Simple Chinese Words Segmentation 简易中文分词系统)采用了最传统的,基于词频的机械分词算法,它的辞典更新很频繁,最新版本的辞典已经包含了28万的词汇,词库够大,标称速度可以达到1.2MB/s,最重要的是,开源,无授权问题。
由于是C开发的,看着有些繁琐,基本过程是:
(1)加载词库
(2)可选加载规则
(3)分词
(4)获得结果
#include <scws.h> #include <stdlib.h> main() { scws_t s; scws_res_t res, cur; char *text = "Hello, 我名字叫李那曲是一个中国人, 我有时买Q币来玩, 我还听说过C#语言"; if (!(s = scws_new())) { printf("error, can't init the scws_t!\n"); exit(-1); } scws_set_charset(s, "gbk"); scws_set_dict(s, "/usr/local/scws/etc/dict.xdb", SCWS_XDICT_XDB); scws_set_rule(s, "/usr/local/scws/etc/rules.ini"); scws_send_text(s, text, strlen(text)); while (res = cur = scws_get_result(s)) { while (cur != NULL) { printf("Word: %.*s/%s (IDF = %4.2f)\n", cur->len, text+cur->off, cur->attr, cur->idf); cur = cur->next; } scws_free_result(res); } scws_free(s); }