Пубмед. На сегодняшний день он включает около 30 миллионов статей и является самым ценным ресурсом для ученых-биомедиков. Pubmed объединяет большую часть опубликованной литературы в этом пространстве. В результате это первая остановка в генерации гипотез, исследовании, тестировании и проверке. Думайте об этом как о Google для ученых-биомедиков.

Не только ученые-биомедики, но и большинство исследователей, когда они выдвигают новую захватывающую идею, т.е. Свежий взгляд на то, почему сложные системы ведут себя так, а не иначе, самое первое, что нужно сделать, это погуглить. Что уже сообщалось об этом? Куда указывает научный консенсус? В биомедицинских науках этот запрос Google, вероятно, вернет кучу статей в Pubmed. Скорее всего, они не совсем соответствуют запросу, но это только начало. И начинается путешествие научных открытий!



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

Однако существует технология, которая понимает (или может выучить) схемы свободного текста. Его можно научить определять настроения в фрагментах текста и классифицировать их по категориям или присваивать им баллы. это НЛП



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

Представляем SAM

SAM стремится быть гибкой структурой НЛП; слой, находящийся между Pubmed и конечным пользователем, который упрощает все кропотливые задачи НЛП. Он будет получать запросы от пользователя и не только возвращать тезисы, содержащие некоторые из искомых слов, но и эффективно проверять гипотезу пользователя и возвращать оценку.

SAM реализован как веб-API. в то время как есть также доступный API Python: SAMclient. Графический интерфейс все еще находится в стадии разработки.



ioannis-n-melas/SAMclient
SAMConnect — это клиент Python для SAM API. SAM — это подход НЛП для понимания…github.com



Формирование запросов для SAM

Запросы для SAM формулируются несколько иначе, чем можно было бы ожидать. Предположим следующую гипотезу:

«Ген PTGS2 играет важную роль в воспалении».

Вместо того, чтобы задавать вопрос дословно, пользователь должен объяснить SAM на примерах. Мы извлекаем гены, роль которых в воспалении уже установлена. Это послужит положительным примером. Приведенные ниже гены были извлечены из Opentargets. Мы предполагаем, что о PTGS2 ничего не сообщалось, так как это наша рабочая гипотеза.

positives = ['PPARG','ESR1', 'GRIN2B', 'PTGS1', 'SERPINC1', 'PCSK9', 'PPIA', 'NR3C1', 'OPRM1', 'HRH1', 'CAST', 'HMGCR', 'GRIN2A', 'GRIN1', 'XDH', 'FKBP1A', 'GRIN3A', 'FAAH', 'GABRQ', 'GABRD', 'GABRA5', 'GABRG3', 'IMPDH2', 'GABRB3', 'GABRB1', 'GABRG1', 'GRIN2C', 'GABRA2', 'GABRB2', 'GABRA6', 'GRIN3B', 'GABRG2', 'GABRA4', 'IMPDH1', 'GRIN2D', 'GABRE', 'GABRP', 'GABRA1', 'GABRA3', 'ADRA2A', 'ADRA2B', 'ADRA2C']

Затем мы извлекаем отрицательные примеры, это будут гены, о которых не сообщалось, что они играют роль в воспалении. Например, см. ниже:

negatives = ['GEMIN2', 'BGN', 'TP63', 'RAP2A', 'TLE1', 'UCN', 'SOX11', 'NINJ2', 'GABBR1', 'RNF8', 'IGFBP2', 'RPS6KA2', 'ATP6V1G3', 'NR1H3', 'MUL1', 'MB21D1', 'SLC24A5', 'TBL1X', 'APIP', 'HES5', 'PPAT', 'TUBB', 'F2RL1', 'GLI2', 'POLDIP3', 'TYRO3', 'COL5A1', 'LAX1', 'PDE1B', 'TFDP3', 'STAT5A', 'SP100', 'P01768', 'EPO', 'ASPM', 'FAU', 'CD3E', 'AKR1C3', 'EGFR', 'ATP6V0D1', 'ACP5', 'PPP2R1A', 'PTCHD2', 'HDAC4']

SAM изучит контекст, который отличает эти два объекта, и подгонит модель, чтобы затем проверить, к чему, скорее всего, относится PTGS2.

Создание вложений терминов

Определив наши положительные и отрицательные примеры, SAM будет искать эти термины в Pubmed, возвращать аннотации, которые их содержат, и создавать вложения, используя word2vec и fasttext. Увидеть ниже:

collection = 'inflammation'
collection_type = 'phenotype'
term_type = 'gene'
token = SAM.create_session(fullname, email)
collapse = True # create an embedding per term
for gene in positives: 
    SAM.create_embedding(gene, term_type, collapse, token)
for gene in negatives: 
    SAM.create_embedding(gene, term_type, collapse, token)

Обучите модель НЛП

Поскольку положительные термины имеют определенное свойство, т. е. все они играют роль в воспалении, а отрицательные — нет, SAM будет соответствовать модели для изучения контекста/формулировки, которая отличает эти два термина, и вернет свою эффективность с точки зрения перекрестных взаимодействий. -утвержденные AUC

scores = SAM.train_model(positives, negatives, collection,
                         collection_type, token)
scores 
{'cross_val_aucs': [0.9135802469135803, 0.8271604938271605,
                             0.9012345679012346, 0.828125]}

Предсказать реакцию на интересующий ген

Наконец-то мы можем ответить на поставленный в начале вопрос. Играет ли PTGS2 роль в воспалении? Мы просто предсказываем, будет ли PTGS2 больше похож на положительные или отрицательные примеры.

term = 'PTGS2'
predictions = SAM.predict_associations(term, collection, token)
predictions
negative  positive
0      0.18      0.82

SAM возвращает вероятность того, что PTGS2 принадлежит положительным примерам (0,82) и отрицательным примерам (0,18). Следовательно, PTGS2 действительно скорее играет важную роль в воспалении, чем нет. Что довольно точно, так как PTGS2 является мишенью аспирина, а аспирин лечит воспаление.

Выполнение

ниже вы найдете более подробную информацию о реализации и использовании SAM API и клиента Python.

Внедрение постоянства через пользовательские сеансы

Прежде чем пользователи смогут создавать свои собственные вложения и модели, они должны создать сеанс. Сеансы пользователей — это то, как SAM поддерживает постоянство, чтобы пользователи могли иметь свое личное рабочее пространство и модели. Сеанс необходимо указывать при каждом вызове API с использованием токена сеанса. В противном случае SAM по умолчанию будет использовать общедоступный/глобальный сеанс. Пользователи могут создавать столько сеансов, сколько захотят, и могут переключаться между ними, указав соответствующий токен.

Сеанс создается следующим образом:

import json
import pandas as pd
from lib import utils as funs
from lib.config import Config
# create config class
workdir = '.'
cfg = Config(workdir)
# ===== create new session =====
fullname = 'john smith'
email = '[email protected]'
token = funs.create_session(fullname, email, cfg)

Приведенный выше код создает токен сеанса, хранящийся в token, а также добавляет информацию о сеансе в session_info.csv, расположенный в рабочем каталоге.

Мы просим пользователей зарегистрировать свою электронную почту, чтобы убедиться, что мы можем уведомить их, если их сеансы помечены для удаления (после длительного периода бездействия) или если в интерфейсе появятся другие важные обновления.

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

terms = funs.list_terms(token)
terms = pd.read_json(terms)

Вы можете перечислить доступные коллекции следующим образом:

collections = funs.list_collections(token)
collections = pd.read_json(collections)

Сеанс по умолчанию/общий

Если вы укажете token="", то SAM по умолчанию использует общедоступный/глобальный сеанс, который содержит встраивания около 13 000 генов (т. е. терминов) и модели для 100 заболеваний (т. е. коллекции).

Эти 13 тысяч терминов и 100 коллекций всегда доступны для всех пользовательских сеансов и будут перечислены независимо от используемого токена сеанса. Мы рекомендуем пользователям проверить доступные термины и коллекции, прежде чем они начнут создавать свои собственные вложения.