rime / home

Rime::Home is home to Rime users and developers
https://rime.im
4.25k stars 230 forks source link

字典中是否可以使用假名作为码表? #1296

Closed Insomnia1437 closed 1 year ago

Insomnia1437 commented 1 year ago

背景: 日语输入中有不同的罗马字对应方案, Hepburn式和训令式. 但实际使用中二者经常混用. 如Google日语输入法, macOS日语输入法, Windows IME 都是基于训令式(兼容部分Hepburn式). 比如, 日语中的 女子(じょし), 混合了Hepburn式和训令式后, 通常有四种方式输入, (zyosi, joshi josi, zyoshi).

问题: 目前大多数网络上现成的字典都是基于Hepburn式编写的, 与这些输入法的使用习惯差异较大. 所以我打算基于mozc的数据自建字典. 但如果把(zyosi, joshi josi, zyoshi)都写入字典那会造成非常多的重复.

我的设想: 一个假名字典, 用于将罗马字母转为假名. 例如: し -> si し -> shi じょ -> zyo じょ -> jo ...

一个文字字典. 在其中可以找到这串假名对应的文字 (汉字或或平假名片假名或其组合) 女子 -> じょし 女子マラソン -> じょしまらそん ...

请问这种如何实现呢? 或者不使用假名字典, 把对应关系写到在translatorpreedit_format里能实现吗?

oniondelta commented 1 year ago

字典直接用假名附註!可再用正則轉! 網友方案:https://github.com/sgalal/rime-kunyomi/blob/master/kunyomi.schema.yaml 網友方案:https://github.com/m13253/rime-nihongo-romaji/blob/master/nihongo_romaji.schema.yaml

之前用羅馬字母,碰到:

  1. 漢字中有 nya,是 にゃ 還是 んや
  2. 處理促音、拗音
  3. 外語 ティ 發 texi 也可發 thi

以上用 speller/algebra 正則轉寫,並為了區分,改寫字詞典編碼,如:`ny 和 n`y 。 用羅馬字母編日文漢字字詞典,需注意!很容易誤轉其他不該轉寫之發音!

日文輸入有個重要問題,漢字字詞切分,關係到編排 Rime 字典,影響效能。 日文漢字不像中文,全部一字一音節, 有一字一音節、一字多音節、還有一個詞(多個字)多個音節,但無法切分! Rime 字典中,字詞切分用空白間隔。

日文詞庫編碼,歸納分為:

  1. 全部不切分

如以下網友方案: https://github.com/gkovacs/rime-japanese

  1. 假名切分,漢字串不切分

如我這邊作的方案: https://github.com/oniondelta/Onion_Rime_Files/blob/main/allfiles/jpnin1.schema.yaml 部屬後生成之 .prism.bin 容量會暴大! 不用轉寫的,直接在碼表增加成兩個或以上之條目(如你所提重複寫入),則 .table.bin 容量會暴大!

  1. 假名切分,單一漢字能做切分,也作切分

之前這邊在漢字詞典只有一兩萬條目時作更細微切分,的確比不作順暢很多, 後來日文漢字詞典補充到三十八萬條目,就暫時放棄!

  1. 每個音節皆切分

⭐️ 目前看到覺得完成度最高之日語方案: 字典也重複寫入跨假名轉寫(促音除外),speller/algebra 正則再處理單假名之轉寫,感覺效果很不錯! 但不知加入重複寫入跨假名之促音效果如何?! 該方案 gga,也可輸出 っが 促音,只是 dga 等也可輸入!一般日語輸入法非如此! https://github.com/lazyfoxchan/rime-jaroomaji

另外要如市面上日文輸入法一樣,字詞頻的附加也是必要!但基準為何?也有得探討和實測!

之前關於 Rime 日文的討論: https://github.com/rime/home/issues/68

以上可參考, 與其說明怎麼作,不如直接看別人方案的內容! 且各家作法不一樣!

Insomnia1437 commented 1 year ago

感謝分享如此多的資源!!! (因爲最近剛開始使用Rime, 花了一些時間才理解您貼的內容 (。>ㅅ<。)

https://github.com/lazyfoxchan/rime-jaroomaji

這個項目就是我想要的結果, 試用之後, 除開translator裏的enable_completion不起作用之外, 已經基本滿足我的需求了.

我本準備自己寫Python腳本從mozc中轉換dict, 結果這個項目已經實現了. 我只需要再添加一些代碼轉換下這個項目https://github.com/utuhiro78/merge-ut-dictionaries 中的dict, 一個較爲可用的日語輸入法就完成了.

與其說明怎麼作,不如直接看別人方案的內容!

太對了!

oniondelta commented 1 year ago

enable_completion 一定不起作用,那是針對形碼 table_translator 用(基礎為一個字一個字出字) 日語方案如同拼音注音,多是使用 script_translator(基礎為連貫一串出字) https://github.com/LEOYoon-Tsaw/Rime_collections/blob/master/Rime_description.md#%E4%B8%89translator

script_translator 要作到 enable_completion 類似效果,可用 speller/algebra 中的 abbrev 或 derive, 但 rime-jaroomaji 方案不適用(單獨針對假名可適用),這就關於前面所提的切分,在字典中是當成字,還是詞,speller/algebra 只針對字作轉寫,無法判斷前後字,也就是整個詞,再作轉寫。

把「東京」當作字:東京---toukyou 把「東京」當作詞:東京---tou kyou 把「東京」當作詞:東京---to u kyo u

中文拼音舉例: 「電腦」當作字:電腦---diannao 「電腦」當作詞:電腦---dian nao 「電腦」當作詞:電腦---d i an n ao

第一個變化都可用 speller/algebra 轉寫,字典補碼(如:拗音促音外語等各種變化)相對較少 實作還是補一些,因要避誤轉,但比其他來說少非常多。

目前覺得最理想是第二個! 也就是前面所說 3.假名切分,單一漢字能做切分,也作切分, 但光切分判別就超費工,詞庫大就必需寫程式去判別。

第三個如果要跨假名(如:促音和拗音),基本就是字典補碼(如拗音促音的各種變化), rime-jaroomaji 促音能轉又沒有在字典補, 因為他把 っ 可能的碼都轉寫,所以才會有gga、dga、tga、pga …… 都能打出っが。

Insomnia1437 commented 1 year ago

我也覺得它對於促音的處理些許奇怪. 爲了適配如っだ (dda)這類詞, 所以直接將 d 映射爲, 導致鍵入dga 也可以打出っが.

對於切分, 抱歉, 我還是有些糊塗. 假設我們不適用羅馬字, 而使用假名編碼, 我是否可以理解爲: 倘若我們提供以下字典

一 -> いち 一 -> いっ 一 -> ひと 一つ -> ひとつ 生 -> せい 生き -> いき 生れ -> うまれ 懸 -> け 懸 -> けん 懸け -> かけ 命 -> めい 命 -> いのち 東京 -> とう きょう 一生懸命 -> いっ しょう けん めい ...

那是否相當於使用了形碼進行輸入. 輸入いっ しょう 後, 一生懸命一詞就會提前顯示? 而輸入いのちがけ後, 並不會出現命懸け的候選, 因爲字典中懸け的碼錶僅列出了かけ, 而未列出がけ. 如果字典補足がけ, 則同樣會提示對嗎?

自然, 實際使用中, 字典內詞的切分是一樁大麻煩事...

oniondelta commented 1 year ago

以假名作為字典標注,和羅馬字作字典標注,區別為羅馬字在 speller/algebra 中轉寫容易誤轉!(nya是んや還是にゃ之類) 其可實現功能沒區別!

speller/algebra 作用和 dict 內〔空格(切分)〕有關: 電腦---diao〔空〕nao 以上編碼無法設定 dia 打出「電腦」, 使用 table_translator 中的 enable_completion 也無法! 電腦---diannao 以上編碼可設定 dia 打出「電腦」, 使用 table_translator 中的 enable_completion 也可!

日語方案這邊實作感覺比中文還複雜, 心有戚戚焉,故以上說了很多心得,但感覺說太雜了!

總結開篇的問題多可用 speller/algebra 解決,但日語複雜的是拗音、促音、外語(如:ティ),因為可能會跨「空格(切分)」,跨空格 speller/algebra 無法處理。心得是 speller/algebra 和 字典補充編碼 混合解決,只是哪邊用轉寫?哪邊用字典補充?