我有一堆人名。它们都是“西方”的名字,我只需要美国的公约/缩写(例如,先生而不是高级的señor)。不幸的是,我发送东西的人没有输入自己的名字,所以我不能问他们想要叫什么。我知道每个人的性别和他们的全名,但没有真正解析出更具体的事情。
一些例子:
我希望能够解析每个名称的部分内容:
name = Name.new("John Smith Jr.")
name.first_name # <= John
name.greeting # <= Mr. Smith
如果我正在寻找“问候”(可能不是最佳术语),我想要的是1-4,“史密斯先生”。对于5岁,我想要史密斯博士,但我会选择史密斯先生。
Ruby的宝石是理想的。我被启发要求Chronic这个奇怪的东西,一个以非常人性化的方式处理时间的Ruby宝石,让我正确地告诉它“上周二”,并让它得出一些合理的东西。“有些算法足以满足大多数人的要求。角落案件。
中提出的一些问题答案 0 :(得分:7)
由于你只限于西式名字,我认为一些规则会让你大部分都在那里:
{ mr mrs miss ms rev dr prof }
,您可以想到更多。使用标题表“得分”(例如[mr=1, mrs=1, rev=2, dr=3, prof=4]
- 根据需要订购),记录已删除的得分最高的标题。{ jr phd }
时,继续从末尾删除单词,或者是大约50或更少的罗马数字(/[XVI]+/
可能是一个足够好的正则表达式)。永远不可能保证像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">
]
它与医生的头衔斗争,但这是我们可以解决的问题。