عينة من التطبيق يهدف إلى توضيح كيفية استخدام معالجة اللغة الطبيعية (NLP) ، على وجه التحديد التعرف على الكيان (NER) لتحسين دقة استفسارات Elasticsearch وتجربة المستخدم الإجمالية. هناك فوائد رئيسية لاستخدام NLP جنبًا إلى جنب مع Elasticsearch (أو أي محرك بحث كامل آخر):
بالنظر إلى الاستعلام "سترة سوداء تكلف أقل من 200 دولار" ، يمكننا استنتاج اللون والأسعار القصوى ، وتطبيق مرشحات البحث هذه للمستخدم. يمكن توسيع هذا المفهوم إلى مجالات أخرى (مثل العلامة التجارية) وأيضًا دعم الاقتران على سبيل المثال "سترة باربور سوداء أو داكنة"
تخيل أنك تعمل في متجر للملابس والمعدات في الهواء الطلق. أنت تقوم ببناء ميزة بحث الكتالوج. بالنظر إلى الاستعلام "سترة قابلة للتعبئة" ، كيف ينبغي أن تختار قاعدة البيانات بين "شبكة البعوض القابلة للتعبئة" و "سترة خفيفة الوزن". كلا المنتجين يتطابق جزئيا. من المرجح أن يختار TF- IDF شبكة البعوض حيث سيكون هناك حالات أقل من "قابلة للتعبئة" من "سترة" في المجموعة. ومع ذلك ، عند النظر إلى الاستعلام ، من الواضح أن السترة الخفيفة ستكون أفضل تطابق.
عادةً ما نقوم بحل هذه المشكلة عن طريق تعزيز بعض حقول المستندات على سبيل المثال عن طريق إرفاق المزيد من الوزن بالعنوان أو حقول نوع المنتج من الوصف. هذا النوع من الأعمال ، لكن المنطق خاطئ. نحن نخبر المتسوق بشكل أساسي "بناءً على ما نبيعه ، هذا ما نعتقد أنه مهم بالنسبة لك".
يدرك البشر أنه بالنظر إلى الاستعلام "سترة قابلة للتعبئة" ، يريد المتسوق سترة أولاً وقبل كل شيء. ذلك لأننا نفهم أن "سترة" نوع من المنتجات و "قابلة للتعبئة" هي سمة للمنتج. تتيح لنا معالجة اللغة الطبيعية (NLP) تطبيق هذا المنطق نفسه برمجياً. بعبارات بسيطة ، يمكننا القيام باستعلام منطقي Elasticsearch الذي يجب أن يكون لدينا مطابقة لـ "سترة" ويجب أن يكون لدينا مطابقة لـ "قابلة للتعبئة".
أولاً ، والأهم من ذلك أن هذا ليس تطبيقًا للإنتاج. نموذج NLP المستخدم لهذا المثال أساسي حقًا. لاستخدام الإنتاج ، سنبني شيئًا أكثر قوة ، مدربون على بيانات البحث التاريخية. كنا نستخدم أيضًا جزءًا من علامات الكلام إلى جانب تحليل التبعية للحصول على فهم أفضل للجمل وشظايا النص.
ثانياً ، رمز Elasticsearch أساسي للغاية. لاستخدام الإنتاج ، نريد استخدام المميزات المخصصة والمحللين والمرادفات. بالطبع ، سيكون لدينا العديد من الحقول والمزيد من المستندات.
أخيرًا ، لا يوجد خطأ في التعامل معها!.
لذا يرجى التعامل مع هذا بالروح التي تم إنشاؤها بها - دليل على المفهوم!
كود بيثون يحتاج إلى بيئة 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-corm.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
...لقد قمت بإنشاء برنامج نصي غلاف Shell لإطلاق 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 "
}من المحتمل أن يكون Postman أفضل أداة لهذا الغرض ، لكنني قمت أيضًا بتضمين عميل بسيط:
$ 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 + ج
لا تقلق بشأن 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-corm.yml يعرض منفذ الخادم 8000 ، حتى تتمكن من الاستعلام كما كان من قبل:
$ python -m src.client ' packable jacket '