2015-03-13 17 views
5

Sử dụng mã mẫu từ the boost::locale documentation, tôi không thể nhận được như sau tokenize đúng văn bản Trung Quốc:Sử dụng boost :: phân tích ngôn ngữ/ICU ranh giới với Trung Quốc

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; 

này chia 中華人民共和國 vào bảy ký tự riêng biệt 中 /華/人/民/共/和/國, thay vì 中華/人民/共和國 như mong đợi. Các documentation of ICU, mà Boost được biên soạn chống lại, tuyên bố rằng Trung Quốc nên làm việc ra khỏi hộp và sử dụng một từ điển tokenizer để chia cụm từ một cách chính xác. Sử dụng ví dụ cụm từ kiểm tra tiếng Nhật "生 き る が 問題 だ in" trong mã ở trên với miền địa phương "ja_JP.UTF-8" không hoạt động, nhưng mã thông báo này không phụ thuộc vào từ điển, chỉ trên chữ kanji/ranh giới kana.

Tôi đã thử cùng một mã trực tiếp trong ICU theo đề xuất here, nhưng kết quả giống nhau.

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; 

Bất kỳ ý tưởng nào tôi đang làm sai?

Trả lời

1

Bạn rất có thể sử dụng phiên bản ICU trước 5.0, đây là phiên bản đầu tiên hỗ trợ phân đoạn từ tiếng Trung dựa trên từ điển.

Ngoài ra, lưu ý rằng tăng theo mặc định sử dụng ICU làm phụ trợ cục bộ, do đó kết quả phản chiếu.

Các vấn đề liên quan