Algorithm 人名解析

Algorithm 人名解析,algorithm,parsing,language-agnostic,Algorithm,Parsing,Language Agnostic,我有很多人名。它们都是“西方”的名字,我只需要美国的惯例/缩写(例如,señor是Mr.而不是Sr.)。不幸的是,我发送邮件给的人没有输入他们自己的名字,所以我不能问他们想叫什么。我知道每个人的性别和全名,但还没有更具体地解析出来 一些例子: 约翰·史密斯 小约翰·史密斯 小约翰·史密斯 约翰·史密斯十四世 约翰·史密斯博士,博士 我希望能够解析出每个名称的部分: name = Name.new("John Smith Jr.") name.first_name # <= John nam

我有很多人名。它们都是“西方”的名字,我只需要美国的惯例/缩写(例如,señor是Mr.而不是Sr.)。不幸的是,我发送邮件给的人没有输入他们自己的名字,所以我不能问他们想叫什么。我知道每个人的性别和全名,但还没有更具体地解析出来

一些例子:

  • 约翰·史密斯
  • 小约翰·史密斯
  • 小约翰·史密斯
  • 约翰·史密斯十四世
  • 约翰·史密斯博士,博士
  • 我希望能够解析出每个名称的部分:

    name = Name.new("John Smith Jr.")
    name.first_name # <= John
    name.greeting   # <= Mr. Smith
    
    name=name.new(“小约翰·史密斯”)
    name.first_name查看第页。他们问他们想用哪种“头衔”。我从没见过比这更好的主意

    我不建议在这种情况下使用gem或其他任何东西,因为英语/西班牙语/法语/。。。。性别是有差异的,如果你试图自己去发现,你就不会成功


    我希望能对您有所帮助

    因为您仅限于使用西式名称,所以我认为有几条规则可以帮助您实现这一目标:

  • 如果出现逗号,请删除最左边的逗号以及后面的所有内容
  • 继续从开头删除单词,同时,在转换为小写并删除任何句号后,它们属于集合
    {mr mrs miss ms rev dr prof}
    ,以及您可以想到的任何其他内容。使用标题“分数”表(例如,
    [mr=1,mrs=1,rev=2,dr=3,prof=4]
    ——按您的意愿排序),记录删除的最高分数标题
  • 当单词属于集合
    {jr phd}
    或是值大约为50或更少的罗马数字时,继续从末尾删除它们(
    /[XVI]+/
    可能是一个足够好的正则表达式)
  • 如果在步骤2中删除了一个或多个得分非零的标题,请使用得分最高的标题。否则,根据提供的性别使用“先生”或“夫人”
  • 作为姓氏,使用最后一个单词
  • 永远无法保证像“约翰·巴克斯特·史密斯”这样的名字被正确解析,因为并非所有双筒姓氏都使用连字符。“巴克斯特·史密斯”是姓氏吗?或者“巴克斯特”是一个中间名?我认为可以肯定的是,中间名相对来说比双管但不带字母的姓氏更常见,这意味着最好默认以最后一个单词作为姓氏。不过,您可能还需要编制一份常见的双筒姓氏列表,并对此进行检查。

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

    安装

    npm install humanparser
    
    用法


    你试过红宝石吗

    它应该能够很好地处理大多数西方名字,并为复杂的场景提供了一些配置选项(多个姓氏,逗号用于分隔列表中的名字和名称部分)。话虽如此,它是一个确定性解析器(使用它),有些情况它不会涉及

    以下是您的示例:

    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">
    ]
    
    require('namae')
    Namae.parse“小约翰·史密斯和小约翰·史密斯、小约翰·史密斯和约翰·史密斯十四”
    #=> [
    #,
    #,
    #,
    #
    ]
    

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

    有一个基于Perl的解析器可用于进行这种类型的提取

    我通过你的例子得到了以下结果。它只处理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    
    

    如果你重新开始,这肯定是正确的答案,但可能是这个系统已经存在了一段时间。是的,如果我能问这些人任何问题,那就太好了。不幸的是,我不得不做出最好的猜测。请注意,我的问题还询问如何区分John Smith XIV=>Smith先生,而不是XIV先生。正如我在问题中所说,我已经分别知道了性别。这为我为DWIW编写自己的库提供了一个很好的起点。答案被接受。
    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