В этом сообщении блога я проведу вас через различные шаги, необходимые для настройки локальной MongoDB со снимком онтологии SNOMED-CT и использования этих данных для семантического аннотирования данных. Таким образом, блог можно разделить на следующие части:

  1. Введение в исходный набор данных и связанную с ним задачу машинного обучения
  2. Настройка SNOMED-CT MongoDB локально
  3. Аннотирование исходного набора данных с помощью RDFLib
  4. Возможности с нашим новым семантически аннотированным набором данных

Конечно, онтология SNOMED-CT может легко (потребует некоторых адаптаций к обсуждаемой ниже методологии) быть заменена любой другой онтологией (что позволяет пропустить шаг 2). Это особенно важно для людей, которые не могут получить лицензию на SNOMED-CT.

Введение в исходный набор данных и связанную с ним задачу машинного обучения

Набор данных, который я буду использовать в этом сообщении в блоге, представляет собой общедоступный набор данных под названием MigBase (Челик, Уфук и др. Сравнение диагностической точности алгоритмов искусственного иммунитета при первичных головных болях. Вычислительные и математические методы в медицина 2015 (2015)). Он содержит очень чистые данные, относящиеся к первичным нарушениям головной боли. Нам даны различные свойства приступа головной боли (такие как симптомы и продолжительность), и мы должны предсказать, к какому виду расстройства относится приступ (мигрень, кластерная головная боль и головная боль напряжения). Я провел минимальную предварительную обработку этого файла (например, отбросил столбцы только с одним уникальным значением, выбросил единственный образец с без головной боли в качестве класса и т. Д.). Это можно найти здесь". Вот небольшой образец набора данных:

Все функции говорят сами за себя, за исключением durationGroup. Здесь я получил больше контекста от самого оригинального автора:

Настройка SNOMED-CT MongoDB

Теперь давайте настроим локальную базу данных SNOMED-CT MongoDB. Оказывается, это не так просто, как может показаться на первый взгляд… Но как только мы это запустим и запустим, мы можем выполнять локальные запросы и отображать, например, названия наших симптомов с существующими концепциями из онтологии SNOMED. Это позволяет нам использовать огромный объем знаний, уже имеющихся в этой онтологии.

Требования: MongoDB, Java, Maven, лицензия на онтологию SNOMED-CT, git, npm и nodejs (версия ›4.4.2)

Заявление об отказе от ответственности: все делается на Ubuntu; Процессор i7–7820HQ и 16 ГиБ ОЗУ.

  1. Клонируйте необходимые репозитории с помощью git

git clone https://github.com/IHTSDO/rf2-to-json-conversion.git

git clone https://github.com/IHTSDO/sct-snapshot-rest-api.git

2. Получение файлов SNOMED-CT RF2

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

3. Преобразование файлов SNOMED-CT RF2 в формат JSON.

Перейдите в каталог преобразования rf2 в json, который мы только что получили от GitHub. Затем установите проект Maven с помощью команды mvn install. Будет создан новый каталог с именем target, содержащий JAR-файлы. Теперь мы модифицируем один из конфигурационных файлов (я выбрал enConfig, так как хочу, чтобы моя КБ была на английском языке; слова, которые необходимо изменить, выделены жирным шрифтом):

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <defaultTermLangCode>en</defaultTermLangCode>
    <defaultTermDescriptionType>900000000000003001</defaultTermDescriptionType>
    <defaultTermLanguageRefset>900000000000509007</defaultTermLanguageRefset>
    <normalizeTextIndex>true</normalizeTextIndex>
    <editionName>International Edition</editionName>
    <databaseName>en-edition</databaseName>
    <effectiveTime>$EFF_TIME</effectiveTime>
    <expirationTime>$EXP_TIME</expirationTime>
    <outputFolder>$OUTPUT_FOLDER/</outputFolder>
    <foldersBaselineLoad>
        <folder>$PATH_TO_SNOMED_RELEASE/Snapshot</folder>
    </foldersBaselineLoad>
    <modulesToIgnoreBaselineLoad>
    </modulesToIgnoreBaselineLoad>
    <foldersExtensionLoad>
       <folder>$PATH_TO_EXTENSION_RELEASE1/Snapshot</folder>
    </foldersExtensionLoad>
    <modulesToIgnoreExtensionLoad>
    </modulesToIgnoreExtensionLoad>
    <processInMemory>true</processInMemory>
 <createCompleteConceptsFile>false</createCompleteConceptsFile>
</config>

Это параметры, которые необходимо установить:

  • $ EFF_TIME: дата выпуска / время вступления в силу для пакета finl, если он объединяет международную версию и расширение, используйте более позднюю дату, обычно дату расширения. Формат - ггггммдд. Последняя версия SNOMED (на момент написания) - 31 июля 2017 года.
  • $ EXP_TIME: дата, когда в браузере должно появиться предупреждение о том, что данные могут быть устаревшими. Я не уверен, что этот параметр имеет большое значение. Я только что взял свой $ EFF_TIME + 1 год.
  • $ OUTPUT_FOLDER: где нужно хранить созданные json-файлы?
  • $ PATH_TO_SNOMED_RELEASE: путь к папке моментальных снимков в загруженной онтологии SNOMED-CT (из UMLS или вашего местного органа власти)
  • Выпуски расширений: если у вас есть файлы расширений, вы можете указать их пути здесь.

Когда мы закончим с конфигурационным файлом, мы можем запустить скомпилированный JAR: java -Xmx8g -jar target/rf2-to-json-conversion-1.2-jar-with-dependencies.jar conf/enConfig.xml Если у вас недостаточно оперативной памяти на вашем компьютере (8 ГБ), не забудьте установить <processInMemory> на False в XML-файле конфигурации или уменьшить выделение памяти вашей JVM (флаг -Xmx8g). Если мы закончим (это займет некоторое время…), у нас должно быть 3 файла json в нашей выходной папке: Concept.json, manifest.json и text-index.json.

4. Загрузите вновь созданные файлы JSON в MongoDB.

Сначала редактируем сценарий zipAndUpload.sh. Задайте для json_dir правильный путь (где вы можете найти 3 файла json, созданные на предыдущем шаге) и установите desturl на localhost или удаленном компьютере. Запустите его, и в вашем домашнем каталоге будет создан новый файл: json.tgz. Теперь отредактируйте unzip-import.sh: укажите правильные edition и importDate, правильный json_dir и расположение zip_fn (которое расположение файла .tgz, созданного предыдущим скриптом). Запустите mongod (на порту 27017, но это порт по умолчанию) и запустите скрипт:

./unzip-import.sh en-edition 20170731

5. Запустите REST API.

Перейдите в каталог того другого репозитория, который мы загрузили в начале этого раздела, запустите npm install, а затем sudo node app.js

Наконец-то все готово! Примеры для проверки, все ли шаги сработали, на выбранном вами языке можно найти здесь.

Выполнение примера Python дало мне следующий результат:

Bilirubin test kit (physical object)
Methylphenyltetrahydropyridine (substance)
14
753

Семантическое аннотирование наших CSV-данных (семантическое кодирование) и декодирование с помощью rdflib

Теперь, когда у нас настроена локальная копия SNOMED-CT, мы можем начать писать код Python, который аннотирует наши данные. Он состоит из двух функций:

  • encode: ввод - это csv-данные, вывод - семантический файл (например, в синтаксисе Turtle)
  • декодировать: ввод - семантический файл, вывод - семантический файл

Основной код будет выглядеть следующим образом:

Конечно, чтобы это работало, нам нужно реализовать наши encode и decode функции. Обе функции будут использовать одни и те же URI, поэтому мы сохраняем концепции и сопоставления от строковых значений до URI в отдельных файлах:

Теперь приступим к нашим encode и decode функциям. Оказывается, на самом деле они довольно простые. Что касается части кодирования, мы просто перебираем строки в нашем CSV и сопоставляем каждую из функций с тройкой, где мы используем предикаты и типы, созданные нами. Код можно найти ниже:

Важной частью этого кода является функция getDescriptionByString, здесь мы будем запрашивать нашу локальную базу данных SNOMED-CT, чтобы найти связанные концепции, чтобы мы могли связать их, что является одним из основных принципов связанных данных. Часть декодирования так же проста, просто SPARQL-запрос, а затем итерация по результатам:

Еще одна приятная функция библиотеки rdflib заключается в том, что она позволяет размещать локальную конечную точку ваших семантических данных. Вот код на Python для этого:

А вот несколько скриншотов конечной точки:

(Некоторые) возможности с нашими новыми семантически аннотированными данными ...

  • Просмотрите нашу графу знаний, чтобы найти новые функции
  • Создавайте искусственные образцы для решения проблемы дисбаланса данных на основе базы знаний
  • Создавайте векторные вложения наших графов знаний, чтобы использовать их в качестве новых функций для нашего машинного обучения.
  • Создайте «прототип» графа для каждого нашего класса (на основе экспертных знаний) и измерьте сходство графов с этими графами-прототипами (например, используя ядро ​​Вайсфеллера-Лемана).
  • Обогатите наши визуализации дерева решений (например, получив описания из SNOMED для каждого из симптомов)

Я реализовал несколько из перечисленных возможностей. Чтобы найти их полный код или более подробное объяснение, я обращаюсь к нашему репозиторию GitHub или статье, опубликованной в BMC Medical Informatics and Decision Making