[PYTHON] Für diejenigen, die eine Verarbeitung in natürlicher Sprache mit dem Wissen von WikiPedia durchführen möchten, das über den einfachen Keyword-Abgleich hinausgeht

Wert der Verwendung von Wissen über den Keyword-Abgleich hinaus

In Gesprächen zwischen Menschen können Sie sprechen, indem Sie wissen, dass "Twitter" und "Facebook" SNS sind, und selbst wenn Sie "Yamaha" sagen, ist "Yamaha" das Fahrrad "Yamaha" oder das Klavier "Yamaha" im Kontext. "Ich verstehe. Dies liegt daran, dass die Wissensinformationen zum Hintergrund des Wortes verfügbar sind. In den letzten Jahren wird in der Verarbeitung natürlicher Sprache häufig eine Methode verwendet, die als Entitätsverknüpfung bezeichnet wird, um dieses Wort mit Wissensinformationen zu verbinden.

Screen Shot 2016-07-29 at 3.36.58 PM.png

Wenn Sie den Code sofort überprüfen möchten, installieren Sie ihn bitte unten.

Code:

Benötigte Daten: --Daten, die Sie analysieren möchten

Anwendungsfall

Die folgenden Anwendungsfälle können bei der tatsächlichen Verwendung berücksichtigt werden.

1: Vorschlag Wenn bei der Suche nach einem Schlüsselwort ein Wort angezeigt wird, das mit dem Wort zusammenhängt, ist die Suche einfacher und für den Benutzer von Vorteil.

Screen Shot 2016-07-29 at 5.24.48 PM.png

2: Dialogschnittstelle Da die im Dialog ausgegebenen Sätze kurz sind, gibt es wenig Informationen. Um aus diesen kleinen Informationen eine erweiterte Antwort zu geben, ist es wichtig, nicht nur Wörter, sondern auch verwandtes Wissen zu verknüpfen.

Screen Shot 2016-07-30 at 2.32.11 PM.png

3: Informationsextraktion von Twitter Da Twitter-Tweets nur wenige Informationen enthalten, ist es schwierig, sie für die nützliche Informationsextraktion nur mit einfachen Schlüsselwörtern zu verwenden. Durch die Zuordnung von Schlüsselwörtern zu verwandtem Wissen ist es möglich, nützliche Informationen zu erhalten, die durch Schlüsselwortabgleich nicht erfasst werden konnten.

Screen Shot 2016-07-30 at 2.37.02 PM.png

Was ist Entity Linking?

ACL ist eine Technik, die selbst in der Spitzenkonferenz der Verarbeitung natürlicher Sprache viel Aufmerksamkeit auf sich gezogen hat.

Das Verfahren und die Methode zum Verbinden einfacher Schlüsselwörter und Kenntnisse kann ein Link sein, der detaillierte Informationen oder zusammenfassende Informationen einschließlich zusätzlicher Informationen enthält. Es gibt zwei wichtige Punkte.

1: Extrahieren Sie nur Schlüsselwörter, die als wichtig angesehen werden, aus dem Text 2: Verbinden Sie Informationen zu Schlüsselwörtern

Extrahieren Sie nur die Schlüsselwörter, die Sie für wichtig halten, aus dem Text

Wörter, die allgemein als wichtig angesehen werden, können durch Keyword-Matching mit Wikificatation extrahiert werden, aber wenn Sie einfach nur operieren möchten Kann versucht werden, indem nur die richtige Nomenklatur mit Mecab extrahiert wird. Ursprünglich ist es notwendig, ein Modell des maschinellen Lernens zu erstellen, um zu beurteilen, ob dieses Schlüsselwort nützlich ist oder nicht, aber ich werde es in diesem Artikel nicht erwähnen. Wenn Sie weitere Einzelheiten erfahren möchten, lesen Sie bitte die folgenden Materialien

Entitätsverknüpfung unter Verwendung der Wissensdatenbank

Verbinden Sie Schlüsselwörter und verwandte Informationen

Eine andere Technik besteht darin, das Schlüsselwort einfach mit WikiPedia oder DBPedia abzugleichen und die übereinstimmenden verknüpften Informationen zu verwenden.

Wenn sich die Übereinstimmung im Vektorraum befindet, können verschiedene Operationen durch Berechnung ausgeführt werden, und die Verwendung wird erweitert. Möglich wird dies durch den diesmal eingeführten japanischen Wikipedia-Entitätsvektor.

Da es sich um eine erweiterte Methode von Word2Vec handelt, kann sie angewendet werden, wenn Sie den Inhalt kennen. Wenn Sie also die Details kennen möchten, empfehle ich Ihnen, das Papier zu lesen. Selbst wenn Sie es nicht lesen, wurden die Daten nach der Vektorberechnung bereits vorbereitet. Wenn Sie also keine Zeit haben, gibt es meines Erachtens kein Problem, wenn Sie es verwenden.

Mehrfaches Hinzufügen erweiterter eindeutiger Ausdrucksbezeichnungen zu Wikipedia-Artikeln

Japanische Wikipedia So erstellen Sie einen Entitätsvektor

Es ist sehr einfach und leicht zu verstehen.

1: Teilen Sie WikiPedia-Daten mit Mecab usw. in Wörter. 2: Ersetzen Sie das Wort durch den Hyperlink in WikiPedia durch den Titel des Linkziels 3: Wenn ein Wort mit einem Hyperlink in WikiPedia erneut angezeigt wird, wird davon ausgegangen, dass der Hyperlink nicht angehängt ist, sodass dieselbe Verarbeitung wie in 2 ausgeführt wird. 4: Lernen Sie mit Word2Vec basierend auf der erhaltenen Wortgruppe.

Dies ermöglicht es, eindeutige Ausdrücke als Wörter zu extrahieren und sie realen Entitäten zuzuordnen (Entity Linking).

Japanisches Wikipedia-Implementierungsbeispiel unter Verwendung eines Entitätsvektors

Screen Shot 2016-07-30 at 3.01.35 PM.png

Das Obige ist ein Beispiel für die Systemimplementierung. Versuchen Sie, das verwandte Wort mithilfe des Wikipedia-Entitätsvektors aus dem Wort zu ermitteln. Der Code ist auf github veröffentlicht, daher werde ich nur die wichtigen Teile zitieren.

1: Sammle Twitter-Tweets (diesmal mit Rinnas Daten) 2: Mach die Teilung 3: Extrahieren Sie eindeutige Ausdrücke mit Wikification 4: Japanische Wikipedia Vektor mit Entitätsvektor hinzufügen 5: Berechnen Sie die Kosinusähnlichkeit und geben Sie die mit hoher Ähnlichkeit als Synonym an.

Der Code ist einfach, siehe unten.

https://github.com/SnowMasaya/WikiPedia_Entity_Vector_Get_Similarity_word

Einfallsreichtum für die Beschleunigung

Einfallsreichtum 1: Verwenden Sie OpenBlas direkt

Ich berechne die Kosinusähnlichkeit, aber da die Berechnungskosten hoch sind, werde ich versuchen, diesen Teil zu beschleunigen.

Da es schwierig ist, OpenBlas zum Beschleunigen zu verwenden, werde ich einen Kommentar schreiben. Installieren Sie bei der Installation auf einem Mac den folgenden Befehl.

brew install openblas 

Nachfolgend geben Sie an, in welchem Verzeichnis sich die openblas-Bibliothek befindet.

[openblas]
libraries = openblas
library_dirs = /usr/local/opt/openblas/lib
include_dirs = /usr/local/opt/openblas/include

Der Effekt ist unbekannt, da er nach Cython-Typ berechnet wird. Überprüfen Sie jedoch zunächst, ob das Speicherlayout des Vektors, der die Kosinusähnlichkeit berechnet, mit dem folgenden Code im C-Stil vorliegt.

Der Grund für diese Überprüfung ist, dass Blas eine Kopierverarbeitung durchführt, wenn das Layout des Vektorspeichers im C-Stil ist, aber selbst im Fall des Fortran-Stils beschleunigt es sich, außer bei unnötiger Verarbeitung, indem nicht dieselbe Verarbeitung durchgeführt wird. Weil.

    def __force_forder(self, x):
        """
        Converts array x to fortran order Returns a tuple in the form (x is transposed)
        :param x(vector):
        :return:
        """
        if x.flags.c_contiguous:
            return (x.T, True)
        else:
            return (x, False)

Als nächstes wird das innere Produkt der Vektoren mit dem folgenden Code berechnet. Nach Überprüfung des Vektortyps, wenn es sich um einen C-Typ handelt, wird klar angegeben, dass eine Konvertierungsverarbeitung vorliegt. Wenn der Vektortyp Fortran ist, ist keine Konvertierungsverarbeitung erforderlich und die Berechnung kann mit hoher Geschwindigkeit durchgeführt werden.

def __faster_dot(self, A, B):
        """
        Use blas libraries directory to perform dot product
        Reference:
            https://www.huyng.com/posts/faster-numpy-dot-product
            http://stackoverflow.com/questions/9478791/is-there-an-enhanced-numpy-scipy-dot-method
        :param A(mat): vector
        :param B(mat): vector
        :return:
        """
        A, trans_a = self.__force_forder(A)
        B, trans_b = self.__force_forder(B)

        return FB.dgemm(alpha=1.0, a=A, b=B, trans_a=trans_a, trans_b=trans_b)

Ingenuity 2: Thread-basierte parallele verteilte Verarbeitung

Die Berechnung der Kosinusähnlichkeit ist ebenfalls ein Engpass, aber es dauert viel Zeit, denselben Vorgang viele Male auszuführen, da die Anzahl der in WikiPediaEntityVector registrierten Wörter groß ist.

Da Python im Grunde genommen in einem einzigen Prozess ausgeführt wird, habe ich versucht, es durch die Implementierung einer threadbasierten Parallelverarbeitung zu beschleunigen.

Ich verwende das Producer Consumer-Muster mit Queue. In diesem Fall ist die Verarbeitung des Verbrauchers sehr umfangreich. Daher haben wir versucht, die Anzahl der dem Verbraucher zugewiesenen Threads zu erhöhen. Die Größe des Verbrauchers wird festgelegt, und es werden Threads erstellt, damit diese Größe funktioniert.

for index in range(args.consumer_size):
        multi_thread_consumer_crawl_instance = threading.Thread(target=producerConsumer.consumer_run, name=consumer_name + str(index))
        multi_thread_consumer_crawl_instance.start()

Beispiel Ergebnis

Ursprünglicher Eigenausdruck: [Computational Synonyme]

Im Folgenden sehen Sie, dass Wörter verwendet werden, die mit einer einfachen Keyword-Übereinstimmung schwer zu verstehen sind, aber eine hohe Relevanz haben.

'Akita': ['Nagano', 'Fukushima', 'Kochi', 'Iwate', 'Yamagata', 'Niigata', 'Aomori', 'Kumamoto', 'Morioka'], 

'hundert': ['hundert', 'Zehn', 'tausend'],

'Godzilla': ['Godzilla_(1954 Film)', 'Godzilla_(Fiktives Monster)', 'Gamera'], 

'3': ['4', '6', '5', '0', '7', '8', '9', '2', '1'],

'rot': ['lila', 'Grün', 'Grün', 'Zinnober', 'schwarz', 'rot色', 'Blau', 'Weiß', 'Gelb', 'Indigo', 'Blau']

'Schwein': ['Kuh', 'Schaf', 'Schaf', 'Hähnchen', 'Ziege', 'Hähnchen', '山Schaf', 'Schwein', 'Kuh'], 

'Golf': ['Bowling'], 

'Bambus': ['Weide', 'Kiefer']

'5': ['4', '6', '0', '7', '3', '8', '9', '2', '1'], 

'Ast': ['Stengel', 'Blatt', 'Astは'],

'Holz': ['Zeder', 'Kashi', 'Stumpf', '松のHolz'],

'Hmm': ['Stift', 'Gyu'], 

'Schüler': ['Schüler', '大Schüler'],

'Mochi': ['Manju', 'Sake Flasche', 'roter Reis', 'Ei', 'Shinshu', 'Haferbrei', 'Azuki', 'Knödel'],

'Taille': ['Gesäß', 'Knie', 'Hacke', 'Schulter'], 

'Bart': ['口Bart', 'Bart', '口Bart', 'Bart', 'Bart', 'Haar', 'あごBart'], 

'Katze': ['Kleiner Vogel', 'Katze', '仔Katze', 'Maus oder Ratte'], 

'China': ['Taiwan', 'Korea', 'Korea', 'Volksrepublik China'],

'zwei': ['Fünf', 'Zwei', 'Zwei', 'drei'], 

'Yukata': ['Yukata', 'Alltagskleidung', 'Reines Weiß', 'Trauerkleidung', 'Kimono', 'Smoking', 'Alltagskleidung', 'Reines Weiß', 'Trauerkleidung', 'Kimono', 'Smoking'], 

'Baseball': ['Rugby'],

'Haar': ['頭Haar', '黒Haar', '長Haar', 'Bart', 'Haarの毛', '前Haar', '金Haar', 'Haar型'],

'Herbst': ['Herbst', 'Sommer-', 'Frühling', 'Sommer-', 'Frühling'],

'Nara': ['Wakayama']

wichtiger Punkt

Da der richtige Ausdruck durch Wikification dargestellt wird, hängt er von Wikipedia ab. Der Datenwissensraum basiert auf WikiPedia. Es ist besser, es nicht zu verwenden, wenn die Branche etwas Besonderes ist oder wenn es viele seltene Fälle gibt. Im japanischen Wikipedia-Entitätsvektor werden Hyperlinkwörter durch "<< word >>" dargestellt, sodass eine andere Verarbeitung als "<< >>" erforderlich ist. Es verbraucht viel Speicher. Die Berechnungszeit ist ebenfalls sehr lang. Wenn der ursprüngliche eindeutige Ausdruck 192 Wörter umfasst, dauert es ungefähr 3 Stunden, um mit einem einzelnen Thread in einem einzelnen Prozess zu arbeiten. Da jedoch für jeden eindeutigen Ausdruck dieselbe Verarbeitung ausgeführt wird, ist es schneller, wenn eine parallele verteilte Verarbeitung ausgeführt wird.

Referenz

Entitätsverknüpfung unter Verwendung der Wissensdatenbank

Yamada123, Ikuya, Hideaki Takeda, and Yoshiyasu Takefuji. "Enhancing Named Entity Recognition in Twitter Messages Using Entity Linking." ACL-IJCNLP 2015 (2015): 136.

Faster numpy dot product for multi-dimensional arrays

scipy.linalg.blas.ddot

numpy.ndarray.flags

Is there an “enhanced” numpy/scipy dot method?

models.word2vec – Deep learning with word2vec

Recommended Posts

Für diejenigen, die eine Verarbeitung in natürlicher Sprache mit dem Wissen von WikiPedia durchführen möchten, das über den einfachen Keyword-Abgleich hinausgeht
Lose Artikel für diejenigen, die mit der Verarbeitung natürlicher Sprache beginnen möchten
Treten Sie Azure mit Go ~ bei Für diejenigen, die Azure mit Go ~ starten und kennenlernen möchten
5 Gründe, warum die Verarbeitung für diejenigen nützlich ist, die mit Python beginnen möchten
[Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)
Für diejenigen, die Python mit vim schreiben möchten
[Für diejenigen, die TPU verwenden möchten] Ich habe versucht, die Tensorflow Object Detection API 2 zu verwenden
Für diejenigen, die mit TensorFlow2 maschinelles Lernen beginnen möchten
Referenz Referenz für diejenigen, die mit Rhinoceros / Grasshopper codieren möchten
[Verarbeitung natürlicher Sprache] Ich möchte einen Ingenieur treffen, der seinen Job wechselt (oder kurz zuvor).
[Kurzer Satz] easygui für diejenigen, die sehr einfach eine einfache GUI mit Python verwenden möchten
PyPI-Registrierungsverfahren für diejenigen, die ihr PyPI-Debüt geben möchten
Python-Technik für diejenigen, die Anfänger loswerden wollen
Ich habe einen Freund gefragt, der in einem sehr bekannten IT-Unternehmen im Bereich maschinelles Lernen arbeitet. Maschinelles Lernen (Verarbeitung natürlicher Sprache) Dinge, die ich zum Selbststudium lernen möchte