Образец приложения предназначен для иллюстрации того, как обработка естественного языка (NLP) , специально названное распознавание объектов (NER), может использоваться для повышения точности запросов ElasticSearch и общего пользовательского опыта. Есть два ключевых преимущества для использования NLP вместе с Elasticsearch (или любой другой полной поисковой системой):
Учитывая запрос «Черная куртка стоимостью менее 200 долларов» , мы можем сделать вывод о цвете и максимальной цене и применить эти поисковые фильтры для пользователя. Эта концепция может быть расширена на другие области (например, бренд), а также поддерживать спряжения, например , «Черный или темно -зеленый куртка Barbour»
Представьте, что вы работаете в магазине открытой одежды и оборудования. Вы создаете функцию поиска в каталоге. Учитывая запрос «упакованная куртка», как база данных должна выбрать между «упакованной комарной сетью» и «легкой курткой». Оба продукта частично совпадают. TF- IDF , скорее всего, выберет сеть комаров, так как в корпусе будет меньше случаев «упаковки», чем «куртка». Однако, глядя на запрос, ясно, что легкая куртка будет лучшим матчем.
Обычно мы решаем эту проблему, увеличивая определенные поля документа, например, прикрепляя больший вес к полям титула или типа продукта, чем описание. Такого рода работает, но логика неверна. По сути, мы говорим покупателю: «Исходя из того, что мы продаем, это то, что мы считаем важным для вас».
Люди понимают, что, учитывая запрос «упакованная куртка», покупатель хочет в первую очередь куртку. Это потому, что мы понимаем, что «куртка» - это тип продукта, а «упакованный» - это атрибут продукта. Обработка естественного языка (NLP) позволяет нам программно применять та же самую рассуждения. Проще говоря, мы можем выполнить запрос Elasticsearch Bool, в котором мы должны подключиться к «куртке» и должны подключиться к «упаковке».
Во -первых, и самое главное, это не внедрение производства. Модель NLP, используемая для этого примера, действительно является основной. Для производства мы построим что -то гораздо более надежное, обученное историческим данным поиска. Мы также использовали часть речевого тега, а также анализ зависимости, чтобы лучше понять предложения и фрагменты текста.
Во -вторых, код Elasticsearch очень простой. Для производства мы хотели бы использовать пользовательские токенизаторы, анализаторы и синонимы. Конечно, у нас будет гораздо больше полей и гораздо больше документов.
Наконец, нет обработки ошибок!.
Поэтому, пожалуйста, относитесь к этому в духе, в котором он был создан - доказательство концепции!
Код 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
...Я создал сценарий оболочки обертки, чтобы запустить 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 '