Эта статья является частью серии учебников на TXTAI платформа семантической поисковой платформы AI.
В части 1 мы дали общий обзор TXTAI, технологии поддержки и примеры того, как использовать его для поиска сходства. Часть 2 покрыла индекс вложения с большим набором данных.
Для реального мира крупномасштабные случаи использования данные часто хранятся в базе данных (Elasticsearch, SQL, Mongodb, файлы и т. Д.). Здесь мы покажем, как читать с SQLite, постройте индекс вложения, предусматриваемые словом встраивания и запускающие запросы против сгенерированных индекса вложений.
Этот пример покрывает функциональность, найденные в Badai библиотека. Посмотрите, что библиотека для полного решения, которую можно использовать с набором данных, обсуждаемыми ниже.
Установить TXTAI
и все зависимости. Поскольку эта статья создает векторы Word, нам нужно установить пакет с подобия.
pip install txtai[similarity]
Этот пример собирается отработать подмножество Шнур-19 набор данных. Covid-19 Открытый исследовательский набор данных (CAD-19) – это бесплатный ресурс научных статей, агрегированных коалицией ведущих исследовательских групп, охватывающих COVID-19 и семейство вирусов коронавируса.
Следующая загрузка – это база данных SQLite, сгенерированная из Kaggle ноутбук Отказ Дополнительная информация об этом формате данных, можно найти в Шнур-19 Анализ ноутбук.
wget https://github.com/neuml/txtai/releases/download/v1.1.0/tests.gz gunzip tests.gz mv tests articles.sqlite
Этот пример создаст поисковую систему, поддерживаемую вставки Word. Несмотря на то, что не так мощно, как трансформаторные вложения, они часто предоставляют хороший компромисс производительности для функциональности для функциональности для встраиваемой поисковой системы.
Для этой статьи мы построим собственные пользовательские вложения для демонстрации демонстрации. Доступны ряд предварительно обученных моделей встраивания слова:
import os import sqlite3 import tempfile from txtai.pipeline import Tokenizer from txtai.vectors import WordVectors print("Streaming tokens to temporary file") # Stream tokens to temp working file with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False) as output: # Save file path tokens = output.name db = sqlite3.connect("articles.sqlite") cur = db.cursor() cur.execute("SELECT Text from sections") for row in cur: output.write(" ".join(Tokenizer.tokenize(row[0])) + "\n") # Free database resources db.close() # Build word vectors model - 300 dimensions, 3 min occurrences WordVectors.build(tokens, 300, 3, "cord19-300d") # Remove temporary tokens file os.remove(tokens)
# Show files ls -l
Streaming tokens to temporary file Building 300 dimension model Converting vectors to magnitude format total 78948 -rw-r--r-- 1 root root 8065024 Aug 25 01:44 articles.sqlite -rw-r--r-- 1 root root 24145920 Jan 9 20:45 cord19-300d.magnitude -rw-r--r-- 1 root root 48625387 Jan 9 20:45 cord19-300d.txt drwxr-xr-x 1 root root 4096 Jan 6 18:10 sample_data
Следующие шаги создают индекс вложений, используя слово «Слово» модель только что создана. Эта модель создает индекс BM25 + FastText. BM25 используется для создания средневзвешенного среднего слова вложений в разрезе. Дополнительная информация об этом методе можно найти в этом Средняя статья Отказ
import sqlite3 import regex as re from txtai.embeddings import Embeddings from txtai.pipeline import Tokenizer def stream(): # Connection to database file db = sqlite3.connect("articles.sqlite") cur = db.cursor() # Select tagged sentences without a NLP label. NLP labels are set for non-informative sentences. cur.execute("SELECT Id, Name, Text FROM sections WHERE (labels is null or labels NOT IN ('FRAGMENT', 'QUESTION')) AND tags is not null") count = 0 for row in cur: # Unpack row uid, name, text = row # Only process certain document sections if not name or not re.search(r"background|(?
Iterated over 21499 total rows Iterated over 21499 total rows
Следующее запускает запрос против индекса вложений для терминов «Факторы риска». Он находит 5 лучших совпадений и возвращает соответствующие документы, связанные с каждым матчм.
import pandas as pd from IPython.display import display, HTML pd.set_option("display.max_colwidth", None) db = sqlite3.connect("articles.sqlite") cur = db.cursor() results = [] for uid, score in embeddings.search("risk factors", 5): cur.execute("SELECT article, text FROM sections WHERE id = ?", [uid]) uid, text = cur.fetchone() cur.execute("SELECT Title, Published, Reference from articles where id = ?", [uid]) results.append(cur.fetchone() + (text,)) # Free database resources db.close() df = pd.DataFrame(results, columns=["Title", "Published", "Reference", "Match"]) display(HTML(df.to_html(index=False)))
Действительно, факторы риска являются секс, ожирение, генетические факторы и механические факторы (3). | Управление остеоартритом во время пандемии COVID-19 | 2020-05-21 00:00:00. | https://doi.org/10.1002/cpt.1910 |
Бедное поведение в семье поведения руководителями также были связаны с этими результатами [1,40 (1,21 – 1,62), 1,69 (1,48 – 1,92), 1,54 (1.44 – 1.64)]. | Работы и личные факторы, связанные с психическим благополучием во время ответа COVID-19: обзор здравоохранения и других работников | 2020-06-11 00:00:00 | http://medrxiv.org/cgi/content/short/2020.06.09.20126722v1?rss=1 |
Помимо мужского пола, курение является фактором риска для восприимчивости COVID-19 и плохих клинических результатов. | Нет доказательств того, что андрогенное регулирование легочных TMPRS2 объясняет результаты секса-дискореанта COVID-19 | 2020-04-21 00:00:00. | https://doi.org/10.1101/2020.04.21.051201 |
Не было никакой разницы на 28-дневной смертности между пользователями гепарина и неустрелов. | Текущее состояние потенциальных терапевтических кандидатов для кризиса COVID-19 | 2020-04-22 00:00:00 | https://doi.org/10.1016/j.bbi.2020.04.046 |
• Три основных фактора риска COVID-19 были секс (мужчина), возраст (≥60) и тяжелая пневмония. | COVID-19: Что было изучено и узнать о новом заболевании коронавируса | 2020-03-15 00:00:00. | https://doi.org/10.7150/ijbs.45134 |
Пример выше использует индекс вложений, чтобы найти лучшие 5 лучших совпадений. В дополнение к этому, экземпляр экстрактора (это будет объяснено дальше частично 5), используется для получения дополнительных вопросов по результатам поиска, создавая более богатый ответ запроса.
from txtai.pipeline import Extractor # Create extractor instance using qa model designed for the CORD-19 dataset extractor = Extractor(embeddings, "NeuML/bert-small-cord19qa") db = sqlite3.connect("articles.sqlite") cur = db.cursor() results = [] for uid, score in embeddings.search("risk factors", 5): cur.execute("SELECT article, text FROM sections WHERE id = ?", [uid]) uid, text = cur.fetchone() # Get list of document text sections to use for the context cur.execute("SELECT Name, Text FROM sections WHERE (labels is null or labels NOT IN ('FRAGMENT', 'QUESTION')) AND article = ? ORDER BY Id", [uid]) texts = [] for name, txt in cur.fetchall(): if not name or not re.search(r"background|(?
Никто | Управление остеоартритом во время пандемии COVID-19 2020-05-21 00:00:00 | https://doi.org/10.1002/cpt.1910 | Действительно, факторы риска являются секс, ожирение, генетические факторы и механические факторы (3). Секс, ожирение, генетические факторы и механические факторы | ||
Бедное поведение в семье поведения руководителями также были связаны с этими результатами [1,40 (1,21 – 1,62), 1,69 (1,48 – 1,92), 1,54 (1.44 – 1.64)]. | Работы и личные факторы, связанные с психическим благополучием во время ответа COVID-19: обзор здравоохранения и других работников | Никто | 2020-06-11 00:00:00 | http://medrxiv.org/cgi/content/short/2020.06.09.20126722v1?rss=1 | Плохое поведение в семье |
Помимо мужского пола, курение является фактором риска для восприимчивости COVID-19 и плохих клинических результатов. | Нет доказательств того, что андрогенное регулирование легочных TMPRS2 объясняет результаты секса-дискореанта COVID-19 | Никто | 2020-04-21 00:00:00. | https://doi.org/10.1101/2020.04.21.051201 | Более высокая заболеваемость и смертность |
Не было никакой разницы на 28-дневной смертности между пользователями гепарина и неустрелов. | Текущее состояние потенциальных терапевтических кандидатов для кризиса COVID-19 | Никто | 2020-04-22 00:00:00 | https://doi.org/10.1016/j.bbi.2020.04.046 | Электрические сильные воспалительные ответы являются благоприятными или вредными |
• Три основных фактора риска COVID-19 были секс (мужчина), возраст (≥60) и тяжелая пневмония. | COVID-19: Что было изучено и узнать о новом заболевании коронавируса | Никто | 2020-03-15 00:00:00. | https://doi.org/10.7150/ijbs.45134 | Секс (мужчина), возраст (≥60) и тяжелая пневмония |
В приведенном выше примере индекс вложений используется для поиска Top N результатов для данного запроса. Кроме того, экстрактор-ответ на вопрос используется для получения дополнительных столбцов на основе списка вопросов. В этом случае столбцы «Факторы риска» и «Расположение» были вытащены из текста документа.
Оригинал: “https://dev.to/neuml/build-an-embeddings-index-from-a-data-source-52pf”