2013-07-03 237 views
6

我有一堆人的名字。他们都是“西方”的名字,我只需要美国的公约/缩写(例如先生,而不是老先生)。不幸的是,我送的东西没有输入自己的名字,所以我不能问他们想要叫什么。我知道每个人的性别和他们的全名,但没有更具体地解析事情。人名称解析

一些例子:

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

我希望能够分析出每个名字的部分:

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

如果我在寻找“问候语”(可能不是最好的术语),我想在这里是,1-4,“史密斯先生”。 5,我想史密斯博士,但我会为史密斯先生解决。

Ruby的创业板,这将是理想的。我受到启发,想要什么东西这个奇怪的慢性,即处理时间的显着人类的方式,让我正确地告诉它“上周二”和具有红宝石宝石它拿出一些明智的。”一些算法就足够了命中最角落的情况。

我想处理一些在falsehoods programmers believe about names

回答

6

既然你仅限于西式的名字,我认为一些规则将让你最那里的方式:

  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中被删除,使用得分最高的一个。否则,请使用“Mr.”或“夫人”根据所提供的性别。
  5. 为姓,使用的最后一个字。

永远不可能保证像“John Baxter Smith”这样的名字被正确解析,因为并非所有双管姓氏都使用连字符。 “巴克斯特史密斯”是姓氏吗?或者是“Baxter”的中间名?我认为可以肯定的是,中间名比双重但未联系的姓更常见,这意味着最好默认报告最后一个词作为姓。然而,你也可能想编译一个普通的双管姓氏列表,然后检查这个。

+0

这给了我一个将自己的图书馆写入DWIW的非常好的起点。接受答案。 – Hut8

2

看待lufthansa页面所呈现的问题,他们会问,他们他们想要使用哪一种“标题”的。我从来没有见过更好这样的想法

我不建议在这种情况下使用宝石或任何东西,因为英语/西班牙语/法语/ ......在性别上存在差异,那么,如果您尝试迪斯科舞厅ver自己,你不可能成功。

我希望帮你

+1

这绝对是正确的答案,如果你可以重新开始改变这一点,但它可能是该系统已经存在了一段时间。 –

+0

是的,如果我可以问这些人什么都会很棒。不幸的是,我必须做出最好的猜测。请注意,我的问题还提到要区分John Smith XIV => Smith先生,而不是XIV先生。就像我在问题中所说的,我已经分开了解性别。 – Hut8

1

humanparser

解析人类名字符串转换成称呼,名字,中间名,姓,后缀。

安装

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' } 
1

你有没有尝试过的红宝石宝石Namae

它应该处理大多数西方国家的名字,并带有一些棘手场景的配置选项(多个姓氏,逗号用于分隔列表中的姓名和名称部分)。话虽如此,这是一个确定性的解析器(使用这个grammar),有些情况下它不会覆盖。

这里就是你们的榜样:

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"> 
] 

它的斗争,配合医生的头衔,但是这是我们也许能够解决。

2

有可用的基于Perl的解析器做这类提取http://search.cpan.org/~kimryan/Lingua-EN-NameParse/

我跑它通过你的例子得到以下results.It只可处理多达12(十二)序号后缀,也无法识别的。在博士,所以我不得不在输入数据

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