2016-08-02 41 views
1

Ich habe eine Liste von Unternehmen, aber einige dieser Unternehmen sind einfach Namen von Menschen. Ich möchte diese Leute von der Liste streichen, aber ich habe Schwierigkeiten, einen Weg zu finden, um die Namen von Leuten aus den Unternehmen zu identifizieren.Differenzieren Sie eine Liste zwischen menschlichen Namen und Firmennamen

Durch Online-Recherche habe ich zwei Möglichkeiten ausprobiert. Die erste verwendet die nltk. Mein Code sieht aus wie

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'] 

In der obigen Liste I PRULLAGE PHD JOSEPH B, JOSEPH D WAGENKNECHT und ROBERTSON KEITH entfernen möchte.

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

Dies funktioniert nicht, weil es alles als Eigenname markiert. Ich habe dann alles kleingeschrieben und nur den ersten Buchstaben jedes Wortes Großbuchstaben mit der .title() gemacht, aber das scheiterte auch aus ähnlichen Gründen. Die andere Methode, die ich ausprobiert habe, war die Verwendung des Moduls Human Name Parser, aber dies funktionierte auch nicht, weil es die Firmennamen als Vor- und Nachname der Person kennzeichnet.

Gibt es einen Weg, dass ich die obige Liste zwischen menschlichen Namen und Firmennamen unterscheiden kann?

+2

ist, dass ein Liste? Wenn ja, Sie einige Kommas fehlen und Ihre Zitate sind aus dem Wack – depperm

+2

Klingt eher wie eine Maschine Lernproblem. Wie erwarten Sie, dass NLTK die Definition eines "Unternehmens" kennt? Sie müssen es sagen (INC, LLC, CO, GROUP) sind alle Schlüsselwörter –

+0

Meine Schuld habe ich es eine richtige Liste gemacht. – Jstuff

Antwort

0

Soweit ich verstehe, müssen Sie die Firma und menschliche Namen unterscheiden. Ich denke, die Unternehmen in der Liste am Ende mit entweder LLC, INC oder enthalten einen - (Bindestrich), so dass ich eine Reihe von diesen Worten company_set als {'LLC', 'INC', '-'} gemacht und teilen Sie es dann in Token über die Basisfunktion split(). Wenn eine Schnittmenge von company_set und aufgeteilten Tokens irgendetwas gemeinsam hat, dann wird es keine leere Menge geben, daher wird eine Firmennachricht gedruckt, ansonsten eine menschliche Nachricht. Unten ist der Code:

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) 

Und es gibt wie folgt:

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

'wenn item.endswith ('LLC') oder item.endswith ('INC'):' – erip

+1

Auch 'AGCHOICE - BLUE MOUND ist ein Mensch' scheint falsch. – erip

+0

Wenn Sie einen Menschen mit dem Nachnamen "Inc" haben, wird dies fehlschlagen. Ungewöhnlich, aber nicht unmöglich. –

0

Testen Sie die Listenelemente für die Indikatoren der Firmennamen. Für Ihre Liste ist dies INC, LLC, und der Bindestrich (der Teil des Namens einer Person sein könnte). Oder Teile von Firmennamen (Labor, Pharma, Lösungen, ..). Es kann andere Kriterien geben (Silben, Phonetik). Andernfalls benötigen Sie ein Wörterbuch mit Namen oder Firmen zum Testen.

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)) 

gibt

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

Ich glaube nicht, Sie dies programmatisch völlig tun können, so dass einige manuelle Bedienung benötigt.Sie können jedoch die Dinge ein wenig einfacher, mit itertools.groupby

Wie machen darauf in einigen Kommentaren heraus, sind Unternehmen wahrscheinlich bestimmte Schlüsselwörter enthalten, so können wir eine Liste dieser erstellen zu verwenden:

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

Von hier wir die Liste ein Element enthält eines dieser Schlüsselwörter sortieren können, ob oder nicht (dies Gruppe erforderlich ist):

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

In Ihrem Beispiel wird diese Liste

['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'] 

Von hier aus können wir Gruppe in Dinge, die wahrscheinlich nicht Unternehmen (diejenigen, die keine Schlüsselwörter enthalten nicht) sind und die Dinge, die definitiv Unternehmen sind (diejenigen, die Schlüsselwörter enthalten):

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

haben wir also jetzt zwei Gruppen:

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'] 

Sie können dann manuell die falsche Gruppe und Unternehmen entfernen, oder ein ähnliches Filtermethode anzuwenden, um die passende zu verbessern. Einige andere Filter anwenden:

  • Alles, was "MR", "MS", "MRS", "PHD", "DR" enthält, ist ziemlich wahrscheinlich eine Person
  • Worte der Form "multiple_letters<space>single_letter<space>multiple_letters" sind wahrscheinlich Namen zu sein, können Sie diese Anpassungs tun mit re
+0

Fehler in Zeile mit Sortierfunktion 'TypeError: muss Schlüsselwortargument für Schlüsselfunktion verwenden – Jstuff

+0

Der Fehler wurde behoben, indem' key = Lambda' hinzufügt, aber die Sortierfunktion nicht scheint sortiere wahrscheinlich in diesem Fall. Es erstellt Gruppen der 'key_words', nach denen sortiert wird, erstellt aber keine große Gruppe für jede. – Jstuff

+0

@Jstuff, reparierte den Tippfehler. Nicht sicher, dass ich deine Frage verstehe, was meinst du mit "sortiere wahrscheinlich". Wenn ich den Code ausführe, bekomme ich die Ausgabe in der Antwort gezeigt – wnnmaw