2015-03-13 13 views
5

Utilizzando il codice di esempio da the boost::locale documentation, non può ottenere il seguente per tokenize correttamente il testo cinese:Utilizzando boost :: analisi locale/ICU confine con il cinese

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; 

Questa si divide in sette 中華人民共和國 caratteri distinti 中 /華/人/民/共/和/國, piuttosto che 中華/人民/共和國 come previsto. Lo documentation of ICU, su cui Boost è compilato, afferma che il cinese dovrebbe funzionare immediatamente e utilizzare un tokenizzatore basato su dizionario per suddividere correttamente le frasi. Usando l'esempio di frase di prova giapponese "生 き る か 死 ぬ か, そ れ が 問題 だ." Nel codice sopra con la locale "ja_JP.UTF-8" fa funziona, ma questa tokenizzazione non dipende da un dizionario, solo su kanji/confini kana.

Ho provato lo stesso codice direttamente in ICU come suggerito here, ma i risultati sono gli stessi.

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; 

Qualche idea di cosa sto facendo male?

risposta

1

Molto probabilmente si utilizza una versione ICU precedente alla 5.0, che è la prima versione che supporta la segmentazione della parola cinese basata su dizionario.

Inoltre, notare che boost per impostazione predefinita utilizza ICU come backend locale, quindi i risultati del mirroring.

Problemi correlati