我有一个公司列表,但是其中一些公司只是人的名字。我想从名单中删除这些人,但是我很难找到一种方法来识别公司中的人名。

通过在线研究,我尝试了两种方法。第一种是使用nltk。我的代码看起来像

y = ['INOVATIA LABORATORIES LLC', 'PRULLAGE PHD JOSEPH B', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'LINCARE INC', 'AGCHOICE - BLUE MOUND']


在上面的列表中,我要删除PRULLAGE PHD JOSEPH BJOSEPH D WAGENKNECHTROBERTSON KEITH

z = []
for company in y:
    tokens = nltk.tokenize.word_tokenize(company)
    z.append(nltk.pos_tag(tokens))


这是行不通的,因为它将所有内容标记为专有名词。然后,我将所有内容都转换为小写字母,并且仅使用.title()将每个单词的首字母大写,但这也由于类似的原因而失败。

我尝试的另一种方法是使用Human Name Parser模块,但这也不起作用,因为它将公司名称标记为该人的名字和姓氏。

有什么方法可以区分人名和公司名吗?

最佳答案

我不相信您可以完全以编程方式执行此操作,因此将需要一些手动操作。但是,您可以使用itertools.groupby使事情变得简单一些

正如一些评论中指出的那样,公司可能包含某些关键字,因此我们可以创建要使用的关键字列表:

key_words = ["INC", "LLC", "CO", "GROUP"]


在这里,我们可以根据项目是否包含这些关键字之一对列表进行排序(这对于分组是必要的):

y.sort(key=lambda name: any(key_word in name for key_word in key_words))


在您的示例中,这将列出

['PRULLAGE PHD JOSEPH B', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'AGCHOICE - BLUE MOUND', 'INOVATIA LABORATORIES LLC', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'LINCARE INC']


从这里,我们可以将可能不是公司的事物(不包含任何关键字的事物)和绝对是公司的事物(确实包含关键字的事物)分组:

import itertools
I = itertools.groupby(y, lambda name: any(key_word in name for key_word in key_words))


因此,我们现在分为两组:

for i in I:
    print i[0], list(i[1])
False ['PRULLAGE PHD JOSEPH B', 'JOSEPH D WAGENKNECHT', 'ROBERTSON KEITH', 'AGCHOICE - BLUE MOUND']
True ['INOVATIA LABORATORIES LLC', 'S J SMITH CO INC', 'TEVA PHARMACEUTICALS USA INC', 'KENT NUTRITION GROUP INC', 'LINCARE INC']


然后,您可以手动对虚假组进行排序并删除公司,或者应用其他类似的过滤器方法进一步改善匹配度。其他一些要应用的过滤器:


任何包含"MR", "MS", "MRS", "PHD", "DR"的东西很可能是一个人
"multiple_letters<space>single_letter<space>multiple_letters"形式的单词可能是名称,您可以使用re进行匹配

关于python - 区分人名和公司名称的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38722516/

10-12 23:47