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

一天在研究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. 通过setTimeout来取消因大量计算造成的网页卡顿

    js是单线程的,所以有些大量计算的操作会占用线程资源,导致页面卡住. 今天遇到这样一个场景,选择一个下拉框之后,对数据进行筛选,这个过程中有大量计算,点了selecte的option之后,option ...

  2. T-SQL:毕业生出门需知系列(二)

    第2课 检索数据 2.1 SELECT 语句 用途:从一个或多个表中检索数据信息 关键字:作为SQL组成部分的保留字.关键字不能用作表或列的名字. 为了使用SELECT检索表数据,必须至少给出两条信息 ...

  3. 十进制(decimal system)转换函数说明

    一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); / ...

  4. 用十条命令在一分钟内检查Linux服务器性能

    转自:http://www.infoq.com/cn/news/2015/12/linux-performance 如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出L ...

  5. 用JQuery Ajax 与一般处理程序 请求数据无刷新,以及如何调试错误

    通过 ajax() 与 一般处理程序,请求数据库数据,实现界面无刷新. Jquery ajax 请求参数详细说明 http://www.w3school.com.cn/jquery/ajax_ajax ...

  6. 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 通过GeoServer发布的服务,在GeoServer内部有 ...

  7. URL的组成格式

    最近在学习js的Ajax方面的内容,发现自己对基础的计算机网络知识认识不足,所以大概了解了下. URL组成格式 图中中括号是可选项 protocol 协议,常用的协议是http hostname 主机 ...

  8. Java动态编程初探——Javassist

    最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...

  9. springmvc处理上传图片代码(校验图片尺寸、图片大小)

    package com.maizuo.web.controller; import com.maizuo.domain.Result; import com.maizuo.util.Constants ...

  10. Xamarin.Android之引导页的简单制作

    0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...