Dice Tech Jobs – Dice.coms Repository zum Aufbau einer „konzeptionellen Suchmaschine“, von Simon Hughes (Dice Data Scientist). Dieses Repository enthält Python-Code zum Trainieren des Word2Vec-Modells von Thomas Mikolov anhand einer Reihe von Dokumenten. Die Ausgabe dieses Prozesses kann dann mithilfe von Synonymdateien in Kombination mit einigen Solr-Plug-Ins in Solr (oder eine andere Suchmaschine) eingebettet werden, um konzeptionelle Suchfunktionen innerhalb der Suchmaschine bereitzustellen. Die Ausgabe könnte auch in anderen Suchmaschinen verwendet werden, sofern diese Synonymdateien unterstützen. Die konzeptionelle Suche wird auch als semantische Suche bezeichnet und lernt, konzeptübergreifende Übereinstimmungen in einer Domäne anstelle von Schlüsselwörtern zu finden, um die Erinnerung zu verbessern.
Bitte schauen Sie sich auch mein Repo „Vectors in Search“ an, das diese Arbeit erweitert. Es enthält auch Links zu den Folien und Videos dieses Vortrags.
Die Skripte umfassen Code zum Vorverarbeiten und Tokenisieren von Dokumenten, zum Extrahieren gebräuchlicher Begriffe und Phrasen basierend auf der Dokumenthäufigkeit, zum Trainieren eines Word2vec-Modells mithilfe der Gensim-Implementierung und zum Clustern der resultierenden Wortvektoren mithilfe der Clustering-Bibliotheken von Sci-Kit Learn. Die Python-Skripte geben eine Reihe von Solr-Synonymdateien aus, die in Kombination mit einigen benutzerdefinierten Dice-Solr-Plugins verwendet werden können, um konzeptionelle Suchfunktionen in Solr zu ermöglichen.
Unter https://github.com/DiceTechJobs/SolrPlugins finden Sie Solr-Plugins zur Verwendung der erlernten Vektoren und Synonymdateien in einer Apache Solr-Suchmaschine
Unter https://github.com/DiceTechJobs/SolrConfigExamples finden Sie Beispiele für Solr-Konfigurationseinträge zum Konfigurieren der konzeptionellen Suche in Solr, einschließlich der Einrichtung der Plugins.
Die Skripte liegen in Form von Jupyter-Python-Notebooks vor, die in der Reihenfolge (1,2,3 und eine der 4) ausgeführt werden können, und als separate Befehlszeilenskripte (siehe unten), wenn Sie Jupyter nicht verwenden möchten. Die Python-Skripte sind sauberer und nutzen gemeinsame Konfigurationsdateien mit allen erforderlichen Einstellungen. Sie sind so konzipiert, dass sie über die Shell ausgeführt werden können, sodass der Einstieg wahrscheinlich einfacher ist . Diese Notizbücher und Skripte verarbeiten die Dokumente vor und trainieren das Word2Vec-Modell. Der Ordner ./Settings enthält Beispielkonfigurationsdateien für jedes Skript, mit einer Beschreibung jeder Einstellung in den Kommentaren. Um die Befehlszeilenskripte aufzurufen, übergeben Sie die zugehörige Konfigurationsdatei als einzigen Parameter, z. B
python pre_process_documents.py ./Settings/pre_process_documents.cfg
Die Befehlszeilenskripte sollten in der folgenden Reihenfolge ausgeführt werden:
pre_process_documents.py – Dies wird benötigt, um einige Satzzeichen (Komma, Bindestriche usw.) zu entfernen, bei Bedarf HTML zu analysieren und die Sätze im Dokument zu trennen. Wenn Sie diesen Schritt überspringen und mit Schritt 2 oder 3 fortfahren möchten, stellen Sie für die Schritte 2 und 3 eine Reihe von Dateien bereit, in denen alle zu entfernenden Satzzeichen entfernt sind und jeder neue Satz in einer separaten Zeile steht.
extract_keywords.py – (optional) Wenn Sie nicht über einen guten und umfangreichen Satz an Schlüsselwörtern aus Ihrer Domain verfügen (z. B. Ihre Top 5.000 Suchschlüsselwörter und -phrasen, wobei Phrasen der wichtigste Teil sind) oder Sie die Abdeckung über diese Liste hinaus erhöhen möchten, führen Sie dies aus Dieses Skript extrahiert alle Schlüsselwörter und Phrasen über einem angegebenen Schwellenwert für die Dokumenthäufigkeit.
train_word2vec_model.py – Trainiert und speichert das Word2Vec-Modell auf den vorverarbeiteten Dokumenten von 1. Verwendet eine Reihe von Schlüsselwörtern und Phrasen, wie z. B. die Ausgabe von 2. Bitte beachten Sie : Dieses Modell ist sehr schnell, erfordert aber einen C-Compiler verfügbar und vorinstalliert, um die C-Version im Hintergrund nutzen zu können, ansonsten wird die deutlich langsamere Python-Implementierung verwendet. Wenn dies nicht verfügbar ist, erhalten Sie beim ersten Training des Modells eine Laufzeitwarnung.
Dieser Schritt enthält je nach gewünschter Lösung mehrere Dateien (siehe meinen Vortrag):
Vektorausgabe – BALD ERHÄLTLICH! Siehe Jupyter Notebook 4.a
generic_topn_synonyms_file.py – Generiert die Top-n-Synonyme für jedes Zielschlüsselwort oder jede Zielphrase. Dadurch werden zwei Dateien generiert, eine Datei mit Payloads und eine Datei ohne. Der einfachste Anwendungsfall besteht darin, die Datei ohne Payloads zu verwenden. Eine bessere Leistung kann erzielt werden, wenn die Nutzlastdatei verwendet wird, um die Synonyme nach Ähnlichkeit zu gewichten. Dies kann zum Zeitpunkt der Abfrage mithilfe des Queryboost-Parsers erfolgen. Beachten Sie, dass Sie dazu zum Zeitpunkt der Abfrage Kommas und Leerzeichen tokenisieren müssen, da wir Leerzeichen durch Kommas ersetzen, um das Problem mit Synonymen aus mehreren Wörtern zu umgehen. Alternativ (und empfohlen) verwenden Sie die Synonymerweiterung zum Indexzeitpunkt zusammen mit dem PayloadEdismax-Abfrageparser und der PayloadAwareDefaultSimilarity-Klasse (verwenden Sie sie als Standardähnlichkeit oder verwenden Sie die Schemaähnlichkeit zur Konfiguration pro Feld) und stellen Sie sicher, dass der Feldtyp für diese Felder den Begriff „Nutzlast“ enthält. oder 'Vektor'.
generic_cluster_synonyms_file.py – Erzeugt k Cluster aus den in den vorherigen Schritten generierten Wortvektoren. Diese können über eine Synonymdatei direkt in solr eingebettet werden – es sind keine speziellen Plugins erforderlich. Ich würde empfehlen, mehrere verschiedene Cluster von Synonymen unterschiedlicher Größe zu generieren und diese als separate Felder mit höheren Feldgewichtungen zu konfigurieren, die auf die kleinen Cluster angewendet werden (dh mit einem größeren k-Wert generiert werden).
Gebaut mit Python 2.7.10. Ungetestet mit Python 3
Die Word2Vec-Implementierung ist die des hervorragenden Gensim-Pakets. Enthält schnelle Implementierungen von LSA, LDA, Word2Vec und einigen anderen Algorithmen für maschinelles Lernen.
https://radimrehurek.com/gensim/models/word2vec.html
Dies ist ein großartiges Paket für die Themenmodellierung und das Erlernen semantischer Darstellungen von Dokumenten und Wörtern.
Google hat eine Reihe vorab trainierter Wortvektoren veröffentlicht, die auf 100 Milliarden Wörtern des Google News-Korpus trainiert wurden. Für diejenigen unter Ihnen, die sich nicht auf einen speziellen Bereich, sondern auf eine sehr breite Palette von Dokumenten konzentrieren, wie z. B. Unternehmen, die eine Nachrichtensuchmaschine aufbauen (wie Reuters, Bloomberg, Regierungsbehörden usw.), können Sie einfach dieses vorab trainierte Modell verwenden stattdessen. Dann können Sie die ersten drei Schritte überspringen und direkt mit der Verwendung eines der oben genannten Schritt-4-Skripts fortfahren, die ein vorab trainiertes Modell verwenden und Ausgabesynonymdateien berechnen, und das ist alles, was Sie brauchen sollten. In diesem Beitrag wird beschrieben, wo Sie die vorab trainierten Vektoren erhalten: https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg. Anschließend können Sie die model.load-Funktionalität von gensim Word2Vec verwenden:
model = Word2Vec . load ( MODEL_FILE )
Wenn Sie die Solr-Cloud verwenden, möchte Zookeeper keine Konfigurationsdateien mit einer Größe von mehr als 1 MB. Wenn Ihre resultierenden Synonymdateien also größer sind, müssen Sie entweder 1) die Standardeinstellungen von zookeeper ändern, 2) die Synonymdatei in mehrere Dateien aufteilen und nacheinander Synonymfilter anwenden oder 3) Synonyme aus einer Datenbank laden ein Plugin (z. B. https://github.com/shopping24/solr-jdbc-synonyms)
Die NLP-Experten von Stanford haben einen mit Word2Vec konkurrierenden Wortvektor-Lernalgorithmus mit ähnlicher Genauigkeit entwickelt. Wenn Sie damit experimentieren möchten, können Sie dies mit diesem Python-Paket tun: https://github.com/hans/glove.py Ich habe das jedoch noch nicht ausprobiert, daher kann ich zum jetzigen Zeitpunkt nicht dafür bürgen.
Die ersten Skripte erwarten einen Ordner mit rohen *.txt- oder HTML-Dateien. Wenn Sie HTML-Inhalte haben, gibt es in den Skripten eine Logik zum Parsen des HTML-Codes, aber „Beautiful Soup“ kann etwas flockig sein, daher ist es möglicherweise besser, sie zuerst vorab zu parsen, bevor Sie sie durch die Pipeline schieben. Beachten Sie, dass es kein spezielles Dateiformat gibt. Dies scheint das Problem zu sein, das die meisten Leute haben, wenn sie versuchen, dieses Skript auszuführen. Wenn beim Laden der Dateien ein Fehler auftritt, würde ich vorschlagen, das Python-Skript und nicht das Notebook zu verwenden und den Debugger zu öffnen, um zu sehen, was passiert. Stellen Sie außerdem sicher, dass Sie die config.file_mask in https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg so einstellen, dass sie mit den Dateien übereinstimmt, die Sie laden möchten. Der Standardwert ist .*.txt (es ist ein regulärer Ausdruck, kein Datei-Blob). Sie müssen dies also ändern, wenn Ihre Dateien keine .txt-Dateien sind.
Bitte posten Sie alle Fragen, Fehler oder Funktionswünsche in der Problemliste und fügen Sie eine @Erwähnung hinzu – @simonhughes22, damit ich rechtzeitig eine E-Mail mit Ihren Fragen erhalte. Einige Leute haben mir direkt E-Mails mit Fragen zu diesem Repo geschickt. Obwohl es mir nichts ausmacht, auf E-Mails zu antworten, reichen Sie bitte stattdessen ein GitHub-Problem ein und @erwähnen Sie mich. Auf diese Weise können alle anderen die Frage und meine Antwort zum späteren Nachschlagen sehen.
Ich habe kürzlich einen Vortrag über die Vektorsuche gehalten, der Code ist unten aufgeführt. Dies ist eine natürliche Erweiterung meiner konzeptionellen Sucharbeit
Bitte schauen Sie sich unsere Solr-Plugins an: