试用开源分词系统SCWS

在前一段时间,使用了贵所的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);
}

Leave a Reply

Your email address will not be published. Required fields are marked *