В этом сообщении блога я проведу вас через различные шаги, необходимые для настройки локальной MongoDB со снимком онтологии SNOMED-CT и использования этих данных для семантического аннотирования данных. Таким образом, блог можно разделить на следующие части:
- Введение в исходный набор данных и связанную с ним задачу машинного обучения
- Настройка SNOMED-CT MongoDB локально
- Аннотирование исходного набора данных с помощью RDFLib
- Возможности с нашим новым семантически аннотированным набором данных
Конечно, онтология 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 ГиБ ОЗУ.
- Клонируйте необходимые репозитории с помощью 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