
添加注音輸入法
flier268 opened this issue · 24 comments
由於不會拼音輸入法,但又希望在JEI內輸入中文,所以只好自己手動修改了
但我是學C#的,對Java&Forge都超級陌生
但我還是試圖做了修改
https://github.com/Towdium/JustEnoughCharacters/network
我把拼音轉unicode的表從拼音改為注音在鍵盤上的指法
由於這樣改動,分隔符號就不能繼續用原本的","了,所以我把分隔符號改"||"
但我經過測試後,這樣好像只有改到一半
例如,鑽 這個字
依照注音的指法是 yj04
但我要搜尋到鑽 只能打yj0
好像是有些簡單的詞並不在表上導致的
(我用Netbeans不知道為什麼不能Debug時中斷,所以我找原因的時候有點障礙)
我需要一點幫助,幫我看看到底是哪裡漏掉了,感謝
Pinyin4j是一个拼音库,是由别人实现的,参考这里:http://pinyin4j.sourceforge.net/
具体就是net/sourceforge/pinyin4j
包下面的所有内容
unicode_to_hanyu_pinyin.txt 是Pinyin4j提供的词库
给的连接非常有用!如果是一一对应的关系的话就不需要额外的词库了,我在载入时匹配替换就可以
核心代码难懂也是迫不得已,因为这个算法对性能要求非常严格
所以一方面用了大量的缓存,一方面又包括一些类似于正则表达式的Pattern的结构,还混有少量位运算
所以如果不熟悉的话会非常难读
这样看来实现起来应该不会很难,我会考虑在近期做成配置文件选项
你好!
这个mod目前用的是 声母+韵母 的拼写方式(不含声调)
词库和拼音读取的实现使用的是pinyin4j
初始化阶段会读入资源文件,将注音的声母和韵母分离并生成模板缓存
用于加速匹配,以及支持模糊音和其他缩写
读入yj04的时候,系统会将它分为声母y,韵母j0,声调4
但是划分的标准是按照汉语拼音的模式进行的
所以如果你的声母不是汉语拼音中的声母,可能在分离时出现问题
而且因为我们平时是不使用声调的,所以声调会被丢弃
如果你要实现的话,需要在这些问题上进行修改
其中模板生成牵涉到一些核心代码而且还有少量硬编码,阅读相当困难
而pinyin4j由于体量略大,所以阅读和修改都有些耗时
至于开发环境的话我建议用eclipse或者idea,Netbeans几乎是完全没有支持的
另外由于他是一个coremod,所以比普通mod开发的配置还要更复杂一些
不过我近期有替换pinyin4j的计划,顺利的话我应该可以顺便实现注音的兼容
想问一下你们的拼音习惯有没有缩写之类的输入方式?
比如省略韵母,省略声调或者模糊音(z->zh)之类?
pinyin4j是指unicode_to_hanyu_pinyin.txt嗎?
unicode_to_PhoneticKeyboard.txt我是自己寫個工具去做取代來修改為注音的,如果需要我可以提供程式碼
(拼音轉注因可以參照這個表做https://www.ifreesite.com/phonetic/phonetic.htm)
不知道是本來就該這麼麻煩還是你想貫徹物件導向,我在閱讀程式碼時確實很有障礙,一直在找這段程式碼是從哪裡跳過來的,一層一層一直找過去,找到要脫窗,然後又沒有中斷,只能用System.out.println來判斷死在哪裡,然後java跟C#差異又有點大,搞半天依然搞不明白
聽聞你要兼容注音,這真是個好消息,省略韻母是有的,現在手機的輸入法通常都有這個功能,只打聲母就可以找到想到的字
像是"鑽石" 可能只要打"ㄗㄕ"就可以找到
模糊音z->zh這個嘛,我是沒有障礙,但有些人確實是ㄗ(z)ㄓ(zh)不分 或ㄣ(en)ㄥ(eng)不分的,也許這會對他們是個好消息
注音跟拼音應該是差不多,只是稍微有點不一樣而已
辛苦了
你是要打zuan(拼音)嗎?如果是,應該是要打yj0
之前給你的表好像也不太對,但guw我也找不到你是怎麼得到的
Google雲端的檔案不知道你可不可以看(不確定你是否是中國地區)
https://docs.google.com/spreadsheets/d/1CvGTlMIBgDnJ4vRwHmkbftsFMME3UJREMybU_VtORaE/edit?usp=sharing
你看淺藍色的部分就好了,淺藍色是我排序後的(依照拼音的長度降冪排列),取代方法是從長的取代到短的,zuan(拼音)的注音是ㄗㄨㄢ,取代後會變成yj0(指法)
鍵盤那一欄是注音輸入法在美式鍵盤上的指法(我們都是用美式鍵盤)
順便請問一下,你知道Minecraft非MOD的小程式要去哪裡發布嗎,目前寫了兩個小程式,但不知道要發哪
我們的鍵盤長這樣,ㄕ(shi)對應的應該是按鍵g,而不會是gu,所以我才覺得奇怪,你還是按照我後面貼的那個,我已經整理好的那個做好了,前面那個乍看之下很正常,細看我就覺得很怪了
小程式是指自動更新的工具 Minecraft_updater,為開伺服器的人設計的,雖然目前基本功能有了,但進階一點的功能還沒做(讓使用者選擇小地圖版本之類的))
還有另一個 一鍵從curseforge檢查現有模組是否有更新的工具,然後一鍵下載
還有一個一鍵把模組裡面的簡體翻譯文件改為繁體的程式
这里有一个问题 我看到你们第一声是用空格输入的
但是空格已经被 jei 用作分词符号了
比如说 “cra tab” 就可以匹配 “crafting table”
搜索的内容会被首先从空格处分割成 tokens,然后分别进行匹配
也就是说目前的 jei 是不允许关键词中存在空格的
对于这个冲突有什么建议么?
目前想到三策
1.規定一聲不要打
2.依照空格出現次數,進行多次搜索(把所有可能都列出來),存到List然後去除重複的(或用字典的方式讓她不會重複),只是這樣只要出現空白就會降低效能,空白越多,就會越慢,搜索次數是(2^空白數),一般空白不會出現太多次,因為通常打幾個字就會找到要的東西了
效能究竟降低多少我就不知道了,這要試過才會知道
3.將JEI的分詞符號規則改寫,第一個空白是代表一聲,連續出現兩個空白才是分詞(依照我想的,目前的流程應該是 打字->透過拼音表轉成unicode->丟給JEI去搜尋 ,如果是這樣就更簡單了,先將兩個空白取代成別的字元,轉成unicode後再把他轉回空白,這樣就不用動到JEI了)
我覺得第三個方法應該比較好,實現應該也不難,只是雙空白這條新規則需要告知使用者,就看你想怎麼設計了
突然有種好像諸葛亮的錯覺,還分三策XD
感觉差不多了 这边发一个预览 麻烦看看有什么问题]
使用前请先把设置里的keyboard设置为1
jecharacters-1.12.0-3.0.0.zip
关于第一声的解决方法,目前的方法有点难以解释。
首先关于jei的实现,拿到搜索内容之后,jei会首先进行各种关键词分割,表达式分析
这一步用户虽然不太注意的到,实际上里边牵扯到相当多的字符串操作和一些正则表达式
在完成分析之后,搜索的字符串会被分割为多个关键词,然后从搜索树中提取相应词条
我修改的部分主要是搜索树的实现,把词条的匹配转为拼音匹配
稍微说一下这个mod的工作方式
它实际上需要在jei载入之前修改jei的二进制文件
如果jei修改了实现,修改的逻辑也要相应变动
所以任何一处修改都需要长期维护,而且这一部分作为jei的核心部分,改动的频率其实很高
也就是说目前的框架很难找到稳定的方法来修改jei的分割逻辑
不过这次用了一个有点脏的办法,但是几乎可以达到期望的效果
很重要的一点是目前的匹配机制允许声调省略
比如说要对应工作
,应该是ej/ yji4
(?)
但是当你搜索ej/ yji4
的时候,jei会先分割成ej/
和yji4
,而这两个关键词正好可以匹配工
,作
但是实际上字符的顺序会丢失,而且第一声会被忽略
也就是说ej/ yji4
实际上会匹配工作
,做工
,甚至拱作
但是目前环境下我感觉没有这么多容易混淆的词条,所以效果其实还可以
jei还有强行阻止分割的实现,就是在词条两端加引号
搜索"ej/ yji4 "
,我应该就可以接受到ej/ yji4
就是打引号有点小麻烦
的確,混淆的情況應該不多,畢竟只有一聲會出現這種可能,然後要要有能夠出現混要的另一個詞才會出問題
原來JEI還可以用引號表示,看了一下官網,好像沒有特別指出引號的用法,剛剛試了一下,直接強制加引號也是個好選擇
測試以後,發現有點問題
1.在遇到","的時候,會搜尋不到東西,我想,你的表依然是用","作為分隔符號的吧,建議換個符號當分隔符號(也許可用"||",反正表是會被處理過的,只要輸入拼音和注音時都不會用到就好了)
2.大千鍵盤模式時,建議直接在頭尾加入雙引號,增加搜尋的精準度(我搜尋終界之書的時候,因為空白鍵的關係,跑出了 終界之書、終界炸彈IV、終界炸藥、終界珍珠蓄水槽),畢竟,當輸入的是注音的時候,是會有空白出現的,也許你會考慮到這樣會不會出問題,但我測試了一下,這麼做,沒有壞處,因為,如果內容有空白該搜尋不到的還是搜尋不到,不該搜尋到的就不會搜尋到
逗号的问题是我这边逻辑错了,已经修复
强制双引号在配置文件里已经添加了(forceQuote),但是请做好日常失效的心理准备
物质是因为我们这边质是读作第四声,不过我在数据库里已经加上了
已修复 这个是我映射表的问题
稍微说一下目前的工作原理
所有发音是以汉语拼音的形式储存的,在运行时转换成不同的拼写方法
主要的逻辑可以在 里找到
首先通过PHONETIC_SPELL
这个映射转换到一个中间格式,使用汉语拼音的拼法但是用注音的音素
然后对这个格式进行分割,分离成声母,韵母和声调,并在此基础上生成模糊音列表
分割之后,通过PHONETIC_SYMBOL
和KEYBOARD_DAQIAN
转换到大千键盘上的键位
这次在PHONETIC_SPELL
中加入了put("ye", "ie");
否则按照默认的逻辑,会被分离成y
和e
,也就是ㄧㄜ
,所以出现了找不到的问题
如果没什么大问题的话我就把预览版作为alpha发布了
目前看來是沒什麼大問題了
雖然還是有少部分的字因為發音不同而搜尋不出來,但我想,可以發布alpha了
後面如果還有發現問題會回報到這裡的
額外的建議
- 建議設定檔那邊可以有一點中文提示,雖然我使用的是注音輸入法,但我依然不知道我用的就是大千鍵盤,我是察看了wiki才知道的
- 建議第一次進入遊戲的時後有個提示(也可以把語系zh_TW當作判斷條件之一),引導使用者去mod config切換到大千鍵盤
换了一套拼音数据 现在目测可以比较好的兼容台湾发音了
我对于你们用的键盘布局不是很熟悉。像你之前发的键盘照片是大千键位么?
除去大千键位以外,还有其他使用率比较高的键位么?