从英文变形规则计算到Restful Api设计
一天在研究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最爱麦丽素可以得到部分已整理好的数据进一步研究。
原文链接:http://blog.tingyun.com/web/article/detail/936
从英文变形规则计算到Restful Api设计的更多相关文章
- Rest Framework简介 和 RESTful API 设计指南
使用Django Rest Framework之前我们要先知道,它是什么,能干什么用? Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Res ...
- 微服务指南走北(三):Restful API 设计简述
API的定义取决于选择的IPC通信方式,假设是消息机制(如 AMQP 或者 STOMP).API则由消息频道(channel)和消息类型.假设是使用HTTP机制,则是基于请求/响应(调用http的ur ...
- RESTful API 设计指南 (转)
RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...
- RESTFul API设计指南及使用说明
RESTFul API设计指南及使用说明 一. 协议 API与用户的通信协议,使用HTTP协议. 二. 域名 应尽量将API部署在专用域名之下(http://api.example.com) 也可以将 ...
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- RESTful API设计概要
一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...
- 我是如何根据豆瓣api来理解Restful API设计的
1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...
- RESTful API设计方法
1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...
- RESTful API设计原则与规范
RESTful API设计原则与规范 一.背景与基础概念 2 二.RESTful API应遵循的原则 3 1.协议(Protocol) 3 2.域名(ROOT URL) 3 3.版本(Versioni ...
随机推荐
- Mac OSX网络诊断命令
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 下面是一些Mac OSX下常用的网络诊断命令.它们能帮助我们发现网络问题.文中提到 ...
- 细说gulp
一.概述&安装 Gulp,简而言之,就是前端自动化开发工具,利用它,我们可以提高开发效率. 比如: 1. 压缩js 2. 压缩css 3. 压缩less 4. 压缩图片 等等… 我们完 ...
- ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)
问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- 帮公司人事MM做了个工资条拆分工具
引言 偶尔一次午饭时人事说加班加到8点多,纯手工复制粘贴Excel的内容,公司大概150多人吧,每次发工资时都需要这样手动处理,将一个Excel拆分成150多个Excel,再把里面的内容粘过去,如此循 ...
- jQuery效率提升建议
jQuery简洁通用的方法集把编码者从繁重的工作中解脱出来,也拉低了进入javascript的门槛,初学者对浏览器兼容性一无所知的情况下,几行代码就可以写出超炫的特效.网上有一篇文章转载比较泛滥,已经 ...
- react基础(1)
在 react入门系列 里面,介绍了一些react的基础知识,在react基础部分,会结合手脚架工具进行更多的总结. 关于webpack我在这里就不讲解了,有需要的小伙伴可以自己去百度一下学习资料,我 ...
- springmvc处理上传图片代码(校验图片尺寸、图片大小)
package com.maizuo.web.controller; import com.maizuo.domain.Result; import com.maizuo.util.Constants ...
- JAVA keytool 使用详解
Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据: 密钥实体 ...
- 微服务(Microservices)——Martin Flower【翻译】
原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization ) ...