使用boost :: locale/ICU边界分析与中文

Uri*_*nta 6 c++ boost icu boost-locale chinese-locale

使用boost :: locale文档中的示例代码,我无法获得以下内容以正确地标记中文文本:

using namespace boost::locale::boundary;
boost::locale::generator gen;
std::string text="???????";
ssegment_index map(word,text.begin(),text.end(),gen("zh_CN.UTF-8")); 
for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
    std::cout <<"\""<< * it << "\", ";
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)

这将中华人民共和国分为七个不同的角色中/华/人/民/共/和/国,而不是中华/人民/共和国.在ICU的文档,这增大对编译声称,中国应努力开箱,并使用基于字典的分词器正确分割短语.在上面的代码中使用"ja_JP.UTF-8"语言环境的示例日语测试短语"生きるか死ぬか,それが问题だ." 确实有效,但此标记化不依赖于字典,仅在汉字/假名上边界.

我在这里建议直接在ICU中尝试相同的代码,但结果是一样的.

UnicodeString text = "???????";
UErrorCode status = U_ZERO_ERROR;
BreakIterator* bi = BreakIterator::createWordInstance(Locale::getChinese(), status);
bi->setText(text);
int32_t p = bi->first();
while (p != BreakIterator::DONE) {
    printf("Boundary at position %d\n", p);
    p = bi->next();
}
delete bi;
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

and*_*231 1

您很可能使用 5.0 之前的 ICU 版本,这是第一个支持基于字典的中文分词的版本。

另请注意,boost 默认情况下使用 ICU 作为本地后端,因此会产生镜像结果。