2016-08-02 105 views
1

我有一個公司名單,但其中一些公司只是人名。我想從名單中排除這些人,但我無法找到一種方法來識別公司的人名。區分人名和公司名稱之間的清單

通過在線研究,我嘗試了兩種方法。首先是使用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模塊,但這也不起作用,因爲它將公司名稱標記爲該人的姓名。

有沒有一種方法可以區分上面列出的人名和公司名稱?

+2

是,清單?如果是這樣,你錯過了一些逗號,並且你的報價出了點怪異 – depperm

+2

聽起來更像是一個機器學習問題。你如何期待NLTK知道「公司」的定義?你必須告訴它(INC,LLC,CO,GROUP)都是關鍵字 –

+0

我的錯我把它列爲一個正確的列表。 – Jstuff

回答

0

就我所知,你需要區分公司和人名。我猜的公司名單及任何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) 

,並將其輸出如下:

INOVATIA LABORATORIES LLC is a company 
PRULLAGE PHD JOSEPH B is a human 
S J SMITH CO INC is a company 
TEVA PHARMACEUTICALS USA INC is a company 
KENT NUTRITION GROUP INC is a company 
JOSEPH D WAGENKNECHT is a human 
ROBERTSON KEITH is a human 
LINCARE INC is a company 
AGCHOICE - BLUE MOUND is a company 
+1

'if item.endswith('LLC')or item.endswith('INC'):' – erip

+1

此外,'AGCHOICE - BLUE MOUND是一個人'似乎是錯誤的。 – erip

+0

如果你有一個姓「Inc」的人,這會失敗。不尋常的,但不是不可能的。 –

0

檢驗公司名稱的指標列表元素。對於你的名單,這是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)) 

> t 
INOVATIA LABORATORIES LLC 
S J SMITH CO INC 
TEVA PHARMACEUTICALS USA INC 
KENT NUTRITION GROUP INC 
LINCARE INC 
AGCHOICE - BLUE MOUND 
0

我不相信你可以做到這一點完全編程,所以會需要一些手動操作。然而,你可以使事情變得更容易一些與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
+0

中出現錯誤與排序函數一致的錯誤TypeError:必須使用關鍵字函數的關鍵字參數 – Jstuff

+0

通過添加'key = lambda'修正了錯誤,但排序函數似乎並沒有可能在這種情況下排序。它創建'key_words'組進行排序,但不會爲每個組創建一個大組。 – Jstuff

+0

@Jstuff,修正了錯字。不知道我理解你的問題,但是,你的意思是「排序可能」。當我運行代碼時,我得到的結果顯示在回答中 – wnnmaw