yanyiwu / cppjieba

"结巴"中文分词的C++版本
MIT License
2.61k stars 690 forks source link

utf8ToUnicode 不支持所有 Unicode 字符 #45

Closed ghost closed 8 years ago

ghost commented 9 years ago

https://github.com/yanyiwu/cppjieba/blob/aed1c8f4a6557c807c3c69e2cb9527ec18bb2fcf/src/Limonp/StringUtil.hpp#L165

爲何不直接支持 24 位的 Unicode 碼呢?

yanyiwu commented 9 years ago

因为当时考虑对于中文来说,16位的unicode码足够了,性能也更高。

ghost commented 9 years ago

刚才我用了 utf8::utf8to32,硬把位数提升,结果加载词典时直接爆内存退出了。汗……

yanyiwu commented 9 years ago

正常,因为你没有改变Unicode类型。 你的代码是哪个版本的,你可以试试改一下 Unicode的类型,从 uint16_t 改成 uint32_t

ghost commented 9 years ago

master 分支的,类型也是改好的。Trie.hpp 那个 BASE_SIZE 会受字符位数影响吗?我怀疑是那里被我乱改后溢出了。

yanyiwu commented 9 years ago

你猜对了,BASE_SIZE确实受字符位数影响,只能是 uint16_t 的最大值:65536

看来你不能使用master分支的代码了,你使用 v3.1.0 版本的代码吧,那个时候Trie树没有BASE_SIZE这回事。

还有就是建议其实对于非中文的其他偏远字符,为什么要扔进分词里面呢?

ghost commented 9 years ago

谢谢,3.1.0 果然能改好。

其实就是个人在处理一些繁体语料,总是要对特殊字符特殊处理有点麻烦。也正在和 Python 版做做比较,看哪个对繁体效果更好。感觉两个都差不多吧,不过你这个支持同一个词多个词性,Python 版的直接覆盖原有词性了。

ghost commented 9 years ago

Oh, no. 看来我刚才没看认真,你这个也不支持多词性…… :scream:

yanyiwu commented 8 years ago

之前的代码是只支持 16bit 的 unicode,最新版本 v4.5.0 开始支持 32bit 的 unicode。