[中文分词] SCWS 的 Emacs dynamic module

SCWS 即 Simple Chinese Word Segmentation,是一个中文分词项目,提供了 C API

我写了个简单的 Emacs Dynamic Module 支持它,以方便从 Emacs Lisp 调用:

使用举例:

(scws "简易中文分词系统")
     => ("简易" "中文" "分词" "系统")

(with-temp-buffer
  (insert "简易中文分词系统")
  (goto-char 5)
  (scws-word-at-point))
     => "分词"
5 个赞

就是词典格式是专有的比较麻烦。

挺好,就是动态模块安装起来比较麻烦,还的编译。

速度肯定比 elisp 实现要快

无耻地提个要求:

谁能比较一下这三者的效能:

  • elisp 内部实现,比如 pyim 等
  • 这个 dynamic module
  • 其它外部分词器比如 jieba
2 个赞

如果 Emacs 能直接调用操作系统/Google chrome 的分词接口就好了,不用额外安装。

1 个赞

Google Chrome 的点击取词(中文分词)貌似基于 IBM ICU 实现的:

从这个库提供的功能看起来非常有用,有时间可以看看能不能也为 Emacs 所用。

确实麻烦,或许可以利用现有的包管理器,比如 Homebrew 等,因为安装一个 Emacs module 和一般的程序过程差不多。

不过也说不定, 现在 emacs 26 window版本都集成了它依赖的东西,再集成一个编译器也比较简单。。。。

Emacs 那边只需要头文件 emacs-module.h,比较麻烦的是安装第三方库(也就是依赖)的问题,比如上面提到的 SCWS 库,这个步骤不好自动化,我觉得安装 SCWS 库比安装 emacs-scws 本身要麻烦,更不用说 SCWS 库自身也有依赖要满足。

总之,如果依赖满足的话,安装一个 Emacs module 应该可以做到像 M-x package-install 那样简单。

将这个模块随 scws 一同发布,也许也是一个办法。

有兴趣搞搞 rime 的 elisp 绑定吗 :-)

Emacs 己有 ibus 的前端了。librime 依賴太多,如果要做 dynamic modules 的话太麻煩。

如果用 dynamic module 实现 https://github.com/rime/librime/tree/master/tools 中 rime_api_console.cc 或者rime_console.cc 的功能,那就好了

我是 Chromium ICU库定制裁剪: http://blog.gclxry.com/custom-chromium-icu-library 的作者,我看Google搜索“中文分词”时发现了这个帖子。

如上所述,Google Chrome浏览器的中文分词功能是基于IBM的ICU库实现的,Chromium代码对此有很方便的封装,使用接口很简单:

BreakIterator iter(str, BreakIterator::BREAK_WORD);
if (!iter.Init())
  return false;
while (iter.Advance()) {
  if (iter.IsWord()) {
    // Region [iter.prev(), iter.pos()) contains a word.
    VLOG(1) << "word: " << iter.GetString();
  }
}

所依赖的分词词典有10MB大小,其中包括日语等语言的分词。如果仅保留中文分词数据,大概可以精简到5MB左右。

7 个赞

wow, 层主也是emacser吗?

我不是emacser

看你的这个源码当做学dynamic module 的一个小例子了,简单明了,不过为什么在字符串处理时只maollc 了内存没见free啊,不会泄漏吗