Реализация итератора разрыва в реальном времени

Меня интересует изменение данных итератора разрыва (zh), поскольку моя программа работает, когда пользователь добавляет новые слова. Это означает, что данные не могут быть изначально упакованы и должны генерироваться по ходу работы. Могу ли я использовать что-то вроде udata_setAppData или udata_setCommonData для достижения результата? Я ожидаю, что .dat для итератора прерывания будет меняться 2-3 раза в день, поэтому время загрузки не должно быть критической проблемой.

Вот псевдокод: 1. Запустить программу 2. Сгенерировать .dat-подобные данные из базы данных для итераторов прерывания 3. Загрузить в icu как zh break iterator

Если пользователь вносит изменения в базу данных 4. Удалить текущий .dat для итератора zh break 5. Восстановить данные, подобные .dat 6. Перезагрузить

Это возможно. Я думаю, что это почти возможно, если у меня есть способ заменить U_ICUDAT_BRKITR на лету.

Обновление. Кажется, чтобы это осуществить, я должен использовать код из gencmn для создания нового файла .dat.


icu
person tofutim    schedule 05.09.2013    source источник
comment
Комментарий: я думаю, что это немного окольный путь, было бы лучше запросить API для этого.   -  person Steven R. Loomis    schedule 10.09.2013


Ответы (1)


Нет API для настройки словаря.

person Steven R. Loomis    schedule 05.09.2013
comment
ты должен пройти за меня. :) Как насчет создания cjdict на лету, упаковки его в файл .dat в памяти и использования udata_setAppData. Может ли это сработать? - person tofutim; 06.09.2013
comment
Привет. Каков фактический вариант использования? На самом деле, посмотрите код для gendict - я думаю, вы могли бы подключить вывод в памяти. Сборка занимает некоторое время (менее минуты). Просто вопрос о том, что использовать в качестве API. - person Steven R. Loomis; 06.09.2013
comment
Я хочу разбить предложения на слова, но в соответствии с диктовками, которые выбирает пользователь. Кроме того, пользователь может добавлять или удалять слова из диктов. Целевая локаль — «zh». Кажется, что cjdict на самом деле никогда не проходит через gendict, поэтому я думаю, что мне просто нужно упаковать мою версию cjdict.txt, переименованную в cjdict.dict, в структуру памяти .dat и ссылаться на нее из udata_setAppData. - person tofutim; 06.09.2013
comment
Похоже, мне нужно написать gendict, затем сделать свой .dat, затем udata_setAppData. Это правильно? - person tofutim; 06.09.2013
comment
Я вижу $(INVOKE) $(TOOLBINDIR)/gendict --uchars -c -i $(BUILDDIR) $(BRKSRCDIR)/$(*F).txt $@ в файле Makefile.in в данных. Это также обрабатывает cjdict.txt? - person tofutim; 06.09.2013
comment
Внутри gendict есть комментарий для DataDict, который может захотеть поместить его где-нибудь в ICU, так как он может быть полезен снаружи. Я голосую за это. Единственное, что нужно убрать, это 'usageAndDie'. - person tofutim; 06.09.2013
comment
Стивен, у меня получилось! Я переключился на udata_setCommonData и должен был сопоставить базовое имя с icudt50l/brkitr/cjdict.dict. - person tofutim; 07.09.2013
comment
Я должен сказать... это почти работает. Это работает только в первый раз. Если я устанавливаю CommonData во второй раз, он не перезаписывает первый. - person tofutim; 07.09.2013
comment
@tofutim это, вероятно, скорее запрос на улучшение, чем обсуждение SO. Вы, вероятно, строите с готовыми данными, которые не нужно перекомпилировать .dat. замените icu/source/data на *data.zip или d/l из subversion, и gendict запустится. Подумайте, что ваш подход может привести к утечке памяти, поскольку вы продолжаете открывать новые версии. Пожалуйста, отправьте отчет об ошибке. - person Steven R. Loomis; 10.09.2013