将全名解析为其成员

时间:2011-04-08 14:37:35

标签: parsing language-agnostic internationalization

我们需要开发一个可以将全名解析为

的后端应用程序
Prefix (Dr. Mr. Ms. etc)
First Name
Last Name
Middle Name
etc

这里的挑战是它必须支持多个国家和语言的名称。我们的一个假设是,我们总是会得到一个国家和语言以及全名作为输入。

全名可以是任何格式。对于相同的国家/语言组合,它可能带有名字姓氏或反向名称。逗号不会是全名的一部分。

可行吗?我们也对任何商用软件开放。

9 个答案:

答案 0 :(得分:8)

由于OP对任何商业产品开放......

“IBM InfoSphere全局名称分析”似乎是一个商业解决方案,满足解析[自由格式非结构化]个人名称[全名]的原始请求;显然在解决其他答复中提到的一些名称歧义问题方面具有一定程度的确定性。
注意:我没有个人经验也没有与产品相关联,我只是遇到了这个讨论和以下参考链接同时重新调查OP所描述的相同问题。 HTH。

一般产品文档链接:
http://publib.boulder.ibm.com/infocenter/gnrgna/v4r1m0/topic/com.ibm.gnr.gna.ic.doc/topics/gnr_gna_con_gnaoverview.html

请参阅左侧的“使用NameParser解析名称” http://publib.boulder.ibm.com/infocenter/gnrgna/v4r1m0/topic/com.ibm.gnr.gna.ic.doc/topics/gnr_np_con_parsingnamesusingnameparser.html

NameParser是每个产品的组件API http://publib.boulder.ibm.com/infocenter/gnrgna/v4r1m0/topic/com.ibm.gnr.gna.ic.doc/topics/gnr_gnm_con_logicalarchitecturecapis.html

请参阅中的“使用IBM NameWorks解析名称” http://publib.boulder.ibm.com/infocenter/gnrgna/v4r1m0/topic/com.ibm.gnr.gna.ic.doc/topics/gnr_gnm_con_parsingnamesusingnameworks.html

“IBM NameWorks将各个IBM InfoSphere全局名称识别组件组合成一个统一,易用的应用程序编程接口(API),并将此功能扩展到Java应用程序和Web服务”

http://publib.boulder.ibm.com/infocenter/gnrgna/v4r1m0/topic/com.ibm.gnr.gna.ic.doc/topics/gnr_gnm_con_logicalarchitecturenwapis.html

澄清为什么我认为这回答了这个问题,改善了以前在完成任务时遇到的一些困难......如果我理解正确读到的内容,那么API使用“NameHunter Server”来搜索“IBM InfoSphere Global”名称数据存档(NDA)“被描述为”来自世界各地的近10亿个名称的集合,以及每个名称的性别和关联国家。这个名称信息的大型存储库支持IBM InfoSphere Global的算法和规则名称识别产品用于对名称进行分类,分类,解析,genderize和匹配。“

FWiW我还遇到了一个“名称解析器”,它使用了大约140K名称的数据库,如下所示:
http://www.melissadata.com/dqt/websmart-web-services.htm

答案 1 :(得分:7)

我认为这是不可能的。考虑拉尔夫沃恩威廉姆斯。他的姓氏是“Vaughan Williams”,他的名字是“Ralph”。与Charles Villiers Stanford形成对比,后者的姓氏为“Stanford”,名字为“Charles”,中间名为“Villiers”。

两人都是来自英格兰的英语作曲家,所以国家和语言信息不足以建立正确的解析逻辑。

答案 2 :(得分:2)

唯一合理的方法是首先避免必须这样做。最明显(和常见)的方法是让用户分别输入标题,第一/给定名称,姓氏,姓氏,后缀等,而不是试图从单个中解析它们字符串。

答案 3 :(得分:2)

以下是两个免费的PHP名称解析库,供预算人员使用:

https://code.google.com/p/php-name-parser/

http://jasonpriem.org/human-name-parse/

这是Node包管理器中的Javasript库:

https://npmjs.org/package/name-parser

答案 4 :(得分:2)

我在javascript中用npm模块编写了一个简单的人名解析器:

https://www.npmjs.org/package/humanparser

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

答案 5 :(得分:2)

基本算法可以执行以下操作:

  • 首先查看传入的字符串是否以诸如Mrs之类的标题开头,如果是,则将其删除,检查固定的标题列表。
  • 如果剩下一个空格和一个空格,假设第一个单词是名字,第二个单词是姓氏(有时会不正确)

要做到这一点需要做很多工作,请参阅How to parse full names以确定改进途径并查看these involved IBM docs for further implementation clues

答案 6 :(得分:1)

Jordan“”Jordan Ashton“ - 你不知道哪个是姓,哪个是名字。 南印度的人显然没有姓氏。与喜马拉雅山脉的夏尔巴人一样。

但是说你有一个巨大的所有姓氏列表(从未用作给定名称),那么也许你可以用它来识别名称的其他部分(Salutations / Given / Middle / Jr / Sr / I / II / ...)如果存在歧义,你的名字解析器可能会要求人为输入。

答案 7 :(得分:1)

问问自己:你真的需要名称的不同部分吗?解析名称本质上是不可行的,因为不同的文化使用不同的约定(例如“中间名称”是典型的美国主义),并且一些小名称的名称​​总是被错误地对待。

将名称视为“原子”不可拆分实体更为可取。

答案 8 :(得分:1)

正如其他人所解释的那样,问题无法解决。我可以想到存储名称的最佳方法是存储全名,然后将开始(并且可能还有结束)偏移存储到“主要整理子字段”中,输入名称的人可以通过突出显示它来指示。例如

  

John Robert Miller ,Jr。

其中粗体表示标记为“主要整理子字段”的内容。然后,在生成整理键时,此范围将移动到字符串的开头。

当然,如果您还想支持标题(并且为了整理目的而忽略它们),这种方法本身可能还不够......