我有公司列表,但是其中一些公司只是人的名字。我想从名单中删除这些人,但是我很难找到一种方法来识别公司中的人名。
通过在线研究,我尝试了两种方法。首先是使用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 B
,JOSEPH D WAGENKNECHT
和ROBERTSON 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句