小编典典

人名解析

algorithm

我有一堆人的名字。它们都是“西方”名称,我只需要美国的惯例/缩写(例如,先生代替高级先生)。不幸的是,我要向其发送邮件的人员没有输入自己的姓名,因此我无法问他们想要被叫什么。我知道每个人的性别及其全名,但是还没有真正具体地分析过事情。

一些例子:

  1. 约翰·史密斯
  2. 小约翰·史密斯(John Smith)
  3. 小约翰·史密斯
  4. 约翰·史密斯十四
  5. John Smith博士

我希望能够解析每个名称的一部分:

name = Name.new("John Smith Jr.")
name.first_name # <= John
name.greeting   # <= Mr. Smith

如果我正在寻找“打招呼”(可能不是最好的术语),我想要的是1-4号的“史密斯先生”。我想给史密斯博士5英镑,但我选择了史密斯先生。

一个Ruby的宝石将是理想的。Chronic启发了我,我要一个奇怪的东西,它是一种以非常人性化的方式处理时间的Ruby宝石,可以让我正确地告诉它“上周二”并提出有意义的东西。”某些算法足以满足大多数需求的情况下。

我正在尝试解决程序员认为名称错误的问题


阅读 413

收藏
2020-07-28

共1个答案

小编典典

由于您仅限于使用西式名称,因此我认为一些规则可以帮助您达到最佳状态:

  1. 如果出现逗号,请删除最左边的一个,然后删除所有内容。
  2. 继续从头开始删除单词,然后转换为小写并删除所有句号,它们属于集合,{ mr mrs miss ms rev dr prof }并且您可以想到的任何其他词。使用标题“得分”表(例如[mr=1, mrs=1, rev=2, dr=3, prof=4],根据需要排序),记录得分最高的标题。
  3. 当单词属于集合{ jr phd }或罗马数字的值大约为50或更小(/[XVI]+/可能是一个足够好的正则表达式)时,请从末尾继续删除这些单词。
  4. 如果在步骤2中删除了一个或多个得分不为零的标题,请使用得分最高的一个。否则,请使用“先生”。或“太太” 根据提供的性别。
  5. 使用姓氏作为姓氏。

绝不可能保证正确解析“ John Baxter Smith”之类的名称,因为并非所有双管姓都使用连字符。“ Baxter Smith”是姓吗?还是“
Baxter”是中间名?我认为可以肯定地说中间名比双枪但不带连字符的姓相对普遍,这意味着最好默认使用姓氏作为姓氏。您可能还需要编译常见的双管姓氏列表,然后对此进行检查。

2020-07-28