我正在开发一个在美国名片上进行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,不是那种语言很重要)棘手的部分是一些令牌的权重与其他令牌相关。例如:
我知道那里有很多聪明人,所以也许有人对这个有一个想法!
答案 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”的注册公司数量的数据库。即使是部分数据库也有助于建立一些合理的可能性猜测。
其他可能的规则: