一天在研究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上,但是你们把名字写到代码里了。好言归正传,vendoryiisoftyii2helpersBaseInflector.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最爱麦丽素可以得到部分已整理好的数据进一步研究。