Dice Tech Jobs - Simon Hughes (Dice データ サイエンティスト) による「概念検索エンジン」を構築するための Dice.com のリポジトリ。このリポジトリには、一連のドキュメントで Thomas Mikolov の Word2Vec モデルをトレーニングするための Python コードが含まれています。このプロセスの出力は、検索エンジン内で概念的な検索機能を提供するいくつかの solr プラグインと組み合わせた同義語ファイルを使用して、solr (または他の検索エンジン) に埋め込むことができます。同義語ファイルをサポートしている場合、出力は他の検索エンジン内でも使用できます。概念検索はセマンティック検索とも呼ばれ、キーワードではなくドメイン内の概念全体を照合することを学習して、再現率を向上させます。
この作業を拡張する私の「Vectors in Search」リポジトリもチェックしてください。この講演のスライドとビデオへのリンクも含まれています。
スクリプトには、ドキュメントの前処理とトークン化、ドキュメントの頻度に基づいた一般的な用語やフレーズの抽出、gensim 実装を使用した word2vec モデルのトレーニング、sci-kit learn のクラスタリング ライブラリを使用した結果の単語ベクトルのクラスタリングを行うコードが含まれています。 Python スクリプトは、いくつかのカスタム dice solr プラグインと組み合わせると、solr 内で概念的な検索機能を有効にするために使用できる、多数の solr 同義語ファイルを出力します。
Apache Solr 検索エンジン内で学習されたベクトルと同義語ファイルを利用するための solr プラグインについては、https://github.com/DiceTechJobs/SolrPlugins を参照してください。
プラグインの設定など、solr 内で概念検索を構成するための solr 構成エントリの例については、https://github.com/DiceTechJobs/SolrConfigExamples を参照してください。
スクリプトは Jupyter Python ノートブックの形式で、順番に (1、2、3 および 4 のいずれか) 実行されます。Jupyter を使用したくない場合は、別個のコマンド ライン スクリプト (以下を参照) として実行されます。 Python スクリプトはよりクリーンで、必要な設定をすべて含む共通の構成ファイルを共有し、シェルから実行するように設計されているため、おそらく から始めるのが簡単です。これらのノートブックとスクリプトはドキュメントを前処理し、Word2Vec モデルをトレーニングします。 ./Settings フォルダーには、各スクリプトのサンプル構成ファイルが含まれており、各設定の説明がコメントに記載されています。コマンドライン スクリプトを呼び出すには、関連する設定ファイルを唯一のパラメータとして渡します。
python pre_process_documents.py ./Settings/pre_process_documents.cfg
コマンド ライン スクリプトは次の順序で実行する必要があります。
pre_process_documents.py - これは、いくつかの句読点文字 (カンマ、ハイフンなど) を取り除き、必要に応じて HTML を解析し、ドキュメント内の文を分離するために必要です。この手順をスキップして 2 または 3 に進みたい場合は、削除したい句読点を取り除き、新しい文をすべて別の行に配置した一連のファイルを手順 2 と 3 に提供します。
extract_keywords.py - (オプション) ドメインから適切かつ広範なキーフレーズのセット (たとえば、上位 5,000 の検索キーワードとフレーズ、重要な部分はフレーズ) がない場合、またはこのリストを超えて範囲を拡大したい場合は、次のコマンドを実行します。このスクリプトは、指定されたドキュメント頻度しきい値を超えるすべてのキーワードとフレーズを抽出します。
train_word2vec_model.py - 1 での前処理されたドキュメントで Word2Vec モデルをトレーニングして保存します。 2 で出力されたものなど、一連のキーワードとフレーズを使用します。注意してください- このモデルは非常に高速ですが、実行するには C コンパイラが必要ですC バージョンを内部で使用するために利用可能でプリインストールされています。それ以外の場合は、はるかに遅い Python 実装が使用されます。これが利用できない場合は、モデルが最初にトレーニングされるときに実行時警告が表示されます。
このステップには、目的のソリューションに応じて複数のファイルが含まれています (私の講演を参照)。
ベクトル出力 - 近日公開予定! Jupyter Notebook 4.a を参照してください。
generate_topn_synonyms_file.py - 各ターゲットのキーワードまたはフレーズの上位 n 個の同義語を生成します。これにより、ペイロードを含むファイルとペイロードを含まないファイルの 2 つのファイルが生成されます。最も単純な使用例は、ペイロードなしでファイルを使用することです。ペイロード ファイルを使用して、類似性によって同義語に重み付けを行うと、パフォーマンスが向上します。これはクエリ時に queryboost パーサーを使用して実行できます。複数単語の同義語の問題を回避するために空白をカンマに置き換えるので、これを行うには、クエリ時にカンマと空白をトークン化する必要があることに注意してください。あるいは (推奨)、インデックス時に同義語拡張を使用し、PayloadEdismax クエリ パーサー、PayloadAwareDefaultSimilarity クラス (デフォルトの類似度として使用するか、スキーマ類似度を使用してフィールドごとに構成する) を使用し、これらのフィールドの fieldType に用語「ペイロード」が含まれていることを確認します。または「ベクトル」。
generate_cluster_synonyms_file.py - 前の手順で生成された単語ベクトルから k 個のクラスターを生成します。これらはシノニム ファイルを介して solr に直接埋め込むことができます。特別なプラグインは必要ありません。さまざまなサイズの同義語の異なるクラスターを多数生成し、それらを小さなクラスターに適用されるより高いフィールドの重みを持つ個別のフィールドとして構成することをお勧めします (つまり、より大きな k 値で生成されます)。
Python 2.7.10を使用して構築されています。 Python 3 では未テスト
Word2Vec の実装は、優れた gensim パッケージの実装です。 LSA、LDA、Word2Vec、およびその他の機械学習アルゴリズムの高速実装が含まれています。
https://radimrehurek.com/gensim/models/word2vec.html
これは、トピックのモデリング、および文書と単語の意味表現の学習に最適なパッケージです。
Google は、Google ニュース コーパスの 1,000 億語に基づいてトレーニングされた一連の事前トレーニング済み単語ベクトルをリリースしました。特殊なドメインではなく、ニュース検索エンジンを構築している企業 (ロイター、ブルームバーグ、政府機関など) など、非常に幅広いドキュメントに焦点を当てている場合は、この事前トレーニングされたモデルを使用するだけで済みます。その代わり。その後、最初の 3 つのステップをスキップして、事前トレーニングされたモデルを取得して出力シノニム ファイルを計算する上記のステップ 4 スクリプトのいずれかの使用に直接進むことができます。必要なのはそれだけです。この投稿では、事前トレーニング済みベクトルを入手できる場所について説明します: https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg。その後、gensim の Word2Vec の model.load 機能を使用できます。
model = Word2Vec . load ( MODEL_FILE )
Solr クラウドを使用している場合、Zookeeper は構成ファイルのサイズが 1M を超えることを好みません。したがって、生成された同義語ファイルがこれより大きい場合は、1) デフォルトの Zookeeper 設定を変更する、2) 同義語ファイルを複数のファイルに分割し、同義語フィルターを順番に適用する、または 3) 次のいずれかを使用してデータベースから同義語をロードする必要があります。プラグイン (例: https://github.com/shopping24/solr-jdbc-synonyms)
スタンフォード大学の NLP ボフィンは、Word2Vec と同等の精度で競合する単語ベクトル学習アルゴリズムを開発しました。それを実験したい場合は、この Python パッケージを使用するとそれが可能になります: https://github.com/hans/glove.py ただし、私はそれを試していないため、現時点では保証できません。
最初のスクリプトでは、生の *.txt または html ファイルを含むフォルダーが必要です。 HTML コンテンツがある場合は、スクリプト内に HTML を解析するためのロジックがありますが、美しいスープは少し不安定になる可能性があるため、パイプラインに送信する前に、まず事前に解析した方がよい場合があります。特別なファイル形式がないことに注意してください。これは、このスクリプトを実行しようとするときにほとんどの人が直面する問題と思われます。ファイルのロードでエラーが発生した場合は、ノートブックではなく Python スクリプトを使用し、デバッガーを開いて何が起こっているかを確認することをお勧めします。また、https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg で、ロードするファイルと一致するように config.file_mask を設定していることを確認してください。これはデフォルトで .*.txt (ファイル BLOB ではなく正規表現です) であるため、ファイルが .txt ファイルでない場合はこれを変更する必要があります。
ご質問、バグ、機能リクエストがございましたら、問題リストに @mention (@simonhughes22) を付けて投稿してください。質問が記載されたメールがタイムリーに届きます。このリポジトリについての質問を私に直接メールで送ってくださった方も何人かいらっしゃいました。メールに返信することは構いませんが、代わりに GitHub の問題を送信し、私に @メンションしてください。こうすることで、他の誰もが質問と私の回答を将来の参考のために見ることができます。
最近、Vector Search について講演しました。コードは以下です。これは、私が行った概念探索作業の自然な拡張です。
Solr プラグインをチェックしてください。