1

假设我有以下格式的明文:

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"]
} ]

人类查看这段文本并正确解析它是非常微不足道的,但我想知道是否有一种方法可以编写一个脚本,当它正在查看一堆一起列出的名称时,它可以阅读和识别。我的意思是,从一个只查找逗号和ands 的愚蠢解析器开始,

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 个),所花费的时间少于我编写一个足够智能的解析器所花费的时间。我确实开始使用贝叶斯分类器,它在区分人名和组织方面做得很好,但它仍然经常错误地识别一个或另一个,以至于它不适合我的目的。

4

3 回答 3

0

我认为Shasan走在正确的轨道上。国家名称定义了一个单位的结尾。倒数第二个标记(由“,”分隔)是公司名称,其余标记是名称。

如果您在同一个国家/地区有两个 people-company 元组,则可以打破这种情况的用例,例如:

John Doe,Normal Place 和 Suzy Q,Other Place,法国

此外,如果您的文本中有逗号是公司名称的一部分。引号可以用来保护这些。

于 2013-02-22T23:01:05.910 回答
0

如果国家总是在最后,组织是前一个元素,那么你可以将其他元素视为名称,并且你可以通过'and'&','来轻松编写一些代码。

于 2013-02-22T22:38:05.770 回答
-1
l=Line.split(",")
Row = {
    "Org": l[-2],
    "Ctry": l[-1],
    "Authors": l[:-2]
}
于 2013-02-23T00:04:09.380 回答