2015-03-13 32 views
5

Korzystanie z przykładowego kodu z the boost::locale documentation, nie mogę uzyskać następujące poprawnie tokenize tekst chiński:Korzystanie boost :: analizy granicznej locale/ICU z chińskim

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; 

Dzieli 中華人民共和國 na siedem odrębnych znaków 中 /華/人/民/共/和/國, zamiast 中華/人民/共和國 zgodnie z oczekiwaniami. The documentation of ICU, na którym kompiluje się Boost, twierdzi, że chiński powinien działać po wyjęciu z pudełka i użyć słownika na bazie słownika, aby poprawnie podzielić frazy. Na przykładowym japońskim teście "生 き る か 死 ぬ か, そ れ が 問題 だ." W powyższym kodzie za pomocą "ja_JP.UTF-8" locale działa, ale tokenizacja nie zależy od słownika, tylko w kanji/granice kana.

Próbowałem tego samego kodu bezpośrednio w ICU, jak sugeruje here, ale wyniki są takie same.

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; 

Każdy pomysł, co robię źle?

Odpowiedz

1

Najprawdopodobniej używasz wersji ICU przed 5.0, która jest pierwszą wersją obsługującą słownikową chińską segmentację słów.

Należy również pamiętać, że domyślnie funkcja boost używa ICU jako lokalnego backendu, stąd wyniki dublowania.