從英文變形規則計算到Restful Api設計
原文出自【聽雲技術部落格】: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方法分別可以做到單詞的複數化和單數化。程式碼長這樣
哇~~好厲害!!全都是正則啊!我覺得抱到了大腿,不過看起來規則不是很多啊,本寶寶不信!我要測一下你的正確率!wikipedia的單複數規則轉換頁面上隨便找了點。收集了100個左右,然後就是用函式把單數轉成複數然後對比是不是正確,抱歉這部分我忘記截圖了,大噶70%左右正確,果不其然還是有缺陷啊,看看別人的。找到一個MIT license的在這裡
雖然規則長得不一樣,但是原理都差不多,先去特殊規則的Map中尋找對應的複數單詞,如果沒有再從上往下遍歷正則,沒有的話就+1s吧。同樣我又測了一下,也沒有提高多少準確率,到了75%的樣子。
如果有一天我遇到了他們,問到他們是怎麼算出正則的而他們回答靠經驗,我一定會把程式碼吃了,感覺這些明顯是計算出來的,之前在quora上看過Anders Kaseorg的程式碼,計算能被7整除的字串的正規表示式!簡直逆天,長的不要不要的,既然是校友,估計也是算出來的。咳咳,請忽略MIT後面的縮寫。
話說回來,他們怎麼找到的規則?先試試看,沒有找到牛津官方的詞典,找到一份21 世紀英漢雙語詞典。解析後得到17萬個變形和不變形的單詞及其解釋。
最開始找到所有解釋中帶有pl標記的單詞,做單複數對映,由於有些不常見的詞彙的解釋並不完整,不會加標記進行說明,只得到1000個對映對。既然不確定原型是否有變形,那變形是一定有原型的。這裡說明一下,原型和變形只按字典中的字串計算,並不代表詞根,例如,employees對應的原型是employee,employers對應的原型是employer。去掉短語和單複數同形的單詞得到變形數量分佈如下
因為大部分詞彙的詞性並不單一,因此你會發現很多詞既有複數又有過去式又有過去分詞,其中擁有10個變形的單詞是trammel
['trameled', 'trameling', 'tramelled', 'tramelling', 'tramels', 'trammeled', 'trammeling', 'trammelled', 'trammelling', 'trammels']
-_-#你們太會玩了啊,加個l多一倍。
再對這種變化規則統計,得到
其中~表示在原形的基礎上新增,-表示在原形末尾尋找共同的字串然後替換,例如,-ff=>ves 2:flagstaff ,就表示flagstaff要變成flagstaves。然後你就發現,不僅單複數規則被統計了出來,連形容詞比較級最高階都出來了,哈哈哈意外收穫。
有一個比較有意思的地方就是,我從來都不知道原來複數還可以比原型短,比如這些醫學和化學專業的詞-um=>a 276
其他有意思的地方,哦不,其他比較坑爹的地方已經讓我完全顛覆了以前對英語的三觀,有些詞毫無規律可言!前方高能~
- 多複數形式
- 組合名詞的第二個詞轉複數形式
- 組合名詞的第一個詞轉複數形式
- 組合名詞的哪轉複數都行形式
- 組合名詞的兩邊都得轉複數形式
再找個例子,問:foot的複數是啥?feet~~好簡單的樣子。見過這個嘛?
這種按意思換複數的形式真的是防不勝防。
還有按國別換複數的
Kronor和kronur都是krona的複數,然而,瑞典用前面的,冰島用後面的,我也不知道為啥、
最後,記得少讀書多看報,多背單詞多睡覺。
最後的最後,私信知乎ID最愛麥麗素可以得到部分已整理好的資料進一步研究。
相關文章
- RESTful API 設計規範RESTAPI
- Restful API 的設計規範RESTAPI
- 好RESTful API的設計原則RESTAPI
- restful api設計指南RESTAPI
- 理解RESTful Api設計RESTAPI
- RESTful API 設計指南RESTAPI
- RESTFUL API 安全設計指南RESTAPI
- RestFul Api 設計 之 URLRESTAPI
- RESTful API 設計指南【轉】RESTAPI
- 改變遊戲規則的 API 設計審查的5個技巧遊戲API
- 如何更好的設計 RESTful APIRESTAPI
- 如何更好的設計RESTful APIRESTAPI
- 從雲端計算到函式計算函式
- GitHub 的 Restful HTTP API 設計分解GithubRESTHTTPAPI
- RESTful API 設計思路及實踐RESTAPI
- RESTful API 設計指南——最佳實踐RESTAPI
- 程式設計規則程式設計
- restful介面設計規範總結REST
- RESTful 介面設計規範 筆記REST筆記
- JavaScript API 設計原則JavaScriptAPI
- 關於 RESTful API 設計的總結RESTAPI
- Django RESTful API設計與實踐指南DjangoRESTAPI
- 從雲端計算到容器到容器雲
- 從函式計算到 Serverless 架構函式Server架構
- JAVA程式設計規則:Java程式設計
- Java程式設計規則Java程式設計
- 跟著 Github 學習 Restful HTTP API 設計GithubRESTHTTPAPI
- 關於restful 查詢API設計問題RESTAPI
- Swift 官方 API 設計準則SwiftAPI
- JavaScript 的 API 設計原則JavaScriptAPI
- API 介面設計規範API
- 從分散式計算到分散式訓練分散式
- 解讀:從全球雲端計算到阿里雲端計算阿里
- restFul介面設計規範[僅供參考]REST
- 討論下 RESTful 風格 API 的路由設計RESTAPI路由
- RESTful & “優雅的”API 響應結構設計RESTAPI
- restful api設計中的冪等性的理解。RESTAPI
- JavaScript API 設計原則詳解JavaScriptAPI