使用boost::locale/ICU边界分析中文
Using boost::locale/ICU boundary analysis with Chinese
使用 the boost::locale documentation 中的示例代码,我无法获得以下内容以正确标记中文文本:
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;
此拆分 中華人民共和國 into seven distinct characters 中/華/人/民/共/和/國, rather than 中華/人民/共和國 as expected. The documentation of ICU 编译了 Boost,它声称中文应该开箱即用并使用基于字典的分词器来正确拆分短语。在上面的代码中使用示例日语测试短语“生きるか死ぬか、そレガ问题だ。”和 "ja_JP.UTF-8" 语言环境 确实 有效,但此标记化不依赖于字典,仅在 kanji/kana 边界上。
我已经按照建议直接在 ICU 中尝试了相同的代码 here,但结果是一样的。
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;
知道我做错了什么吗?
你使用的可能是5.0之前的ICU版本,这是第一个支持基于字典的中文分词的版本。
另外请注意,默认情况下,boost 使用 ICU 作为本地后端,因此会产生镜像结果。
使用 the boost::locale documentation 中的示例代码,我无法获得以下内容以正确标记中文文本:
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;
此拆分 中華人民共和國 into seven distinct characters 中/華/人/民/共/和/國, rather than 中華/人民/共和國 as expected. The documentation of ICU 编译了 Boost,它声称中文应该开箱即用并使用基于字典的分词器来正确拆分短语。在上面的代码中使用示例日语测试短语“生きるか死ぬか、そレガ问题だ。”和 "ja_JP.UTF-8" 语言环境 确实 有效,但此标记化不依赖于字典,仅在 kanji/kana 边界上。
我已经按照建议直接在 ICU 中尝试了相同的代码 here,但结果是一样的。
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;
知道我做错了什么吗?
你使用的可能是5.0之前的ICU版本,这是第一个支持基于字典的中文分词的版本。
另外请注意,默认情况下,boost 使用 ICU 作为本地后端,因此会产生镜像结果。