2015-03-13 11 views
5

the boost::locale documentation से नमूना कोड का उपयोग के साथ बढ़ावा :: भाषा/आईसीयू सीमा विश्लेषण का उपयोग करना, मैं नहीं निम्नलिखित सही ढंग से चीनी पाठ tokenize करने के लिए प्राप्त कर सकते हैं: सात अलग अक्षरों मेंचीनी

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; 

यह विभाजन 中華人民共和國 中 /華/人/民/共/和/國, बजाय 中華/人民/共和國 की अपेक्षा की जाती है। documentation of ICU, जो बूस्ट के खिलाफ संकलित किया गया है, का दावा है कि चीनी को बॉक्स से बाहर काम करना चाहिए और वाक्यांशों को सही ढंग से विभाजित करने के लिए एक शब्दकोश-आधारित टोकननाइज़र का उपयोग करना चाहिए। उदाहरण के लिए जापानी परीक्षण वाक्यांश "生 き る か 死 ぬ か, そ れ が 問題 だ।" "Ja_JP.UTF-8" लोकेल काम करता है, लेकिन यह टोकननाइजेशन एक शब्दकोश पर निर्भर नहीं है, केवल कंजी पर/काना सीमाएं।

मैंने 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; 

कोई विचार क्या मैं गलत कर रहा हूं?

उत्तर

1

आप संभवतः 5.0 से पहले एक आईसीयू संस्करण का उपयोग करते हैं, जो चीनी शब्द विभाजन के आधार पर शब्दकोश का पहला रिलीज है।

साथ ही, ध्यान दें कि आईसीयू स्थानीय बैकएंड के रूप में डिफ़ॉल्ट रूप से बढ़ावा देता है, इसलिए मिररिंग परिणाम।

संबंधित मुद्दे