更多技术干货请戳:听云博客

一天在研究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设计的更多相关文章

  1. Rest Framework简介 和 RESTful API 设计指南

    使用Django Rest Framework之前我们要先知道,它是什么,能干什么用? Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Res ...

  2. 微服务指南走北(三):Restful API 设计简述

    API的定义取决于选择的IPC通信方式,假设是消息机制(如 AMQP 或者 STOMP).API则由消息频道(channel)和消息类型.假设是使用HTTP机制,则是基于请求/响应(调用http的ur ...

  3. RESTful API 设计指南 (转)

    RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...

  4. RESTFul API设计指南及使用说明

    RESTFul API设计指南及使用说明 一. 协议 API与用户的通信协议,使用HTTP协议. 二. 域名 应尽量将API部署在专用域名之下(http://api.example.com) 也可以将 ...

  5. RESTful API 设计指南,RESTful API 设计最佳实践

    RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...

  6. RESTful API设计概要

    一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...

  7. 我是如何根据豆瓣api来理解Restful API设计的

    1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...

  8. RESTful API设计方法

    1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...

  9. RESTful API设计原则与规范

    RESTful API设计原则与规范 一.背景与基础概念 2 二.RESTful API应遵循的原则 3 1.协议(Protocol) 3 2.域名(ROOT URL) 3 3.版本(Versioni ...

随机推荐

  1. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

    今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...

  2. ECMAScript5之Object

    在ECMAScript5中对Object新增的些方法,以前没注意的同志们,嘻嘻,下面我们再一起来边看边学. 1.Object之create Create单词意为创造嘛,作为Object的静态方法,不言 ...

  3. 安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节

    目录 前言 整体介绍 分步安装介绍 总结 一.前言        周末干了近四十个小时中间只休息了五个小时终于成功安装了ClouderaManager以及分布式集群,其中各种辛酸无以言表,唯有泪两行. ...

  4. 使用纯前端JavaScript 实现Excel IO

    公司最近要为某国企做一个**统计和管理系统, 具体要求包含 Excel导入导出 根据导入的数据进行展示报表 图表展示(包括柱状图,折线图,饼图),而且还要求要有动画效果,扁平化风格 Excel导出,并 ...

  5. Cesium原理篇:6 Renderer模块(2: Texture)

    Texture也是WebGL中重要的概念,使用起来也很简单.但有句话叫大道至简,如果真的想要用好纹理,里面的水其实也是很深的.下面我们来一探究竟. 下面是WebGL中创建一个纹理的最简过程: var ...

  6. Linux资源控制-CPU和内存

    主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每个进程能够占用CPU多长时间, 什么时候能够占用CPU是和系统的调度密切相关的. Linux系统中有多 ...

  7. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  8. String源码中的"avoid getfield opcode"

    引言: 之前一篇文章梳理了String的不变性原则,还提到了一段源码中注释"avoid getfield opcode",当时通过查阅资料发现,这是为了防止 getfield(获取 ...

  9. Mac OSX中的@executable_path, @load_path和@rpath的理解

    本文转载自:https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath.个人觉得写的很不错,简洁明了. Absolute path ...

  10. 我的微软MVP申请历程

    10月10日晚更新: 今天看到这篇博客好多朋友点了推荐上了博客园首页最多推荐,很开心,感谢大家的鼓励! 张善友大哥也写过一篇文章: 10年微软MVP路(如何成为一个MVP?) 写的更为详细,大家也可以 ...