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.
Wenn Sie den Code sofort überprüfen möchten, installieren Sie ihn bitte unten.
Code:
Benötigte Daten: --Daten, die Sie analysieren möchten
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.
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.
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.
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
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
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
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).
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
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)
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()
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']
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.
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
Is there an “enhanced” numpy/scipy dot method?
models.word2vec – Deep learning with word2vec
Recommended Posts