Рубрики
Без рубрики

Добавить семантический поиск на elasticsearch

В этой статье является частью серии учебников на TXTAI, семантической поисковой платформе AI. Часть 2 … с меткой MachineLearning, NLP, Python, Showdev.

Учебник серии на TXTAI (21 часть серии)

Эта статья является частью серии учебников на TXTAI платформа семантической поисковой платформы AI.

Часть 2 и часть 3 этой серии показали, как индексировать и поискать данные в TXTAI. Часть 2 Индексирована и обыскала обнимающий набор данных, часть 3, проиндексировал и искал внешний источник данных.

TXTAI – это модульная в дизайне, его компоненты могут быть использованы индивидуально. TXTAI имеет функцию сходства, которая работает над списками текста. Этот метод может быть интегрирован с любой внешней службой поиска, такой как API для отдыха, запрос SQL или что-то еще, что возвращает результаты текстовых поисков.

В этой статье мы возьмем одинаковую обнимающую набор данных для лица, используемого в части 2, индексируйте его в Elasticsearch и ранжируйте результаты поиска, используя функцию семантического сходства от TXTAI.

Установить TXTAI , наборы данных и Elasticsearch Отказ

# Install txtai, datasets and elasticsearch python client
pip install txtai datasets elasticsearch

# Download and extract elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz
chown -R daemon:daemon elasticsearch-7.10.1

Начните экземпляр elasticsearch.

import os
from subprocess import Popen, PIPE, STDOUT

# Start and wait for server
server = Popen(['elasticsearch-7.10.1/bin/elasticsearch'], stdout=PIPE, stderr=STDOUT, preexec_fn=lambda: os.setuid(1))
sleep 30

Следующий блок загружает набор данных в elasticsearch.

from datasets import load_dataset

from elasticsearch import Elasticsearch, helpers

# Connect to ES instance
es = Elasticsearch(hosts=["http://localhost:9200"], timeout=60, retry_on_timeout=True)

# Load HF dataset
dataset = load_dataset("ag_news", split="train")["text"][:50000]

# Elasticsearch bulk buffer
buffer = []
rows = 0

for x, text in enumerate(dataset):
  # Article record
  article = {"_id": x, "_index": "articles", "title": text}

  # Buffer article
  buffer.append(article)

  # Increment number of articles processed
  rows += 1

  # Bulk load every 1000 records
  if rows % 1000 == 0:
    helpers.bulk(es, buffer)
    buffer = []

    print("Inserted {} articles".format(rows), end="\r")

if buffer:
  helpers.bulk(es, buffer)

print("Total articles inserted: {}".format(rows))
Total articles inserted: 50000

Elasticsearch – это поисковая система на основе токена. Запросы и документы проанализируются в токены, а наиболее актуальные совпадения документами запросов рассчитываются с использованием алгоритма оценки. Алгоритм оценки по умолчанию – BM25 Отказ Мощные запросы могут быть построены с помощью Богатый запрос синтаксис и Запрос DSL Отказ

В следующем разделе выполняется запрос на elasticsearch, находит 5 лучших совпадений и возвращает соответствующие документы, связанные с каждым матчм.

from IPython.display import display, HTML

def table(category, query, rows):
    html = """
    
    """

    html += "

[%s] %s

" % (category, query) for score, text in rows: html += "" % (score, text) html += "
ScoreText
%.4f%s
" display(HTML(html)) def search(query, limit): query = { "size": limit, "query": { "query_string": {"query": query} } } results = [] for result in es.search(index="articles", body=query)["hits"]["hits"]: source = result["_source"] results.append((min(result["_score"], 18) / 18, source["title"])) return results limit = 3 query= "+yankees lose" table("Elasticsearch", query, search(query, limit))

[Elasticsearch] + Yankees проигрывает

Эль Дук добавляет к мрачному NY прогнозу Янки # 39; Инфекция персонала распространилась на одного человека, которую команда может позволить себе потерять. Орландо Хернандес был поцарапан с прошлой ночи # 39; запланированное начало, потому что 0.5817
Рейнджерс сортирует красный Сокс Red Sox проигрывает впервые в 11 играх, падая на рейнджеров 8-6 субботу и не пропустил возможность вытащить в 1 1/2 игры янки на востоке Al. 0.5697
Route оставляет Янки # 39; Ведущий на 3 Royals усиливает контроль с 10-прогон 5-го против нечего теряющего команды, такой как kansas City Royals, Yankees # 39; Менеджер хотел, чтобы его команда рано опустила молоток и не пусть бейсбол № 39; вторая худшая команда считает, что у него есть шанс. 0.5069

В таблице выше показаны результаты для запроса + Янки теряют Отказ Этот запрос требует токена янки . Поиск не понимает семантического значения запроса. Он возвращает наиболее актуальные результаты с этими двумя токенами.

В этом случае мы видим, результаты не снимают значение поиска. Давайте попробуем добавить семантическое сходство на поиск!

TXTAI имеет модуль сходства, который вычисляет сходство между запросом и списком строк. Конечно, TXTAI также может построить полный индекс, как показано в предыдущих статьях, но в этом случае мы просто будем использовать функцию сходства Ad-Hoc.

Ниже приведен код сходства и определяет функцию ранжирования для заказа результатов поиска на основе вычисленного сходства.

Ranksearch requies Elasticsearch для более широкого набора результатов, занимает результаты с использованием экземпляра сходства и возвращает TOP N результатов.

from txtai.pipeline import Similarity

def ranksearch(query, limit):
  results = [text for _, text in search(query, limit * 10)]
  return [(score, results[x]) for x, score in similarity(query, results)][:limit]

# Create similarity instance for re-ranking
similarity = Similarity("valhalla/distilbart-mnli-12-3")

Теперь давайте повторно запустите предыдущий поиск.

# Run the search
table("Elasticsearch + txtai", query, ranksearch(query, limit))

[Elasticsearch + TXTAI] + Янки теряют

Ох! Янки ударили новые низкие индейцы 22, янки 0 — в Нью-Йорке, Омар Вицкель пошел 6-FOR-7, чтобы завязать рекорд Американской лиги для хитов, когда Кливленд передал янки самым большим потерей в своей истории прошлой ночью. 0.9929
Вазкес и янки пряжки рано, потому что Хавьер Вазкес разбил, в то время как Брэд Рейк процветал, янки удержали свое первое поражение регулярного сезона Миннесота-близнецами с 2001 года. 0.9874
Слайд Янки: PINSSSTRIPES наказан Джордж Штейнбреннер, наблюдал за его коробкой, когда его янки пострадали от самой односторонней потери в длительной истории франшизы. 0.9542

Приведенные выше результаты делают гораздо лучшую работу по поиску результатов семантически похожи по смыслу запроса. Вместо того, чтобы просто найти матчи с янки и потерять он находит матчи, где Янки теряют Отказ

Эта комбинация эффективна и мощна. Он использует преимущества высокой производительности Elasticsearch AlseSearch при добавлении возможностей семантического поиска. У нас уже есть большой кластер Elasticsearch с TBS (или PBS) + данные и годы инженерных инвестиций, которые решают большинство случаев использования. Результаты поиска семантически рейтинга – это практический подход.

Теперь еще для некоторых примеров, сравнивающих результаты elasticsearch vs elasticsearch + txtai.

for query in ["good news +economy", "bad news +economy"]:
  table("Elasticsearch", query, search(query, limit))
  table("Elasticsearch + txtai", query, ranksearch(query, limit))

[ Elasticsearch] Хорошая новость + экономика

Сюрприз Падение США Оптовые цены – это смешанные новости для экономики (AFP) AFP – неожиданное падение в США оптовые цены в августе показали инфляцию, по-видимому, в чеке, но аналитики сказали, что это была хорошая и плохая новость для экономики США. 0.8756
Китайские инвестиции замедляют хорошие новости для чиновников, которые пытаются охладить перегретую экономику; меры экономии остаются. Пекин (Reuters) – Китай сообщил о заметном замедлении роста инвестиций и денежных средств в понедельник, но упорно 0.7379
Отзывы расходования, хорошие новости для роста Вашингтона (Reuters) – U.s. Потребительские расходы резко возвелись в июле, правительственные данные показали в понедельник, стирание разочарования июня и порождая надежды на то, что экономика США оправилась от недавнего слабого места. 0.7145

[ Elasticsearch + TXTAI] Хорошие новости + Экономика

Потративные отскоки, хорошие новости для роста Вашингтона (Reuters) – У.с. Потребительские расходы Резко восстановлены в июле, правительство заявило в понедельник, стирание разочарования июня и поддерживает надежды на то, что экономика США оправилась от недавнего мягкого места. 0.9996
Отзывы расходования, хорошие новости для роста Вашингтона (Reuters) – U.s. Потребительские расходы резко возвелись в июле, правительственные данные показали в понедельник, стирание разочарования июня и порождая надежды на то, что экономика США оправилась от недавнего слабого места. 0.9996
Домашнее здание поднимается жилищное строительство в августе подпрыгнуло на высочайший уровень за пять месяцев, доза обнадеживающих новостей для экономики # 39; 0.9993

[ Elasticsearch] Плохое новости + экономика

Сюрприз Падение США Оптовые цены – это смешанные новости для экономики (AFP) AFP – неожиданное падение в США оптовые цены в августе показали инфляцию, по-видимому, в чеке, но аналитики сказали, что это была хорошая и плохая новость для экономики США. 0.9228
Полевой опрос: Калифорнийцев Любите писатель по персоналу Bee Econome Bee. Калифорнийцы медленно растут более оптимистично в отношении здоровья экономики, но большинство по-прежнему чувствует, что государство находится в плохих экономических временах, в соответствии с новым полевым опросом. 0.6405
АБР говорит, что Китай должен повысить ставки к крутой экономике Китай, который должен повысить процентные ставки для охлаждения экономики и предотвратить будущее наращивание плохих кредитов в банковской системе, азиатский банк развития # 39; S (ADB) Представитель Bei-Jing Bruce Murray сказал. 0.6188

[ Elasticsearch + TXTAI] Плохое новости + экономика

Старея общество попадает в Японию # 39 – экономика Японии № 39; С экономикой будет самым серьезным пострадавшим среди промышленно развитых стран по старению населения, Новости Kyodo заявили в четверг. 0.9977
Средства: Слияния фонда могут причинить боль в отношении инвесторов (Reuters) Reuters – слияния и поглощения имеют \ играли огромную роль в экономике США в течение прошлых \ несколько десятилетий, но иногда результаты были плохими для \ потребителей. Точно так же консолидация в взаимном фонде \ бизнеса иногда повредит фонд инвесторов. 0.9963
Признаки бессмысленной экономики сохраняются в признаке постоянной слабости в экономике США, широко наблюдаемая мера предпринимательской деятельности снизилась в августе на третий месяц подряд. 0.9958

Еще раз, когда Elasticsearch обычно возвращает результаты качества, иногда он будет соответствовать результатам, которые не являются семантически актуальными. Мощность семантического поиска заключается в том, что она не только найдет прямые совпадения, но соответствует тому же значению.

Учебник серии на TXTAI (21 часть серии)

Оригинал: “https://dev.to/neuml/add-semantic-search-to-elasticsearch-3ifb”