Как транслитерировать китайские иероглифы в Чжуинь (на Java)

Как преобразовать китайские традиционные или упрощенные символы в фонетическое обозначение Чжуинь?

Пример

# simplified
没关系 --> ㄇㄟˊㄍㄨㄢㄒㄧ

# traditional
沒關係 --> ㄇㄟˊㄍㄨㄢㄒㄧ

person ccpizza    schedule 06.12.2019    source источник
comment
Я написал подробный ответ об этом и о том, как вы можете преобразовать транслитерацию с одного языка на другой с помощью хэш-карты. Посмотри, может тебе поможет :). stackoverflow.com/questions/19511512/   -  person Jay Dangar    schedule 06.12.2019
comment
@Jay: значит, для этого нет настоящего «алгоритма», верно? Просто нужно найти установленную и проверенную таблицу переводов и все, нет?   -  person ccpizza    schedule 06.12.2019
comment
Это алгоритм, просто используйте hashmap, и все готово. Занимает O(1) времени, что технически соответствует 1 микросекунде. Так что да, это просто написать правильную хеш-таблицу и использовать ее. Вы также можете использовать более быструю технику, если хотите, и также сообщите мне, если найдете ее. :)   -  person Jay Dangar    schedule 06.12.2019
comment
@NathanHughes: я полагаю, мы должны пометить их как синонимы. Но для этого нужно будет получить достаточно голосов: stackoverflow.com/tags/synonyms. Кто-то с достаточной репутацией для тега может отправить предложение синонима: stackoverflow.com/tags/bopomofo/synonyms   -  person ccpizza    schedule 21.05.2020
comment
@ccpizza: поскольку это единственный вопрос с тегом bopomofo, и вы единственный человек, который ответил на этот вопрос, это будет трудно найти кого-то с большим числом представителей этого тега, чтобы предложить синоним ;-)   -  person jps    schedule 20.07.2020
comment
на данный момент — да; но это может измениться в будущем   -  person ccpizza    schedule 20.07.2020


Ответы (1)


Путь Python

Модуль dragonmapper выполняет преобразование ханзи в чжуинь (внутренне он преобразует сначала в пиньинь, а затем в чжуинь):

# install dependencies: pip install dragonmapper

from dragonmapper import hanzi

hanzi.to_zhuyin('太阳')
>>> 'ㄊㄞˋ ㄧㄤ˙'

Путь Java

Общий подход заключается в следующем:

  1. конвертировать китайский текст (упрощенный или традиционный) в пиньинь с помощью pinyin4j (java), pypinyin (python) и т. д.
  2. Разметьте пронумерованный пиньинь с помощью регулярного выражения, созданного в соответствии с этой логикой (сгенерировано финальное регулярное выражение).
  3. Замените токены пиньинь на чжуинь, используя задокументированные сопоставления, такие как http://www.pinyin.info/romanization/bopomofo/basic.html или https://terpconnect.umd.edu/%7Ensw/chinese/pinyin.htm.

Возможный сценарий для шага №1:

Java code
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setToneType(HanyuPinyinToneType.WITH_TONE_NUMBER);
outputFormat.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(chineseText, outputFormat);
Python code
from pypinyin import pinyin

hanzi_text = '當然可以'
pinyin_text = ' '.join([seg[0] for seg in pinyin(hanzi_text)])
print(pinyin_text)

Сценарий для шага №2:

Если вы создали список сегментов пиньинь на шаге №1, теперь вы можете разбить пиньинь на сегменты и заменить их с помощью карты, такой как вот этот или вот этот (в JS-формат).

Альтернативный подход

Другим решением может быть сопоставление китайских иероглифов напрямую с чжуинь с использованием любого из доступных сопоставлений, таких как это: https://github.com/osfans/rime-tool/blob/master/data/y/taiwan.dict.yaml. Недостатком является то, что (с этим конкретным источником) он будет обрабатывать только упрощенный китайский, но не будет обрабатывать традиционные символы.

ОБНОВЛЕНИЕ. Сопоставление из проекта libchewing охватывает как упрощенные, так и традиционные символы (плюс данные о частоте и особые случаи для нескольких символов): https://github.com/chewing/libchewing/blob/master/data/tsi.src ( 4,9 МБ). Чтобы иметь возможность обрабатывать сегменты, вы, вероятно, также захотите найти достойную китайскую библиотеку сегментации, такую ​​​​как jieba (python), jieba-analysis (java) и т. д.

person ccpizza    schedule 12.01.2020