Рубрики
Без рубрики

Обработка естественного языка биомедицинского текста (BIONLP) с использованием SCISPATY: NER и соответствие правила

Биомедицинское текстовое добыча и обработка натурального языка (BIONLP) – интересный исследовательский домен Tha … Теги с Python, NLP, биомедицинской, стыкой.

Биомедицинское текстовое добыча и обработка натурального языка (BIONLP) – это интересный исследовательский домен, который касается обработки данных журналов, медицинских записей и других биомедицинских документов. Учитывая наличие биомедицинской литературы, произошла растущий интерес к извлечению информации, отношениях и понимании из текстовых данных. Однако неструктурированная организация и сложность домена биомедицинских документов усердно делают эти задачи. К счастью, некоторые крутые пакеты Python NLP могут помочь нам с этим!

Scispacy это пакет Python, содержащий Spacy Модели для обработки биомедицинского, научного или клинического текста. Большинство разумных функций SPACY – это модели нейронных сетей для метки, анализа, именованного распознавания объекта (NER), текстовая классификация и многое другое. Добавьте модели SCISPALE на его верхней части, и мы можем сделать все это в биомедицинском домене!

Здесь мы собираемся посмотреть, как использовать Scispacy Модели NER для выявления названий препарата и заболеваний, упомянутых в медицинской транскрипции набора данных Отказ Более того, мы собираемся в Объедините сочетание NER и на основе правил, чтобы извлечь названия лекарств и дозировки сообщается в каждом транскрипции.

Оглавление

  • Требования
  • Набор данных
  • Именованное распознавание сущности
  • Соответствие на основе правил
  • Выводы
  • использованная литература

Требования

  • Python 3.
  • панда
  • Spacy> = 3.0
  • инкрустация

Вы можете просто Установка PIP все они.

Нам также нужно скачать и установить модель NER из Scispacy. Установить en_ner_bc5cdr_md . Модель Используйте следующую команду:

pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_ner_bc5cdr_md-0.4.0.tar.gz

Для обновленных версий или других моделей, пожалуйста, проверьте Страница Scispacely Отказ

Набор данных

Неструктурированные медицинские данные, такие как медицинские транскрипции, довольно трудно найти. Здесь мы используем Набор данных медицинской транскрипции Scraped из Сайт mtsamples Тара Бойл и сделан доступным в Kaggle.

import pandas as pd

med_transcript = pd.read_csv("mtsamples.csv", index_col=0)
med_transcript.info()
med_transcript.head()

Int64Index: 4999 entries, 0 to 4998
Data columns (total 5 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   description        4999 non-null   object
 1   medical_specialty  4999 non-null   object
 2   sample_name        4999 non-null   object
 3   transcription      4966 non-null   object
 4   keywords           3931 non-null   object
dtypes: object(5)
memory usage: 234.3+ KB
Аллергия / иммунология, аллергический ринит, аллер … 0 23-летняя белая самка подарки с комп … Аллергический ринит Субъективный :, это 23-летний белый женский PR … Аллергия / иммунология
Бариатрия, лапароскопический желудочный обход, весят … 1 Проконсультируйтесь о лапароскопическом желудочном обходке. Лапароскопический желудочный байпас консультации – 2 Прошлая история болезни: у него трудно подняться … Бариатрия
Бариатрия, лапароскопический желудочный обход, сердце … 2 Проконсультируйтесь о лапароскопическом желудочном обходке. Лапароскопический желудочный байпас проконсультируется – 1 История нынешней болезни: я видел ABC … Бариатрия
Сердечно-сосудистый / легочный, 2D M-режим, допплер … 3 2-D M-режим. Допплер. 2-D эхокардиограмма – 1 2-D M-Mode:, 1. Увеличение по левому предсердию … Сердечно-сосудистый / легочный
Сердечно-сосудистые / легочный, 2-D, допплер, эхо … 4 2-D эхокардиограмма 2-D эхокардиограмма – 2 1. Размер полости левого желудочка и стена … Сердечно-сосудистый / легочный

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

med_transcript.dropna(subset=['transcription'], inplace=True)
med_transcript_small = med_transcript.sample(n=100, replace=False, random_state=42)
med_transcript_small.info()
med_transcript_small.head()

Int64Index: 100 entries, 3162 to 3581
Data columns (total 5 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   description        100 non-null    object
 1   medical_specialty  100 non-null    object
 2   sample_name        100 non-null    object
 3   transcription      100 non-null    object
 4   keywords           78 non-null     object
dtypes: object(5)
memory usage: 4.7+ KB
Нан 3162 Заметно повышено PT INR, несмотря на остановку CO … Гематология консультируется – 1 История нынешних заболеваний: пациент … Гематология – онкология
Управление боли, ксилокаин, Marcaine, Intercos … 1981 Интеркостальный блок с четвертого до десятого интервала … Интеркостальный блок – 1 Диагностика преподавателя :, Грудная боль Вреду … Управление болью
SOAP / CHARTION / ПРОГРЕССИМАЛЬНЫЕ ЗАМЕЧАНИЯ, не маленькая ячейка … 1361 Пациент – 65-летняя женщина, которая под … Лобектомия – следить История настоящей болезни: пациент … Мыло / диаграмма / заметки о прогрессе
Нефрология, конечные почечные заболевания, AV диализа … 3008 Строительство правой верхней руки гемодиализ … Гемодиализис фистула конструкция Предоперационный диагноз:, конечная стадия почечной болезни … Нефрология
Сердечно-сосудистый / легочный, постоянный пневмон … 4943 Бронхоскопия с кистью биопсий. Настойчивый… Бронхоскопия – 8. Предоперационный диагноз: постоянная пневмония … Сердечно-сосудистый / легочный

Давайте возьмем одну транскрипцию, чтобы увидеть, как мы можем работать с NER:

sample_transcription = med_transcript_small['transcription'].iloc[0]
print(sample_transcription[:1000]) # prints just the first 1000 characters
HISTORY OF PRESENT ILLNESS:,  The patient is well known to me for a history of iron-deficiency anemia due to chronic blood loss from colitis.  We corrected her hematocrit last year with intravenous (IV) iron.  Ultimately, she had a total proctocolectomy done on 03/14/2007 to treat her colitis.  Her course has been very complicated since then with needing multiple surgeries for removal of hematoma.  This is partly because she was on anticoagulation for a right arm deep venous thrombosis (DVT) she had early this year, complicated by septic phlebitis.,Chart was reviewed, and I will not reiterate her complex history.,I am asked to see the patient again because of concerns for coagulopathy.,She had surgery again last month to evacuate a pelvic hematoma, and was found to have vancomycin resistant enterococcus, for which she is on multiple antibiotics and followed by infectious disease now.,She is on total parenteral nutrition (TPN) as well.,LABORATORY DATA:,  Labs today showed a white blood 

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

Именованное распознавание сущности

Именованное распознавание объекта (NER) представляет собой подзадаченную обработку естественного языка, используемую для идентификации и классификации названных объектов, упомянутых в неструктурированном тексте, в заранее определенные категории. Scispacy имеет разные модели для определения различных типов объектов, и вы можете проверить их здесь Отказ

Мы собираемся использовать модель NER, обученной на корпусе BC5CDR ( en_ner_bc5cdr_md ). Этот корпус состоит из 1500 аннотационных статей с 4409 аннотированными химическими веществами, 5818 заболеваниями и 3116 взаимодействием химическими заболеваниями. Не забудьте Скачать и установить модель.

import scispacy
import spacy
nlp = spacy.load("en_ner_bc5cdr_md")

Spacy.load вернется Язык Объект, содержащий все компоненты и данные, необходимые для обработки текста. Этот объект обычно называется NLP в документации и учебниках. Призывая NLP Объект на строке текста вернет обработанный Док Объект с текстом разделен на слова и аннотирован.

Давайте получим все идентифицированные объекты и распечатайте их текст, начать позицию, конечное положение и тип:

doc = nlp(sample_transcription)
print("TEXT", "START", "END", "ENTITY TYPE")
for ent in doc.ents:
    print(ent.text, ent.start_char, ent.end_char, ent.label_)
TEXT START END ENTITY TYPE
iron-deficiency anemia 79 101 DISEASE
chronic blood loss 109 127 DISEASE
colitis 133 140 DISEASE
iron 203 207 CHEMICAL
...
vancomycin 781 791 CHEMICAL
infectious disease 873 891 DISEASE
improved.,PT 1348 1360 CHEMICAL
vitamin K 1503 1512 CHEMICAL
uric acid 1830 1839 CHEMICAL
bilirubin 1853 1862 CHEMICAL
Creatinine 1911 1921 CHEMICAL
...
Compazine 2474 2483 CHEMICAL
Zofran 2487 2493 CHEMICAL
epistaxis 2629 2638 DISEASE
bleeding 3057 3065 DISEASE
edema.,CARDIAC 3109 3123 CHEMICAL
adenopathy 3156 3166 DISEASE
...

Мы можем видеть модель правильно идентифицированной и этикетки, такие как железодефицитная анемия , Хроническая крови потери и многое другое. Многие лекарства были также определены, как ванкомицин , Композин , Zofran Отказ Модель также может определить общие лабораторные испытанные молекулы, такие как Креатинин , железо , Билирубин , мочевая кислота .

Не все идеально, хотя. Посмотрите, как некоторые жетоны странно классифицированы как химические вещества, возможно, из-за знаков препинания:

  • улучшен. , PT. 1348 1360 Химический
  • отек., Cardiac 3109 3123 Химический

Отметки пунктуации обычно удаляются в шагах предварительного обработки NLP, но мы не можем удалить их здесь, в противном случае мы можем пропустить химические имена и прикрутите количества, такие как лекарственная дозировка. Однако мы можем решить эту проблему, удалив метки « ., », которые, кажется, разделяют некоторые разделы транскрипции. Важно знать ваши данные и домен ваших данных, чтобы иметь лучшее понимание ваших результатов.

import re

med_transcript_small['transcription'] = med_transcript_small['transcription'].apply(lambda x: re.sub('(\.,)', ". ", x))

Мы также можем проверить объекты, используя ДОСТАВКА Визуализатор:

from spacy import displacy
displacy.render(doc[:100], style='ent', jupyter=True) # here I am printing just the first 100 tokens

Соответствие на основе правил

Соответствие на основе правил аналогично регулярным выражениям, но двигатели и компоненты и компоненты на основе правила SPACY и компоненты дают доступ к тонканам в документе и их отношениях. Мы можем объединить это с моделями NER, чтобы определить некоторый шаблон, который включает в себя наши объекты.

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

from spacy.matcher import Matcher

pattern = [{'ENT_TYPE':'CHEMICAL'}, {'LIKE_NUM': True}, {'IS_ASCII': True}]
matcher = Matcher(nlp.vocab)
matcher.add("DRUG_DOSE", [pattern])

Вышеуказанный код создает шаблон для идентификации последовательности трех токенов:

  • Токен, чей тип сущности – это химическое вещество (имя препарата)
  • Токен, который напоминает номер (дозировка)
  • Токен, который состоит из персонажей ASCII (единиц, таких как мг или мл)

Затем мы инициализируем сопутника со словарем. Магазин должен всегда поделиться тем же Vocab с документами, на которых он будет работать, поэтому мы используем NLP Объект Vocab. Затем мы добавляем этот шаблон к списку и дайте ему удостоверение личности.

Теперь мы можем зацикливаться через все транскрипции и извлечь текст, соответствующий этой картине:

for transcription in med_transcript_small['transcription']:
    doc = nlp(transcription)
    matches = matcher(doc)
    for match_id, start, end in matches:
        string_id = nlp.vocab.strings[match_id]  # get string representation
        span = doc[start:end]  # the matched span
        print(string_id, start, end, span.text)
DRUG_DOSE 137 140 Xylocaine 20 mL
DRUG_DOSE 141 144 Marcaine 0.25%
DRUG_DOSE 208 211 Aspirin 81 mg
DRUG_DOSE 216 219 Spiriva 10 mcg
DRUG_DOSE 399 402 nifedipine 10 mg
DRUG_DOSE 226 229 aspirin one tablet
DRUG_DOSE 245 248 Warfarin 2.5 mg
DRUG_DOSE 67 70 Topamax 100 mg
...
DRUG_DOSE 193 196 Metamucil one pack
DRUG_DOSE 207 210 Nexium 40 mg
DRUG_DOSE 1133 1136 Naprosyn one p.o
DRUG_DOSE 290 293 Lidocaine 1%
DRUG_DOSE 37 40 Altrua 60,
...
DRUG_DOSE 74 77 Lidocaine 1.5%
DRUG_DOSE 209 212 Dilantin 300 mg
DRUG_DOSE 217 220 Haloperidol 1 mg
DRUG_DOSE 225 228 Dexamethasone 4 mg
DRUG_DOSE 234 237 Docusate 100 mg
DRUG_DOSE 250 253 Ibuprofen 600 mg
DRUG_DOSE 258 261 Zantac 150 mg
...
DRUG_DOSE 204 207 epinephrine 7 ml
DRUG_DOSE 214 217 Percocet 5,
DRUG_DOSE 55 58 . 4.
DRUG_DOSE 146 149 . 4.
DRUG_DOSE 2409 2412 Naprosyn 375 mg
DRUG_DOSE 141 144 Wellbutrin 300 mg
DRUG_DOSE 146 149 Xanax 0.25 mg
DRUG_DOSE 158 161 omeprazole 20 mg
...

Ницца, мы сделали это!

Мы успешно извлекли наркотики и дозировки, включая различные виды единиц, таких как MG, ML,%, Packs Отказ

Выводы

Здесь мы узнали, как использовать некоторые особенности SCISPALE и SPACY, как сопоставление NER и BACE. Мы использовали одну модель NER, но там много других, и вы должны полностью проверить их. Например, en_ner_bionlp13cg_md Модель может определить анатомические части, ткани, типы клеток и многое другое. Представьте, что еще вы можете сделать с этим!

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

использованная литература

Neumann, M., king, D., Beltagy, I., & Ammar, W. (2019). Scispacy: быстрые и надежные модели для биомедицинской обработки натурального языка Отказ Арксив Препринт Арксив: 1902.07669.

Honnibal, M., Montani, I., Ван Ландегем, С., Бойд, А. (2020). SPACY: Производственно-силовая обработка натурального языка в Python Отказ

Оригинал: “https://dev.to/gbnegrini/biomedical-text-natural-language-processing-bionlp-using-scispacy-ner-and-rule-based-matching-504p”