如何将复数词变成单数?
nlp
6
0

我正在为ORM准备一些表名,并且我想将复数表名变成单个实体名。我唯一的问题是找到可以可靠执行的算法。这是我现在正在做的事情:

  1. 如果单词以-ies结尾,则将-y替换为结尾
  2. 如果单词以-es结尾,则删除此结尾。但是,这并不总是有效-例如,它用Typ代替Types
  3. 否则,我只删除结尾的-s

有谁知道更好的算法?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

这些都是通用规则(也是好的规则),但是英语不是一种使人胆怯的语言:-)。

我自己的偏好是拥有一个转换引擎以及一组转换(令人惊讶的是)来完成实际工作。您将经历转换(从特定到通用)的转换,并且当找到匹配项时,将转换应用于单词并停止。

正则表达式由于具有表达力,因此是解决此问题的理想方法。规则集示例:

 1. If the word is fish, return fish.
 2. If the word is sheep, return sheep.
 3. If the word is "radii", return "radius".
 4. If the word ends in "ii", replace that "ii" with "us" (octopii,virii).
 5. If a word ends with -ies, replace the ending with -y
 6. If a word ends with -es, remove it.
 7. Otherwise, just remove any trailing -s.

请注意保持此转换保持最新状态的要求。例如,假设有人添加了表名称types 。当前将由规则#6捕获,并且您将获得奇异值typ ,这显然是错误的。

解决方案是 #6 之前的某处插入新规则,例如:

 3.5: If the word is "types", return "type".

进行非常具体的转换,或者可以将其转换为更通用的格式。

换句话说,当您发现英语在多个世纪以来产生的所有奇妙异常时,您基本上需要保持此转换表的更新。


一种可能性是根本不浪费时间使用一般规则。

由于表的名称相对有限,因此只需创建另一个表(或某种数据结构),称为singulars ,即可将所有相关的复数表名( employeescustomers )映射为单数对象名( employeecustomer )。

然后,每次将表添加到架构时,请确保将条目添加到单数“表”,以便可以将其单数化。

收藏
评论

安德鲁·彼得斯(Andrew Peters)有一个名为Inflector.NET的类,该类提供了复数到单数和单数到复数的方法。正如塔尔(Tal)指出的那样,没有什么算法是绝对可靠的,但这涵盖了相当数量的不规则英语名词。

收藏
评论

也许看一下Rails Inflector之类的源代码

收藏
评论

另请参见此答案该答案建议使用Morpha(或研究其背后的算法)。

如果您知道要去词化的单词是复数名词,则可以使用NNS标记它们以获得更准确的输出。

输入示例:

$ cat test.txt 
Types_NNS
Pies_NNS
Trees_NNS
Buses_NNS
Radii_NNS
Communities_NNS
Sheep_NNS
Fish_NNS

输出示例:

$ cat test.txt | ./morpha -c
Type
Pie
Tree
Bus
Radius
Community
Sheep
Fish
收藏
评论

问题是这是基于一般规则的,但是英语有(大约)十亿个例外情况……您对“鱼”或“鹅”之类的单词怎么办?

同样,规则是关于如何将单数名词转换为复数形式的。反向映射不一定是可能的(考虑“赠品”)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号