Passende Firmennamen in den Nachrichten-Daten unter Verwendung von Python

stimmen
1

Ich habe Neuigkeiten Datenmenge, die fast 10.000 Nachrichten in den letzten 3 Jahren enthalten. Ich habe auch eine Liste von Unternehmen (Namen von Unternehmen), die in NYSE registriert sind. Jetzt mag ich überprüfen, ob die Liste von Firmennamen in der Liste hat in dem Nachrichten-Datensatz oder nicht erschienen. Beispiel:

company Name: 'E.I. du Pont de Nemours and Company'
News: 'Monsanto and DuPont settle major disputes with broad patent-licensing deal, with DuPont agreeing to pay at least $1.75 billion over 10 years for rights to technology for herbicide-resistant soybeans.'

Nun kann, finde ich die Nachricht enthält Firmennamen, wenn der genaue Firmenname in der Nachricht ist, aber man kann aus dem obigen Beispiel sehen, daß es nicht der Fall ist. Ich habe auch versucht, eine andere Art und Weise, dh ich das Integral Namen in der Gesellschaft in dem obigen Beispiel ‚Pont‘, dh vollständigen Namen nahm, ist ein Wort, das auf jeden Fall ein Teil des Textes sein soll, wenn diese Firmennamen genannt wird. So es funktioniert gut für die Mehrheit der Zeiten, aber dann tritt Problem in dem folgende Beispiel:

Company Name: Ennis, Inc.
News: L D`ennis` Kozlowski, former chief executive convicted of looting nearly $100 million from Tyco International, has emerged into far more modest life after serving six-and-a-half year sentence and probation; Kozlowski, who became ultimate symbol of corporate greed in era that included scandals at Enron and WorldCom, describes his personal transformation and more humble pleasures that have replaced his once high-flying lifestyle.

Jetzt können Sie sehen , Ennismit wird passend Dennisim Text so spielt es keine Rolle Nachrichten Ergebnisse.

Kann jemand helfen, den richtigen Weg, dies zu tun zu erzählen? Vielen Dank.

Veröffentlicht am 24/09/2016 um 19:22
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
-1

Du kannst es versuchen

  difflib.get_close_matches

mit dem vollständigen Firmennamen.

Beantwortet am 24/09/2016 um 19:26
quelle vom benutzer

stimmen
1

Verwenden Sie einen regulären Ausdruck mit Grenzen für exakte Übereinstimmungen , ob Sie die vollständigen Namen wählen oder einiger Teil Teil denken Sie einzigartig ist , ist an Sie, aber Wortgrenzen mit D'ennis'nicht übereinstimmen Ennis:

companies = ["name1", "name2",...]
companies_re = re.compile(r"|".join([r"\b{}\b".format(name) for name in companies]))

Je nachdem , wie viele Treffer pro News, können Sie verwenden companies_re.search(artice)oder companies_re.find_all(article). Auch für Groß- und Kleinschreibung Begegnungen passieren re.Izu kompilieren.

Wenn die einzige Linie , die Sie auch überprüfen wollen , ist immer derjenige mit Unternehmen beginnen company Name:können Sie die Suche eingrenzen:

for line in all_lines:
  if line.startswith("company Name:"):
      name = companies_re.search(line) 
      if name:
         ...
      break
Beantwortet am 24/09/2016 um 19:29
quelle vom benutzer

stimmen
1

Es klingt wie Sie benötigen Aho-Corasick Algorithmus. Es gibt eine schöne und schnelle Implementierung für Python hier: https://pypi.python.org/pypi/pyahocorasick/

Es wird nur eine exakte Übereinstimmung tun, so würden Sie indizieren beide „Du Pont“ und „Dupont“, zum Beispiel benötigen. Aber das ist nicht zu hart, können Sie die Wikidata verwenden Sie Aliase finden: zum Beispiel, Blick auf die Aliasnamen von Dupont Eintrag : es sowohl „Dupont“ und „Du Pont“ enthält.

Ok, so nehmen wir an, Sie mit ihren Aliase die Liste von Firmennamen haben:

import ahocorasick
A = ahocorasick.Automaton()

companies = ["google", "apple", "tesla", "dupont", "du pont"]
for idx, key in enumerate(companies):
    A.add_word(key, idx)

Als nächstes werden den Automaten machen (den Link oben für Details auf dem Algorithmus e):

A.make_automaton()

Groß! Jetzt können Sie einfach für alle Unternehmen in einem Text suchen:

your_text = """
I love my Apple iPhone. Do you know what a Googleplex is?
I ate some apples this morning.
"""

for end_index, idx in A.iter(your_text.lower()):
    print(end_index, companies[idx])

Dies ist die Ausgabe:

15 apple
49 google
74 apple

Die Zahlen entsprechen den Index des letzten Zeichens des Firmennamen im Text.

Einfach richtig? Und super schnell, ist dieser Algorithmus von einigen Varianten von GNU grep verwendet.

Speichern / Laden des Automaten

Wenn es gibt eine Menge von den Firmennamen, den Automaten zu schaffen kann einige Zeit dauern, so dass Sie es schaffen nur einmal möchten, auf der Festplatte speichern (mit Gurke), dann jedes Mal, wenn Sie es brauchen laden:

# create_company_automaton.py
# ... create the automaton (see above)
import pickle
pickle.dump(A, open('company_automaton.pickle', 'wb'))

In dem Programm, das diese Automaten verwenden, starten Sie durch die Automaten geladen:

# use_company_automaton.py
import ahocorasick
import pickle
A = pickle.load(open("company_automaton.pickle", "rb"))
# ... use the automaton

Hoffe das hilft! :)

Bonus Details

Wenn Sie möchten, „Apple“ passen in „Apple veröffentlicht ein neues iPhone“, aber nicht in „Ich aß heute Morgen einen Apfel“, werden Sie eine harte Zeit haben. Aber es ist machbar: Sie zum Beispiel eine Reihe von Artikeln sammeln könnte das Wort „Apfel“ und über das Unternehmen und eine Reihe von Artikeln nicht über das Unternehmen enthalten, dann Worte identifizieren (oder n-Gramm), das ist wahrscheinlicher, wenn es ist über das Unternehmen (zB „iPhone“). Leider müssten Sie dies für jedes Unternehmen, dessen Name ist nicht eindeutig tun.

Beantwortet am 16/01/2017 um 15:07
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more