Just Enough Characters

Just Enough Characters

3M Downloads

添加注音輸入法

flier268 opened this issue · 24 comments

commented

由於不會拼音輸入法,但又希望在JEI內輸入中文,所以只好自己手動修改了

但我是學C#的,對Java&Forge都超級陌生
但我還是試圖做了修改
https://github.com/Towdium/JustEnoughCharacters/network

我把拼音轉unicode的表從拼音改為注音在鍵盤上的指法
由於這樣改動,分隔符號就不能繼續用原本的","了,所以我把分隔符號改"||"

但我經過測試後,這樣好像只有改到一半
例如,鑽 這個字
依照注音的指法是 yj04
但我要搜尋到鑽 只能打yj0

好像是有些簡單的詞並不在表上導致的

(我用Netbeans不知道為什麼不能Debug時中斷,所以我找原因的時候有點障礙)

我需要一點幫助,幫我看看到底是哪裡漏掉了,感謝

commented

Pinyin4j是一个拼音库,是由别人实现的,参考这里:http://pinyin4j.sourceforge.net/
具体就是net/sourceforge/pinyin4j包下面的所有内容
unicode_to_hanyu_pinyin.txt 是Pinyin4j提供的词库

给的连接非常有用!如果是一一对应的关系的话就不需要额外的词库了,我在载入时匹配替换就可以

核心代码难懂也是迫不得已,因为这个算法对性能要求非常严格
所以一方面用了大量的缓存,一方面又包括一些类似于正则表达式的Pattern的结构,还混有少量位运算
所以如果不熟悉的话会非常难读

这样看来实现起来应该不会很难,我会考虑在近期做成配置文件选项

commented

你好!

这个mod目前用的是 声母+韵母 的拼写方式(不含声调)
词库和拼音读取的实现使用的是pinyin4j
初始化阶段会读入资源文件,将注音的声母和韵母分离并生成模板缓存
用于加速匹配,以及支持模糊音和其他缩写

读入yj04的时候,系统会将它分为声母y,韵母j0,声调4
但是划分的标准是按照汉语拼音的模式进行的
所以如果你的声母不是汉语拼音中的声母,可能在分离时出现问题
而且因为我们平时是不使用声调的,所以声调会被丢弃
如果你要实现的话,需要在这些问题上进行修改
其中模板生成牵涉到一些核心代码而且还有少量硬编码,阅读相当困难
而pinyin4j由于体量略大,所以阅读和修改都有些耗时

至于开发环境的话我建议用eclipse或者idea,Netbeans几乎是完全没有支持的
另外由于他是一个coremod,所以比普通mod开发的配置还要更复杂一些

不过我近期有替换pinyin4j的计划,顺利的话我应该可以顺便实现注音的兼容
想问一下你们的拼音习惯有没有缩写之类的输入方式?
比如省略韵母,省略声调或者模糊音(z->zh)之类?

commented

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)不分的,也許這會對他們是個好消息

注音跟拼音應該是差不多,只是稍微有點不一樣而已

commented

有什麼新消息嗎

commented

这两天有点咸鱼...目测一个礼拜内能初步搞定

commented

emmm 进展还不错
除去音调已经基本实现了,模糊音和成分省略都能正常工作
图里给的没什么问题吧?因为我对这个输入法一无所知,所以不是很确定是否和期望的拼法一致

2018-07-04_16 50 42

commented

辛苦了
你是要打zuan(拼音)嗎?如果是,應該是要打yj0
之前給你的表好像也不太對,但guw我也找不到你是怎麼得到的
Google雲端的檔案不知道你可不可以看(不確定你是否是中國地區)
https://docs.google.com/spreadsheets/d/1CvGTlMIBgDnJ4vRwHmkbftsFMME3UJREMybU_VtORaE/edit?usp=sharing
你看淺藍色的部分就好了,淺藍色是我排序後的(依照拼音的長度降冪排列),取代方法是從長的取代到短的,zuan(拼音)的注音是ㄗㄨㄢ,取代後會變成yj0(指法)

鍵盤那一欄是注音輸入法在美式鍵盤上的指法(我們都是用美式鍵盤)

順便請問一下,你知道Minecraft非MOD的小程式要去哪裡發布嗎,目前寫了兩個小程式,但不知道要發哪

commented

这样说应该没什么问题了,我上一张 guw 想对应的是 shi-t(ou) 石头
yj0出来确实是钻石没错了

2018-07-05_06 38 06

我本人在大陆 不过绝大部分被墙的链接我都是可以正常打开的
另外你指的小程式具体是怎样的?Minecraft相关的普通程式么?
这种情况的话国外一般发 minecraft forum,国内一般发 mcbbs
但是目前看来流量是比 curseforge 差得多了

commented

image
我們的鍵盤長這樣,ㄕ(shi)對應的應該是按鍵g,而不會是gu,所以我才覺得奇怪,你還是按照我後面貼的那個,我已經整理好的那個做好了,前面那個乍看之下很正常,細看我就覺得很怪了

小程式是指自動更新的工具 Minecraft_updater,為開伺服器的人設計的,雖然目前基本功能有了,但進階一點的功能還沒做(讓使用者選擇小地圖版本之類的))

還有另一個 一鍵從curseforge檢查現有模組是否有更新的工具,然後一鍵下載

還有一個一鍵把模組裡面的簡體翻譯文件改為繁體的程式

commented

这里有一个问题 我看到你们第一声是用空格输入的
但是空格已经被 jei 用作分词符号了
比如说 “cra tab” 就可以匹配 “crafting table”

搜索的内容会被首先从空格处分割成 tokens,然后分别进行匹配
也就是说目前的 jei 是不允许关键词中存在空格的

对于这个冲突有什么建议么?

commented

目前想到三策
1.規定一聲不要打

2.依照空格出現次數,進行多次搜索(把所有可能都列出來),存到List然後去除重複的(或用字典的方式讓她不會重複),只是這樣只要出現空白就會降低效能,空白越多,就會越慢,搜索次數是(2^空白數),一般空白不會出現太多次,因為通常打幾個字就會找到要的東西了
效能究竟降低多少我就不知道了,這要試過才會知道

3.將JEI的分詞符號規則改寫,第一個空白是代表一聲,連續出現兩個空白才是分詞(依照我想的,目前的流程應該是 打字->透過拼音表轉成unicode->丟給JEI去搜尋 ,如果是這樣就更簡單了,先將兩個空白取代成別的字元,轉成unicode後再把他轉回空白,這樣就不用動到JEI了)

我覺得第三個方法應該比較好,實現應該也不難,只是雙空白這條新規則需要告知使用者,就看你想怎麼設計了

突然有種好像諸葛亮的錯覺,還分三策XD

commented

感觉差不多了 这边发一个预览 麻烦看看有什么问题]
使用前请先把设置里的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就是打引号有点小麻烦

commented

的確,混淆的情況應該不多,畢竟只有一聲會出現這種可能,然後要要有能夠出現混要的另一個詞才會出問題

原來JEI還可以用引號表示,看了一下官網,好像沒有特別指出引號的用法,剛剛試了一下,直接強制加引號也是個好選擇

測試以後,發現有點問題
1.在遇到","的時候,會搜尋不到東西,我想,你的表依然是用","作為分隔符號的吧,建議換個符號當分隔符號(也許可用"||",反正表是會被處理過的,只要輸入拼音和注音時都不會用到就好了)
2.大千鍵盤模式時,建議直接在頭尾加入雙引號,增加搜尋的精準度(我搜尋終界之書的時候,因為空白鍵的關係,跑出了 終界之書、終界炸彈IV、終界炸藥、終界珍珠蓄水槽),畢竟,當輸入的是注音的時候,是會有空白出現的,也許你會考慮到這樣會不會出問題,但我測試了一下,這麼做,沒有壞處,因為,如果內容有空白該搜尋不到的還是搜尋不到,不該搜尋到的就不會搜尋到

commented

又發現一個問題
找不到"物質"(j456)

commented

jecharacters-1.12.0-3.0.0.zip

逗号的问题是我这边逻辑错了,已经修复
强制双引号在配置文件里已经添加了(forceQuote),但是请做好日常失效的心理准备
物质是因为我们这边质是读作第四声,不过我在数据库里已经加上了

commented

腳手架(rul3g.3ru84)、鵝(k6)打不出來

commented
commented

回報
葉(u,4)打不出來,一樣是","
不知道是什麼問題呢

commented

jecharacters-1.12.0-3.0.0.zip

已修复 这个是我映射表的问题

稍微说一下目前的工作原理
所有发音是以汉语拼音的形式储存的,在运行时转换成不同的拼写方法
主要的逻辑可以在 这个文件里找到
首先通过PHONETIC_SPELL这个映射转换到一个中间格式,使用汉语拼音的拼法但是用注音的音素
然后对这个格式进行分割,分离成声母,韵母和声调,并在此基础上生成模糊音列表
分割之后,通过PHONETIC_SYMBOLKEYBOARD_DAQIAN转换到大千键盘上的键位

这次在PHONETIC_SPELL中加入了put("ye", "ie");
否则按照默认的逻辑,会被分离成ye,也就是ㄧㄜ,所以出现了找不到的问题

如果没什么大问题的话我就把预览版作为alpha发布了

commented

目前看來是沒什麼大問題了
雖然還是有少部分的字因為發音不同而搜尋不出來,但我想,可以發布alpha了

後面如果還有發現問題會回報到這裡的

額外的建議

  • 建議設定檔那邊可以有一點中文提示,雖然我使用的是注音輸入法,但我依然不知道我用的就是大千鍵盤,我是察看了wiki才知道的
  • 建議第一次進入遊戲的時後有個提示(也可以把語系zh_TW當作判斷條件之一),引導使用者去mod config切換到大千鍵盤
commented

「錫(vu6)」打不出來

commented

换了一套拼音数据 现在目测可以比较好的兼容台湾发音了

引导提示如图:
2018-08-20_14 26 22

我对于你们用的键盘布局不是很熟悉。像你之前发的键盘照片是大千键位么?
除去大千键位以外,还有其他使用率比较高的键位么?

JustEnoughCharacters-1.12.0-3.0.0.zip

commented

沒錯,那就是大千鍵位,台灣應該沒有其他種的了,就這種而已

commented

目测是没有后续了