Сегментация слов с использованием ICU

Я использую ICU4C для транслитерации CJK. Я задаюсь вопросом, возможно ли иметь сегментацию слов в ICU, чтобы разбить китайский текст на последовательность слов, определенную в соответствии со стандартом сегментации слов.

Когда я пытаюсь транслитерировать, например:

直接输出html代码而不是作为函数返回值代后处理

с помощью

Transliterator* myTrans =
Transliterator::createInstance("zh-Latin",UTRANS_FORWARD, err);
UnicodeString str;
str.setTo("直接输出html代码而不是作为函数返回值代后处理");
myTrans->transliterate(str);
str.toUTF8String(st);
std::cout << st << std::endl;

Я получаю следующий вывод:

zhí jiē shū chū html dài mǎ ér bù shì zuò wèi hán shù fǎn huí zhí dài hòu chù lǐ

Кажется, что это очень хорошо, проверять онлайн-инструменты пиньинь, но моя проблема в том, что ICU транслитерует символы один за другим. Тем не менее, я ищу что-то вроде текста ниже (я не знаю китайского, так что, вероятно, текст ниже ничего не значит, но он должен продемонстрировать, какой вывод мне интересен) :

zhíjiē shūchū html dàimǎér bùshì zuò wèihán shùfǎn huízhídài hòu chùlǐ

мне говорили что ICU 50 способен сегментировать слова, но я не смог найти ни документа на их веб-странице, ни в Интернете. Хотели бы узнать, работал ли кто-нибудь из вас с сегментацией слов в ICU, или знаете, как это сделать, или у вас есть какая-нибудь хорошая ссылка о том, как это сделать.

0

Решение

«Итератор на основе словаря» — это не другой API. Просто создайте итератор разрыва слова ICU с соответствующим идентификатором локали.

В icu / source / samples / break есть пример C / C ++, который поставляется с ICU

Также следующий пример кода показывает разрыв слова:
http://source.icu-project.org/repos/icu/icuapps/trunk/iucsamples/c/s24_brkw/s24_brkw.cpp
http://source.icu-project.org/repos/icu/icuapps/trunk/iucsamples/c/s23_brki/

наверное как то так:

  BreakIterator *wordIterator = BreakIterator::createWordInstance(Locale("zh"), status);
UnicodeString text = "Unicode provides a unique number for every character, no matter what the platform, no matter what the program, no matter what the language.";
wordIterator->setText(text);
int32_t breakCount = 0;
int32_t start = wordIterator->first();
for(int32_t end = wordIterator->next();
end != BreakIterator::DONE;
start = end, end = wordIterator->next())
{
breakCount++;
}
delete wordIterator;
1

Другие решения

Вот ответ, который я получил из списка рассылки ICU:

«Там совершенно новый онлайн демо в процессе также, что делает сегментацию и разбивает ваш текст следующим образом — когда выбран китайский язык. надеюсь это поможет.»

直接
输出
html
代码
而不是
作为
函数
返回
值
代
后
处理

Это решило бы мою проблему, мне нужно транслитерировать этот вывод, чтобы получить то, что я ищу.

0