Contoh aplikasi yang dimaksudkan untuk menggambarkan bagaimana pemrosesan bahasa alami (NLP) , khususnya pengenalan entitas (NER) dapat digunakan untuk meningkatkan keakuratan kueri Elasticsearch dan pengalaman pengguna secara keseluruhan. Ada dua manfaat utama untuk menggunakan NLP bersama Elasticsearch (atau mesin pencari teks lengkap lainnya):
Mengingat query 'Black Jacket harganya kurang dari $ 200' , kami dapat menyimpulkan warna dan harga maksimal, dan menerapkan filter pencarian ini untuk pengguna. Konsep ini dapat diperluas ke bidang lain (misalnya merek) dan juga mendukung konjugasi misalnya 'jaket barbour hitam atau hijau gelap'
Bayangkan Anda bekerja untuk toko pakaian dan peralatan luar ruangan. Anda sedang membangun fitur pencarian katalog. Mengingat kueri 'jaket yang bisa dikemas', bagaimana seharusnya database memilih antara 'Net Mosquito yang dapat dikemas' dan 'jaket ringan'. Kedua produk sebagian cocok. TF- IDF kemungkinan besar akan memilih Net Mosquito karena akan ada lebih sedikit contoh 'paket' daripada 'jaket' dalam korpus. Namun ketika melihat kueri, jelas bahwa jaket ringan akan menjadi pertandingan yang lebih baik.
Kami biasanya menyelesaikan masalah ini dengan meningkatkan bidang dokumen tertentu misalnya dengan melampirkan lebih banyak bobot pada bidang judul atau jenis produk daripada deskripsi. Jenis ini berfungsi, tetapi logikanya salah. Kami pada dasarnya memberi tahu pembelanja "berdasarkan apa yang kami jual, inilah yang kami pikir penting bagi Anda".
Manusia memahami bahwa mengingat kueri 'jaket yang bisa dikemas', pembelanja menginginkan jaket pertama dan terutama. Itu karena kami memahami bahwa 'jaket' adalah jenis produk dan 'dikemas' adalah atribut produk. Natural Language Processing (NLP) memungkinkan kita untuk menerapkan penalaran yang sama secara terprogram ini. Dalam istilah sederhana kita dapat melakukan permintaan bool Elasticsearch di mana kita harus memiliki kecocokan untuk 'jaket' dan harus memiliki kecocokan untuk 'paket'.
Pertama, dan yang paling penting ini bukan implementasi produksi. Model NLP yang digunakan untuk contoh ini sangat mendasar. Untuk penggunaan produksi, kami akan membangun sesuatu yang jauh lebih kuat, dilatih dengan data pencarian bersejarah. Kami juga akan menggunakan bagian dari penandaan pidato bersama dengan penguraian ketergantungan untuk mendapatkan pemahaman yang lebih baik tentang kalimat dan fragmen teks.
Kedua, kode Elasticsearch sangat mendasar. Untuk penggunaan produksi, kami ingin menggunakan tokenizer khusus, analisis & sinonim. Tentu saja, kami memiliki lebih banyak bidang dan lebih banyak dokumen.
Akhirnya, tidak ada penanganan kesalahan!.
Jadi tolong perlakukan ini dalam semangat di mana itu dibuat - bukti konsep!
Kode Python membutuhkan lingkungan 3.9.7+. Saya sarankan menjalankan ini di VirtualEnv menggunakan VENV atau PyenV/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.txtSaya telah memberikan file docker-compose.yml, sehingga Anda dapat menyalakan contoh Elasticsearch sederhana
$ docker-compose up -d elasticsearch-7Ketergantungan dan jalur Python bisa rumit, jadi saya memberikan utilitas sederhana untuk memeriksa semuanya berfungsi seperti yang diharapkan. Catatan: Elasticsearch dapat membutuhkan waktu beberapa detik untuk online.
$ 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
...Saya membuat skrip shell pembungkus untuk menyalakan uvicorn/fastapi
$ bin/server.sh
uvicorn.error INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
...Buat permintaan Get ke http: // localhost: 8000 lulus tubuh JSON:
{
"query" : " lightweight black jacket less than $100 "
}Pos mungkin merupakan alat terbaik untuk ini, tetapi saya juga menyertakan klien sederhana:
$ 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 "
]
}
]
}PENTING: Jika Anda memilih untuk menggunakan skrip ini, Anda harus melampirkan permintaan pencarian Anda dalam satu kutipan untuk menghindari ekspansi variabel.
Tekan ctrl + c
Jangan khawatir tentang asyncio.exceptions.CancelledError - itu disebabkan oleh fitur pemuatan ulang panas dari server 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_defaultSaya telah memberikan dockerfile jika Anda ingin menjalankan semuanya di dalam Docker
$ docker build -t nlp-search-poc .Kemudian jalankan Elasticsearch dan server
$ docker-compose up -dJika Anda juga ingin menggunakan Docker untuk menelan data uji ke Elasticsearch, Anda dapat melakukannya:
$ docker run -it --rm --network nlp-search-poc_default -e " ELASTIC_SEARCH_HOST=elasticsearch-7 " nlp-search-poc " python " " -m " " src.tools " " reset "Catatan : Nama jaringan ditentukan oleh aturan jaringan Docker
Docker-compose.yml memaparkan port 8000 server, sehingga Anda dapat meminta sebelumnya:
$ python -m src.client ' packable jacket '