特に名前が付けられたエンティティ認識(NER)を使用して、Elasticsearchクエリの精度とユーザーエクスペリエンス全体を改善するために、自然言語処理(NLP)をどのように使用できるかを示すためのサンプルアプリ。 Elasticsearch(またはその他のフルテキスト検索エンジン)と一緒にNLPを使用することには、2つの重要な利点があります。
クエリ「$ 200未満の黒いジャケット」を考えると、色と最大価格を推測し、これらの検索フィルターをユーザーに適用できます。このコンセプトは他のフィールド(ブランドなど)に拡張でき、 「ブラックまたはダークグリーンのバーバージャケット」などの共役もサポートできます。
屋外の衣料品や装備店で働いていると想像してください。カタログ検索機能を構築しています。クエリ「パック可能なジャケット」を考えると、データベースは「パック可能な蚊ネット」と「軽量ジャケット」をどのように選択する必要がありますか。両方の製品は部分的に一致します。 TF- IDFは、コーパスの「ジャケット」よりも「パッケージ」のインスタンスが少ないため、蚊帳を選択する可能性が最も高くなります。ただし、クエリを見ると、軽量のジャケットがより良いマッチになることは明らかです。
通常、特定のドキュメントフィールドなどを高めることにより、この問題を解決します。この種の機能ですが、ロジックは間違っています。私たちは本質的に買い物客に「私たちが販売するものに基づいて、これがあなたにとって重要だと思うものだ」と言っています。
人間は、クエリ「パッケージジャケット」を考えると、買い物客は何よりもまずジャケットを望んでいることを理解しています。それは、「ジャケット」が製品タイプであり、「パッケージ可能」が製品の属性であることを理解しているからです。 Natural Language Processing(NLP)により、この同じ推論をプログラムで適用することができます。簡単に言えば、「ジャケット」と一致する必要があり、「パック可能」とマッチする必要があるElasticSearch Boolクエリを実行できます。
第一に、そして最も重要なことは、これが制作の実装ではないことです。この例で使用されるNLPモデルは本当に基本的です。生産の使用のために、歴史的な検索データで訓練された、はるかに堅牢なものを構築します。また、テキストの文章と断片をよりよく理解するために、依存関係とともに音声タグ付けの一部を使用します。
第二に、ElasticSearchコードは非常に基本的です。生産の使用には、カスタムトークンザー、アナライザー、同義語を使用する必要があります。もちろん、さらに多くのフィールドとさらに多くのドキュメントがあります。
最後に、エラー処理はありません!
それで、これを作成された精神でこれを扱ってください -概念の証明!
Pythonコードには3.9.7+環境が必要です。 venvまたはpyenv/virtualenvのいずれかを使用して、これをvirtualenvで実行することをお勧めします
$ pyenv install 3.9.7
$ pyenv virtualenv 3.9.7 nlp-search-poc
$ pyenv local nlp-search-poc
$ pip install -U pip
$ pip install -r requirements.txtdocker-compose.ymlファイルを提供したので、簡単なElasticsearchインスタンスを起動できます
$ docker-compose up -d elasticsearch-7Pythonの依存関係とパスは難しい場合があるため、すべてが期待どおりに機能していることを確認するための簡単なユーティリティを提供しました。注: ElasticSearchは、オンラインになるまでに数秒かかる場合があります。
$ python -m src.tools ping
Elasticsearch alive: True$ python -m src.tools create
productRepository INFO Creating products index
productRepository INFO products created
$ python -m src.tools ingest
productRepository INFO Ingesting lightweight black jacket
productRepository INFO Ingesting midweight black jacket
...Uvicorn/Fastapiを起動するためにラッパーシェルスクリプトを作成しました
$ bin/server.sh
uvicorn.error INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
...http:// localhost:8000にjsonボディを渡すget requestを作成します。
{
"query" : " lightweight black jacket less than $100 "
}郵便配達員はおそらくこれに最適なツールですが、シンプルなクライアントも含めました。
$ python -m src.client ' lightweight black jacket less than $100 ' {
"ner_prediction" : {
"text" : " lightweight black jacket less than $100 " ,
"product" : " jacket " ,
"price_from" : null ,
"price_to" : 100 ,
"colors" : [
" black "
],
"attrs" : [
" lightweight "
]
},
"results" : [
{
"title" : " lightweight black jacket " ,
"product_type" : " jacket " ,
"price" : 100 ,
"colors" : [
" black "
],
"attrs" : [
" lightweight "
]
}
]
}重要:このスクリプトを使用することを選択した場合は、可変拡張を避けるために、単一の引用符で検索クエリを囲む必要があります。
Ctrl + cをヒットします
asyncio.exceptions.CancelledErrorについて心配しないでください - それはUvicornサーバーのホットなリロード機能によって引き起こされます。
$ python -m src.tools drop
productRepository INFO Dropping products index
productRepository INFO products dropped$ docker-compose down
Stopping elasticsearch-7 ... done
Removing elasticsearch-7 ... done
Removing network nlp-search-poc_defaultDocker内ですべてを実行したい場合に備えて、DockerFileを提供しました
$ docker build -t nlp-search-poc .次に、ElasticSearchとサーバーを実行します
$ docker-compose up -dまた、Dockerを使用してテストデータをElasticSearchに摂取したい場合は、そうすることができます。
$ docker run -it --rm --network nlp-search-poc_default -e " ELASTIC_SEARCH_HOST=elasticsearch-7 " nlp-search-poc " python " " -m " " src.tools " " reset "注:ネットワーク名はDockerのネットワーキングルールによって決定されます
docker-compose.ymlはサーバーのポート8000を公開するため、以前と同じようにクエリすることができます。
$ python -m src.client ' packable jacket '