我有一个公司列表,但是其中一些公司只是人的名字。我想从名单中删除这些人,但是我很难找到一种方法来识别公司中的人名。
通过在线研究,我尝试了两种方法。第一种是使用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
进行匹配关于python - 区分人名和公司名称的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38722516/