ตัวอย่างแอพที่มีวัตถุประสงค์เพื่อแสดงให้เห็นว่า การประมวลผลภาษาธรรมชาติ (NLP) โดยเฉพาะ การจดจำเอนทิตี (NER) สามารถใช้เพื่อปรับปรุงความแม่นยำของการสืบค้น ElasticSearch และประสบการณ์ผู้ใช้โดยรวม มีประโยชน์หลักสองประการในการใช้ NLP ควบคู่ไปกับ Elasticsearch (หรือเครื่องมือค้นหาข้อความแบบเต็มอื่น ๆ ):
ด้วยการสืบค้น 'แจ็คเก็ตสีดำราคาน้อยกว่า $ 200' เราสามารถอนุมานราคาสีและสูงสุดและใช้ตัวกรองการค้นหาเหล่านี้สำหรับผู้ใช้ แนวคิดนี้สามารถขยายไปยังสาขาอื่น ๆ (เช่นแบรนด์) และยังสนับสนุนการผันคำกริยาเช่น แจ็คเก็ตบาร์เบอร์สีดำหรือสีเขียวเข้ม '
ลองนึกภาพคุณทำงานกับร้านขายเสื้อผ้าและอุปกรณ์กลางแจ้ง คุณกำลังสร้างคุณสมบัติการค้นหาแคตตาล็อก เมื่อพิจารณาจากการสืบค้น 'แจ็คเก็ตที่บรรจุได้' ฐานข้อมูลควรเลือกระหว่าง 'Net Mosquito ที่บรรจุได้' และ 'แจ็คเก็ตน้ำหนักเบา' อย่างไร ผลิตภัณฑ์ทั้งสองตรงกับบางส่วน TF- IDF มักจะเลือก Mosquito Net เนื่องจากจะมีอินสแตนซ์ของ 'packable' น้อยกว่า 'แจ็คเก็ต' ในคลังข้อมูล อย่างไรก็ตามเมื่อดูแบบสอบถามเป็นที่ชัดเจนว่าแจ็คเก็ตที่มีน้ำหนักเบาจะเป็นคู่ที่ดีกว่า
โดยทั่วไปเราจะแก้ปัญหานี้โดยการเพิ่มฟิลด์เอกสารบางอย่างเช่นการแนบน้ำหนักกับฟิลด์ชื่อหรือประเภทผลิตภัณฑ์มากกว่าคำอธิบาย งานประเภทนี้ แต่ตรรกะนั้นผิด เรากำลังบอกนักช้อป "ตามสิ่งที่เราขายนี่คือสิ่งที่เราคิดว่าสำคัญสำหรับคุณ"
มนุษย์เข้าใจว่าได้รับการสืบค้น 'แจ็คเก็ตที่บรรจุได้' นักช้อปต้องการแจ็คเก็ตก่อนและสำคัญที่สุด นั่นเป็นเพราะเราเข้าใจว่า 'แจ็คเก็ต' เป็นประเภทผลิตภัณฑ์และ 'packable' เป็นคุณลักษณะของผลิตภัณฑ์ การประมวลผลภาษาธรรมชาติ (NLP) ช่วยให้เราสามารถใช้เหตุผลเดียวกันนี้โดยทางโปรแกรม กล่าวง่ายๆว่าเราสามารถทำการสืบค้นบูล Elasticsearch ที่เรา ต้อง มีการจับคู่สำหรับ 'แจ็คเก็ต' และ ควร มีการจับคู่สำหรับ 'packable'
ประการแรกและที่สำคัญที่สุดนี่ไม่ใช่การใช้งานการผลิต โมเดล NLP ที่ใช้สำหรับตัวอย่างนี้เป็นพื้นฐานจริงๆ สำหรับการใช้งานการผลิตเราจะสร้างบางสิ่งที่แข็งแกร่งกว่าได้รับการฝึกฝนด้วยข้อมูลการค้นหาในอดีต นอกจากนี้เรายังใช้ส่วนหนึ่งของการติดแท็กคำพูดพร้อมกับการแยกวิเคราะห์การพึ่งพาเพื่อให้เข้าใจประโยคและชิ้นส่วนของข้อความได้ดีขึ้น
ประการที่สองรหัส ElasticSearch เป็นพื้นฐานมาก สำหรับการใช้งานการผลิตเราต้องการใช้ tokenizers ที่กำหนดเองวิเคราะห์และคำพ้องความหมาย แน่นอนว่าเรามีฟิลด์อื่น ๆ อีกมากมายและมีเอกสารอีกมากมาย
ในที่สุดไม่มีการจัดการข้อผิดพลาด!
ดังนั้นโปรดปฏิบัติต่อสิ่งนี้ด้วยจิตวิญญาณที่สร้างขึ้น - หลักฐานของแนวคิด!
รหัส Python ต้องการสภาพแวดล้อม 3.9.7+ ฉันขอแนะนำให้เรียกใช้สิ่งนี้ใน VirtualEnV โดยใช้ VENV หรือ 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.txtฉันได้จัดเตรียมไฟล์ docker-compose.yml แล้วดังนั้นคุณสามารถยิงอินสแตนซ์ Elasticsearch ได้อย่างง่าย
$ docker-compose up -d elasticsearch-7การพึ่งพาและเส้นทางของ Python อาจเป็นเรื่องยุ่งยากดังนั้นฉันจึงให้ยูทิลิตี้ง่าย ๆ เพื่อตรวจสอบว่าทุกอย่างทำงานได้ตามที่คาดไว้ หมายเหตุ: 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
...ฉันสร้างสคริปต์เชลล์ wrapper เพื่อยิง 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:
{
"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_defaultฉันได้ให้ Dockerfile ในกรณีที่คุณต้องการเรียกใช้ทุกอย่างใน Docker
$ 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 '