区分人名和公司名

2024-10-01 19:15:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份公司的名单,但有些公司只是人名而已。我想把这些人从名单上除名,但我很难找到一种方法来识别这些公司的人的名字。在

通过网上调查,我尝试了两种方法。第一种方法是使用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 WAGENKNECHT,和{}。在

^{pr2}$

这不起作用,因为它将所有东西都标记为专有名词。然后我把所有的东西都小写,并且只使用.title()将每个单词的第一个字母大写,但是由于类似的原因,这也失败了。在

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

我有没有办法区分上面的人名和公司名?在


Tags: 方法代码标记公司名字incphdnltk
3条回答

我不相信你完全可以用程序来完成,所以需要一些手动操作。但是,您可以使用itertools.groupby使事情变得简单一些

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

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

从这里,我们可以根据一个项目是否包含其中一个关键字对列表进行排序(这是分组所必需的):

^{pr2}$

在您的示例中,将列出

['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进行匹配

据我所知,你需要区分公司和人名。我猜您列表中的公司要么以LLCINC结尾,要么包含一个-(连字符),因此我将这些单词company_set作为{'LLC', 'INC', '-'},然后通过基函数split()将其拆分为代币。如果company_set和拆分标记的交集有任何共同点,那么它将不是空集,因此公司消息被打印,否则将打印人类的消息。代码如下:

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']
company_set = {'LLC', 'INC', '-'}
for item in y:
    tokens = set(item.split())
    if company_set.intersection(tokens) !=  set():
        print "{} is a company".format(item)
    else:
        print "{} is a human".format(item)

输出如下:

^{pr2}$

测试list元素中公司名称的指示符。对于您的列表,这是INC,LLC,和连字符(可以是一个人的名字的一部分)。或公司名称的一部分(实验室、制药、解决方案等)。可能还有其他标准(音节、语音)。 否则,你需要一个名字或公司的字典来测试。在

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']
f = ["INC", "LLC", "-"]
c = []
for n in y:
  for t in f:
    if t in n:
      c.append(n)
print( "\n".join(c) )

给予

^{pr2}$

相关问题 更多 >

    热门问题