Учебник серии на 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
Score | Text |
---|---|
%.4f | %s |
[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”