人名解析

时间:2013-07-03 18:33:03

标签: algorithm parsing language-agnostic

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

一些例子:

  1. John Smith
  2. John Smith,Jr。
  3. John Smith Jr。
  4. John Smith XIV
  5. 博士。 John Smith,博士。
  6. 我希望能够解析每个名称的部分内容:

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

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

    Ruby的宝石是理想的。我被启发要求Chronic这个奇怪的东西,一个以非常人性化的方式处理时间的Ruby宝石,让我正确地告诉它“上周二”,并让它得出一些合理的东西。“有些算法足以满足大多数人的要求。角落案件。

    我正在尝试处理falsehoods programmers believe about names

    中提出的一些问题

5 个答案:

答案 0 :(得分: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. 作为姓氏,请使用最后一个字。
  6. 永远不可能保证像John Baxter Smith这样的名字被正确解析,因为并非所有双管姓氏都使用连字符。是“巴克斯特史密斯”的姓吗?或者“巴克斯特”是中间名?我认为可以安全地假设中间名比双管但没有连字的姓氏相对更常见,这意味着最好默认将姓氏报告为姓氏。您可能还想编制一个常见的双管姓氏列表,然后对此进行检查。

答案 1 :(得分:2)

查看lufthansa页面。他们要求他们使用哪种“头衔”。我从未见过这样的好主意。

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

我希望能帮到你

答案 2 :(得分: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    

答案 3 :(得分: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' }

答案 4 :(得分:1)

您是否尝试过Ruby gem 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">
]

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