jieba.el -- 在Emacs中使用jieba中文分词

那我写个基于pymacs版本的吧,看看效果怎样

话说你这个 jrpc 的版本启动時间多少?是用异步处理的?

我发現用 dynamics module 的话加載词典時间有点长。

是异步启动,加载时间我没注意测,测试的时候只有加载词典明显觉得卡。用C应该也可以异步?就是麻烦了

成了成了!

6 个赞

(ejieba-split-words "我特么社保")
;; => ["我特" "么" "社保"]

(ejieba-insert-user-word dict "特么")
;; => t

(ejieba-split-words "我特么社保")
;; => ["我" "特么" "社保"]

因为 cjieba 实現功能有限,用戶新增的词不能保存。不過可以通過编辑字典达成。

1 个赞
-*- mode: compilation; default-directory: "~/gitrepos/emacs-split-chinese-word/" -*-
Compilation started at Thu May 30 12:21:04

make -k 
gcc -Wall -c ejieba.c -I./cjieba -I.
gcc -shared -o ejieba.so ejieba.o -L./cjieba -ljieba -lstdc++ -lm
/usr/bin/ld: ./cjieba/libjieba.a(jieba.o): relocation R_X86_64_PC32 against symbol `_ZSt4cerr@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:10: ejieba.so] Error 1
make: Target 'all' not remade because of errors.

Compilation exited abnormally with code 2 at Thu May 30 12:21:04

我似乎不能编译?

照做加 -fPIC。我其实用的是 clang。和 gcc 行为不一致。

1 个赞

给你提交了个PR,submodule用HTTPS,SSH没法直接初始化

用 emacs 的 make-thread 试了下,没有明显改善。因为还要搞 lock 这种东西干脆不作了。

为什么你的ejieba在插初始化的时候只能接受五个参数 :joy: ,另外可以动态插入词典么

因为用的 C binding 只实现了这么点功能,想要多就重新写 binding。而且这个 C binding 错误处理还直接 call abort() 的,要是加载字典出现什么问题,比如格式不对 Emacs 顺带也崩了

可以在不重新启动 Emacs 不重新载入动态模块前提下重新加载字典。也可以同时存在多组不同字典。因为所谓字典就是个 DAG,jieba 没有实现有效的插入方法(有的话都可以水 paper 了),就是没有动态插入词典这一说法。所以你指的“动态插入词典”是可以的。

我还是用node和py吧 :frowning_face:

Node 版本和 C++ 实际上功能是同样的。我重写 error handling 就不会有 crash 问题。动态类型检查我是实现了的。 实际上动态模组只有 700 多 K,我觉得用 plain text stdio 性能必然受限的,更不要说语言本身就有的 overhead。

修改了下架构,以后可以方便的添加各种分词后端

1 个赞

发现一个问题: 如果光标在非中文字符处, forward-word 仍然会跳过整个句子.

Confirmed,在修了(进度0%)

我也看了一下代码,感觉不太好弄。用正则把符号跳过去吗?

Currently no idea。我自己有点少用这个,如果你有很好的移动逻辑,欢迎提出来讨论

可以判断是否是双字符宽度(

不知道 macOS 上能否使用系统级分词。