智能地在Python中解析具有组织信息的人员列表

时间:2013-02-22 22:26:18

标签: python parsing

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

  

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,第五位置,韩国

正确解析后,数据应如下所示:

[{
    '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,葡萄牙师范大学和Suzy Q,法国其他地方

并且可能会被解析:

[{
    '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

因此,虽然我可能能够使用国家名称(也以非标准方式格式化,例如韩国,韩国,韩国等)的某些记录,但它并不适用于所有人。< / p>

我最终做了什么...

...正在使用我认识的最聪明的模式识别工具 - 我。我刚刚使用正则表达式搜索和替换来查找文档,查找\s*(,|&|\band\b)\s*,如果它在名称之间,我将其替换为|,如果它在名称组之间,则将其替换为{ {1}}。幸运的是,数据集足够小(远远低于100),花费的时间比我编写足够智能的解析器所花费的时间少。我开始开始使用贝叶斯分类器,该分类器可以很好地区分人名与组织,但它仍然经常错误地识别其中一个或多个,以至于它不能用于我的目的。

3 个答案:

答案 0 :(得分:0)

如果国家总是在最后且组织是前一个元素,那么您可以将其他人视为名称,并且您可以通过拆分“和”来轻松地编写一些代码。 ''

答案 1 :(得分:0)

我认为Shasan走在正确的轨道上。国家/地区名称定义单位的结尾。倒数第二个令牌(由','拆分)是公司名称,其余的令牌是名称。

如果你在同一个国家/地区有两个人 - 公司元组,那么打破这种情况的用例就像:

  

John Doe,Normal Place和Suzy Q,Other Place,France

此外,如果您的文字中有逗号作为公司名称的一部分。报价可能用于保护这些。

答案 2 :(得分:-1)

l=Line.split(",")
Row = {
    "Org": l[-2],
    "Ctry": l[-1],
    "Authors": l[:-2]
}