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

时间:2011-11-20 03:09:20

标签: php algorithm logic tagging tokenize

我正在开发一个在美国名片上进行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”和“FL”。更糟糕的是,“安妮”和“玛丽”将成为第一个名字。现在,如果权重也是根据位置授予的,那么先前名字权重的字符串可以获胜,将这些字符串释放为城市。

我知道那里有很多聪明人,所以也许有人对这个有一个想法!

1 个答案:

答案 0 :(得分:3)

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

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

当然有很多名片格式,但如果你有几百个样本名片,你应该能够识别一些常见的格式规则。只有一些规则可能会有很大帮助。一条规则可能是“80%的所有卡片都有个人姓名和公司名称下面的地址”,虽然您的名片样本可能无法真正代表所有可能的名片,所有语言等,但它是一个开始。即使是几个50%和80%的规则也可以简化您的任务。

你可以用一个荒谬的例子来思考几条规则。

John Smith
Chief Operating Officer
Acme Inc.
123 Main Street
Somewhere, XZ 01010

更可能
Somewhere, XZ
01010
John Smith
Acme Inc.
Chief Operating Officer
123 Main Street

这表明我们可以考虑个人和公司名称相对于邮政编码的相对Y位置。虽然个人姓名,职位和公司名称可能会遵循多个订单中的任何一个,但邮政编码可能位于公司名称下方。邮政编码将更接近城市名称等。

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

其他可能的规则:

  • 字母和数字的混合5到7位数字(从左到右文字)或自己的行可能是邮政编码。
  • “Inc”,“Ltd”,“Corp”和其他缩写应该会增加一条线被识别为公司名称的可能性
  • 个人姓名可能位于标题上方。 (也许85% - 95%的时间?)
  • 电话号码的数量有限,并且往往包含邮政编码中找不到的字符:“(”“)”“。”
  • 网站遵循常见模式。即使有人的合法名称是“CarolGreen.com”,如果她的名字被认可为网站,她也不会感到惊讶。
  • “@”符号几乎可以肯定是电子邮件地址的一部分。电子邮件地址可能位于人名下方的某一行,假设电子邮件地址完全显示。
  • 某些信息可能不存在。该卡可能未列出网站。可能有电话号码,但不是街道地址。该人可能没有头衔。个人名片可能没有公司名称。最有可能的是,至少有一行是个人名称。