假设我有以下格式的明文:
John Doe、Suzy Q、Sue N. Sough 和 Michael Blanks,奇才大学,英国
John Doe,Normal Place,葡萄牙和 Suzy Q,Other Place,法国
John Doe 和 Suzy Q,第三地点,德国
John Doe、Suzy Q 和 Doug Z Doug,第四地点,波兰和 Simon Pft,第五地点,韩国
正确解析后,数据应如下所示:
[{
'organization': "Wizards University",
'country': "United Kingdom",
'authors': ["John Doe", "Suzy Q", "Sue N. Sough", "Michael Blanks"]
}]
[ {
'organization': "Normal Place",
'country': "Portugal",
'authors': ["John Doe"]
}, {
'organization': "Other Place",
'country': "France",
'authors': ["Suzie Q"]
} ]
[{
'organization': "Third Location",
'country': "Germany",
'authors': ["John Doe", "Suzy Q"]
}]
[ {
'organization': "Fourth Location",
'country': "Poland",
'authors': ["John Doe", "Suzy Q", "Doug Z. Doug"]
}, {
'organization': "Fifth Location",
'country': "Korea",
'authors': ["Simon Pft"]
} ]
人类查看这段文本并正确解析它是非常微不足道的,但我想知道是否有一种方法可以编写一个脚本,当它正在查看一堆一起列出的名称时,它可以阅读和识别。我的意思是,从一个只查找逗号和and
s 的愚蠢解析器开始,
John Doe、Suzy Q、Sue N. Sough 和 Michael Blanks,奇才大学,英国
看起来就像
John Doe,Normal Place,葡萄牙和 Suzy Q,Other Place,法国
并且可以这样解析:
[{
'organization': "Suzy Q",
'country': "Sue N. Sough",
'authors': ["John Doe"]
} , {
'organization': "Wizards University",
'country': "United Kingdom",
'authors': ["Michael Blanks"]
}]
关键和烦人的补充!
并不总是给出国家(呃,我知道!),尤其是当它隐含在组织名称中时。
所以有时记录看起来像:
John Doe、Suzy Q、Sue N. Sough 和 Michael Blanks,奇才大学
葡萄牙大学的 John Doe 和法国其他地方的 Suzy Q
John Doe 和 Suzy Q,第三个地点
John Doe、Suzy Q 和 Doug Z Doug,第四地点,波兰和 Simon Pft,高丽大学
因此,虽然我可以将国家名称(也以非标准方式格式化,例如韩国、韩国、大韩民国等)用于某些记录,但它并不适用于所有记录。
我最终做了什么……</h3>
…正在使用我所知道的最聪明的模式识别工具——我。我只是用一个正则表达式搜索和替换来扫描文档,\s*(,|&|\band\b)\s*
如果它在我替换它|
的名称之间,如果它在我替换它的名称组之间;
。幸运的是,数据集足够小(总共不到 100 个),所花费的时间少于我编写一个足够智能的解析器所花费的时间。我确实开始使用贝叶斯分类器,它在区分人名和组织方面做得很好,但它仍然经常错误地识别一个或另一个,以至于它不适合我的目的。