6

我有一堆人名。它们都是“西方”名字,我只需要美国的约定/缩写(例如,先生而不是 Sr. 代表 señor)。不幸的是,我要寄东西的人没有输入他们自己的名字,所以我不能问他们想叫什么名字。我知道每个人的性别和他们的全名,但还没有真正更具体地分析出来。

一些例子:

  1. 约翰·史密斯
  2. 小约翰·史密斯
  3. 小约翰·史密斯
  4. 约翰史密斯十四世
  5. 约翰史密斯博士,博士

我希望能够解析出每个名称的部分内容:

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

如果我正在寻找“问候”(可能不是最好的术语),我想要的是 1-4,“史密斯先生”。对于 5,我想要 Smith 博士,但我会选择 Smith 先生。

一个 Ruby gem 将是理想的。我受到了 Chronic 的启发,想问一些奇怪的东西,这是一个 Ruby 宝石,它以一种非常人性化的方式处理时间,让我正确地告诉它“上周二”并让它想出一些明智的东西。”一些算法就足够了的角落案例。

我正在尝试处理程序员认为关于名称的谎言中提出的一些问题

4

6 回答 6

7

由于您仅限于西方风格的名称,我认为一些规则将使您大部分时间到达那里:

  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”是一个中间名?我认为可以安全地假设中间名比双管但未连字符的姓氏相对更常见,这意味着最好默认将最后一个单词报告为姓氏。但是,您可能还想编制一份常见的双管姓氏列表并对此进行检查。

于 2013-07-03T18:54:30.497 回答
2

查看汉莎航空页面。他们询问他们想要使用哪种“头衔”。我从来没有见过这样更好的主意。

我不建议在这种情况下使用 gem 或其他任何东西,因为英语/西班牙语/法语/.... 有性别差异,那么,如果您尝试自己发现,您将无法成功。

希望对你有帮助

于 2013-07-03T18:40:41.060 回答
2

有一个基于 Perl 的解析器可用于进行这种类型的提取http://search.cpan.org/~kimryan/Lingua-EN-NameParse/

我通过您的示例运行它以获得以下结果。它仅处理最多 12 (XII) 的序数后缀,并且也不识别 . 博士所以我不得不在你的输入数据中改变这个

JOHN SMITH                                John                             Smith                       
JOHN SMITH, JR.                           John                             Smith                Jr     
JOHN SMITH JR.                            John                             Smith                Jr     
JOHN SMITH XII                            John                             Smith                XII    
DR. JOHN SMITH, PHD              Dr.      John                             Smith                Phd    
于 2014-10-17T00:42:10.687 回答
1

人类解析器

将人名字符串解析为称呼、名字、中间名、姓氏、后缀。

安装

npm install humanparser

用法

var human = require('humanparser');

var fullName = 'Mr. William R. Jenkins, III'
    , attrs = human.parseName(fullName);

console.log(attrs);

//produces the following output

{ saluation: 'Mr.',
  firstName: 'William',
  suffix: 'III',
  lastName: 'Jenkins',
  middleName: 'R.',
  fullName: 'Mr. William R. Jenkins, III' }
于 2014-05-26T06:07:53.867 回答
1

你试过 Ruby gem Namae吗?

它应该可以很好地处理大多数西方名称,并带有一些用于棘手场景的配置选项(多个姓氏,逗号用于分隔列表中的名称和名称部分)。话虽如此,它是一个确定性解析器(使用此语法),并且在某些情况下它不会涵盖。

这是您的示例:

require('namae')

Namae.parse 'John Smith and John Smith, Jr. and John Smith Jr and John Smith XIV'
#=> [
  #<Name family="Smith" given="John">,
  #<Name family="Smith" given="John" suffix="Jr.">,
  #<Name family="Smith" given="John" suffix="Jr">,
  #<Name family="Smith" given="John" suffix="XIV">
]

它与医生的头衔斗争,但这是我们可能能够解决的问题。

于 2014-08-29T11:01:01.340 回答
-1

你试过parser.name吗?

解析名称很复杂,因此我建议使用将名称解析为组件的 API 服务。您可以将 RESTful API 集成到您的项目中,或使用 Web 应用程序在浏览器中运行列表。通过这种方式,您可以确保获得名字和姓氏,甚至得到验证,并包含更多详细信息,如称呼、国籍和性别。

于 2021-08-13T13:53:27.970 回答