從英文變形規則計算到Restful Api設計

聽雲APM發表於2016-07-07

原文出自【聽雲技術部落格】:http://blog.tingyun.com/web/article/detail/936

一天在研究Restful API設計,命名的時候我總是很糾結,我相信大多數人也有這種感覺,不是說想不出來某個單詞怎麼寫的問題,像我這種沒事背單詞背到13000詞量的人也要糾結個幾分鐘,然後還會改來改去,雖然可以用命名字典,但是終究不是長久之計,當然你要是願意使用拼音就不要往下看了。

舉個例子,你想寫一個獲取一頁model的api,不管是真自己寫出來的還是框架自動生成,大部分也就都是這個樣子/controller/actions/argName1/argValue1/argName2/argValue2,然後actions改一改,改成information。那麼問題來了,如果後面加引數指定獲取的資訊數目,前面不動,貌似不安全啊,被人改一下引數,爬蟲一個請求就全獲取了啊!(其實可以在後臺做限制)本寶寶已經爬了幾十個頁面,不要懷疑我,真的有人這麼幹,而且數量還不少。那怎麼辦?寫倆API,一個單數一個複數,informations or information。複數的那個獲取20個如果足夠的話,單數的那個獲取1個,貌似解決了的樣子。然而大家都很懶,開玩笑?我們是程式設計師啊!寫倆API?能用程式碼解決的事情就不要費人力了啊!

碰巧,在YII2.X框架下還真找到了這麼個東西,只要寫一個單數的API然後開去複數化配置,就可以自動生成相應的複數API。感謝@Antonio Ramirez大神和@Alexander Makarov大神,雖然我不知道你倆是誰,我也不知道能不能at上,但是你們把名字寫到程式碼裡了。好言歸正傳,\vendor\yiisoft\yii2\helpers\BaseInflector.php類下的pluralize方法和singularize方法分別可以做到單詞的複數化和單數化。程式碼長這樣

1.png

2.png

哇~~好厲害!!全都是正則啊!我覺得抱到了大腿,不過看起來規則不是很多啊,本寶寶不信!我要測一下你的正確率!wikipedia的單複數規則轉換頁面上隨便找了點。收集了100個左右,然後就是用函式把單數轉成複數然後對比是不是正確,抱歉這部分我忘記截圖了,大噶70%左右正確,果不其然還是有缺陷啊,看看別人的。找到一個MIT license的在這裡

3.png

4.png

雖然規則長得不一樣,但是原理都差不多,先去特殊規則的Map中尋找對應的複數單詞,如果沒有再從上往下遍歷正則,沒有的話就+1s吧。同樣我又測了一下,也沒有提高多少準確率,到了75%的樣子。

如果有一天我遇到了他們,問到他們是怎麼算出正則的而他們回答靠經驗,我一定會把程式碼吃了,感覺這些明顯是計算出來的,之前在quora上看過Anders Kaseorg的程式碼,計算能被7整除的字串的正規表示式!簡直逆天,長的不要不要的,既然是校友,估計也是算出來的。咳咳,請忽略MIT後面的縮寫。

5.png

話說回來,他們怎麼找到的規則?先試試看,沒有找到牛津官方的詞典,找到一份21 世紀英漢雙語詞典。解析後得到17萬個變形和不變形的單詞及其解釋。

6.png

最開始找到所有解釋中帶有pl標記的單詞,做單複數對映,由於有些不常見的詞彙的解釋並不完整,不會加標記進行說明,只得到1000個對映對。既然不確定原型是否有變形,那變形是一定有原型的。這裡說明一下,原型和變形只按字典中的字串計算,並不代表詞根,例如,employees對應的原型是employee,employers對應的原型是employer。去掉短語和單複數同形的單詞得到變形數量分佈如下

7.png

因為大部分詞彙的詞性並不單一,因此你會發現很多詞既有複數又有過去式又有過去分詞,其中擁有10個變形的單詞是trammel

['trameled', 'trameling', 'tramelled', 'tramelling', 'tramels', 'trammeled', 'trammeling', 'trammelled', 'trammelling', 'trammels']

-_-#你們太會玩了啊,加個l多一倍。

再對這種變化規則統計,得到

8.png

其中~表示在原形的基礎上新增,-表示在原形末尾尋找共同的字串然後替換,例如,-ff=>ves 2:flagstaff ,就表示flagstaff要變成flagstaves。然後你就發現,不僅單複數規則被統計了出來,連形容詞比較級最高階都出來了,哈哈哈意外收穫。

有一個比較有意思的地方就是,我從來都不知道原來複數還可以比原型短,比如這些醫學和化學專業的詞-um=>a 276

QQ圖片20160705120617.jpg

其他有意思的地方,哦不,其他比較坑爹的地方已經讓我完全顛覆了以前對英語的三觀,有些詞毫無規律可言!前方高能~

  • 多複數形式

1.png

  • 組合名詞的第二個詞轉複數形式

2.png

  • 組合名詞的第一個詞轉複數形式

3.png

  • 組合名詞的哪轉複數都行形式

圖片描述

  • 組合名詞的兩邊都得轉複數形式

5.png

再找個例子,問:foot的複數是啥?feet~~好簡單的樣子。見過這個嘛?

6.png

這種按意思換複數的形式真的是防不勝防。

還有按國別換複數的

Kronor和kronur都是krona的複數,然而,瑞典用前面的,冰島用後面的,我也不知道為啥、

最後,記得少讀書多看報,多背單詞多睡覺。

最後的最後,私信知乎ID最愛麥麗素可以得到部分已整理好的資料進一步研究。

相關文章