从文本blob中检测姓和名的最佳方法


Best approach to detect first and last name from text blob

我正在编写一个程序,该程序对美国名片进行OCR,并尝试返回姓名等信息。挑战在于如何做到这一点。

到目前为止,我已经构建了以下数据文件:

first_names.txt  (Contains 23k+ first names)
last_names.txt (Contains 86k+ last names)
job_title.txt (Contains 500+ job titles)
us_cities.txt (Contains 10k+ us cities)
states_full.txt (Contains full names of all US states)
states_abv.txt  (Contains all US state abbreviations)

我的目标是通过空格对OCR数据进行标记,并尝试根据它是某种类型数据的可能性为每个字符串授予"权重"。

例如,文本blob中较前面的字符串更可能是名称、公司或标题。同样地,如果在first_names.txt或last_names.txt中找到一个字符串,那么它将对名/姓具有更大的权重。

这种方法在理论上听起来不错,但是我想知道从编程的角度来看最好的方法是什么。(PHP,语言无关紧要)棘手的部分是一些令牌的权重是相对于其他令牌的。例如:

  • 如果一个令牌看起来很可能是名字,那么下一个令牌很可能是姓氏。
  • 一些令牌彼此相关,但如果东西被空格爆炸,我不确定如何将它们联系起来。例如,"Anne Marie, FL"将被认为是三个标记——"Anne","Marie"answers"FL"。更糟糕的是,"安妮"answers"玛丽"会越来越多地成为名字。现在,如果权重也是基于位置授予的,那么前面具有名字权重的字符串可能会获胜,从而释放这些字符串,将其检测为城市。
我知道有很多聪明的人,所以也许有人对这个有一个想法!

了解例外情况(例如一个名为Mary Sue的小镇)是有帮助的,但是如果您的软件可以处理最可能的情况,最终用户应该感到高兴。名字可以按照每个类别中出现的相对频率进行排序:个人姓名、公司名称、城市名称。对于公司来说,雇员的数量可以用来计算相对可能性。对于城市来说,人口。

您是否已经有规则来检查包含每个标记的行的相对位置?

名片的格式当然有很多,但是如果你有几百张名片的样本,你应该能够识别出一些通用的格式规则。制定几条规则会大有帮助。其中一条规则可能是:"80%的名片在个人姓名和公司名称下面都有地址。"尽管你的名片样本可能不能真正代表所有可能的名片、所有语言等等,但这是一个开始。甚至一些50%和80%的规则也可以简化你的任务。

你可以用一个荒谬的例子想出一些规则。

<>之前约翰。史密斯首席运营官Acme公司。主街123号某个地方,xz01010之前

更有可能<>之前某个地方,XZ01010约翰。史密斯Acme公司。首席运营官主街123号之前

这表明我们可以考虑个人和公司名称相对于邮政编码的相对y位置。虽然个人姓名、职位头衔和公司名称可能在任何一种顺序后面,但邮政编码可能位于公司名称下面。邮政编码将更接近城市名称等。

虽然像"Samantha"这样的词可以是个人名字、街道名称或公司名称的一部分,但它更有可能是一个人名。您应该能够找到列出出生名字的相对频率、以"Samantha"命名的城镇人口以及以"Samantha"命名的注册公司数量的数据库。即使是部分数据库也有助于建立一些合理的可能性估计。

其他可能规则:

  • 由字母和数字组成的5 - 7位数字在一行的末尾(对于从左到右的文本)或在其自己的行中可能是邮政编码。
  • "Inc","Ltd","Corp"和其他缩写应该增加一行被识别为公司名称的可能性
  • 个人姓名通常位于头衔的上方。(可能85% - 95%的时间?)
  • 电话号码遵循一定数量的模式,并且倾向于包含邮政编码中没有的字符:"(" ")"。"
  • 网站遵循共同的模式。即使有人的合法名字是"CarolGreen.com",如果她的名字被认出是一个网站,她可能也不会感到惊讶。
  • "@"符号几乎肯定是电子邮件地址的一部分。电子邮件地址很可能位于人名下面的某一行,假设电子邮件地址出现了。
  • 可能缺少某些信息。卡片上不能列出网站。可能有电话号码,但没有街道地址。这个人可能没有头衔。个人名片上可能没有公司名称。最有可能的是,至少有一行是个人姓名。