Анализ обработки естественного языка (NLP) в здравоохранении с использованием SpaCy, CountVectorizer, NLTK, встраивания слов с моделированием непоследовательности и последовательности и прочим

Методы глубокого обучения, НЛП и машинного обучения продемонстрировали значительные перспективы в нескольких приложениях для здравоохранения. Из клинического текста алгоритмы NER могут автоматически распознавать и извлекать важную информацию, включая имена пациентов, медицинские показания и названия рецептов. Медицинские отчеты, диагнозы и планы лечения могут быть организованы в определенные классификации с использованием алгоритмов классификации клинических текстов, которые могут помочь медицинским работникам принимать решения. Медицинские работники теперь используют машинное обучение, обработку естественного языка (NLP) и методы глубокого обучения для анализа и понимания огромных объемов текстовых данных, включенных в электронные медицинские карты (EHR).

Задания по анализу и обработке текста в значительной степени зависят от двух известных библиотек обработки естественного языка (NLP) SpaCy и NLTK. Каждая библиотека имеет особые преимущества и функции, которые увеличивают общую ценность их использования в приложениях НЛП. Чтобы получить полный код проверьте мой GitHub

  1. Понимание проблемы

В основе любого проекта крайне важно, чтобы глубокое понимание основной проблемы и самих данных лежало в основе каждой работы по науке о данных.

В этой классификации клинических текстов цель состоит в том, чтобы предсказать медицинскую специальность на основе медицинской транскрипции, визуализировать данные о медицинской специальности и определить медицинскую специальность. Отправляйтесь со мной в это удивительное приключение. А не ___ ли нам?

2. Понимание данных

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

Как указывалось ранее, датой для этого проекта является набор клинических текстовых данных с открытым исходным кодом, загруженный с Kaggle. Пожалуйста, загрузите данные (mtsaples.csv) и прогуляйтесь со мной. убедитесь, что вы загружаете свои пакеты, такие как Pandas, NumPy, Seaborn и другие

clinic = pd.read_csv('mtsamples.csv',index_col=0)
clinic.head(5)

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

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

def get_sentence(text_list):
    sent_count = 0
    word_count = 0
    vocab = {}
    for text in text_list:
        sentences = sent_tokenize(str(text).lower())
        sent_count = sent_count + len(sentences)
        for sentence in sentences:
            words=word_tokenize(sentence)
            for word in words:
                if(word in vocab.keys()):
                    vocab[word] = vocab[word] +1
                else:
                    vocab[word]=1
    word_count = len(vocab.keys())
    return sent_count, word_count
clinic = clinic[clinic['transcription'].notna()]
sent_count, word_count = get_sentence(clinic['transcription'].tolist())
print('Number of sentences in transcription column: '+ str(sent_count))
print("Number of unique words in transcriptions coumn: "+ str(word_count))
                                      
data_cat = clinic.groupby(clinic['medical_specialty'])
i=1
print('############ Original Categories ############')                                      
for cateName, data_cate in data_cat:
    print('Cat:' +str(i)+ ' ' + cateName + ' : ' + str(len(data_cate)))
    i= i+1
print('################')

Результат показал, что у нас есть 40 категорий medical_speciality, мы можем упростить их до 50 или 100, чтобы у нас было только 9 категорий.

filtered_data_cate = data_cat.filter(lambda x:x.shape[0]>100)
final_data_cate = filtered_data_cate.groupby(filtered_data_cate['medical_specialty'])
i=1
print('========== Total number of Reduced Categories===============')
for cateName, data_cate in final_data_cate:
    print('Category:' +str(i)+ ' ' + cateName + ' : ' + str(len(data_cate)))
    i= i+1
print('===============')

Я люблю визуализацию, она помогает нам получить наглядное представление о наших данных — помните, «изображения говорят 1000 слов».

3. Подготовка данных

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

data = filtered_data_cate[['transcription', 'medical_specialty']]
data = data.drop(data[data['transcription'].isna()].index)
data.shape
filtered_data= clinic[['transcription', 'medical_specialty']]
filtered_data.loc[:, 'medical_specialty'] = filtered_data['medical_specialty'].apply(lambda x:str.strip(x))
mask = (filtered_data['medical_specialty'] == 'SOAP / Chart / Progress Notes')| \
(filtered_data['medical_specialty'] == 'Office Note') |\
(filtered_data['medical_specialty'] == 'Consult - History and Phy.') |\
(filtered_data['medical_specialty'] == 'Emergency Room Reports') |\
(filtered_data['medical_specialty'] == 'Discharge Summary') |\
(filtered_data['medical_specialty'] == 'Letters') 


filtered_data = filtered_data[~mask]
data_categories = filtered_data.groupby(filtered_data['medical_specialty'])
filtered_data_categories = data_categories.filter(lambda x:x.shape[0]>100)
filtered_data_categories['medical_specialty'].value_counts()

Предварительная обработка данных

Набор данных NLP: чтобы преобразовать необработанный текст в формат, подходящий для анализа, наборы данных NLP часто требуют определенных методов предварительной обработки. Токенизация (процесс разделения текста на отдельные слова или лексемы), формирование стемминга или лемматизация (процесс разбиения слов на их простейшие формы), удаление стоп-слов и обработка специальных символов или знаков препинания могут быть необходимы.

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

Мы можем использовать предварительно обученную модель SpaCy (en_ner_bionlp13cg_md) для извлечения медицинских объектов или использовать NLTK, но в этой статье мы будем использовать SpaCy, однако я покажу вам процесс использования NLTK. проверьте мой GitHub

import spacy
import en_ner_bionlp13cg_md
sci_nlp = en_ner_bionlp13cg_md.load()
def medical_entities( text):
    entities = []
    doc = sci_nlp(text)
    for ent in doc.ents:
        entities.append(ent.text)
    return ' '.join(entities)
df['transcription'] = df['transcription'].astype(str)
df['transcription'] = df['transcription'].apply(medical_entities)
df.head()

Процесс преобразования необработанных данных в формат, подходящий для обучения моделей или проведения анализа, известный как извлечение признаков, является важным процессом в машинном обучении и анализе данных. Чтобы повысить эффективность и производительность последующих задач, извлечение признаков направлено на извлечение из данных соответствующей информации или шаблонов. Это так, потому что ML и DL понимают только числа, текстовые строки обычно рассматриваются как набор слов.

Xfeatures = df['transcription']
ylabels = df['medical_specialty']
Xfeatures

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

CountVectorizer преобразует группу текстовых документов в матрицу подсчета слов как часть процедуры извлечения признаков при обработке естественного языка (NLP). Основная цель CountVectorizer — создать словарь отдельных слов, найденных в корпусе текста, и отслеживать, как часто каждое слово появляется в каждом документе. Ниже приведен простой код для векторизатора счета.

# Vectorizer
cv = CountVectorizer()
X = cv.fit_transform(Xfeatures)

# Get  Features By Name 
cv.get_feature_names()
# To Dense Array (NUMPY)
X.toarray() 
# Split Dataset
X_train, X_test, y_train ,y_test = train_test_split(X, ylabels,test_size=0.3,random_state=42)

# Let's start building model

nv_model = MultinomialNB()
nv_model.fit(X_train, y_train)

В науке о данных построение моделей является важным компонентом во многих областях. Модель — это упрощенное изображение или имитация системы или явления, существующего в реальном мире. Контролируемым и управляемым образом он позволяет нам понимать, исследовать и предвидеть поведение сложных систем.

# Check for Accuracy
# this is method 1
nv_model.score(X_test,y_test)
# Predictions
y_nv_pred = nv_model.predict(X_test)
y_nv_pred
sample_text = ['Brain tumor left Brain tumor left lobe brain patient supine head scalp skeletal skull scalp bone bacitracin dura Stealth cystic cortex trigone ventricle head through tumor surface Stealth yellowish necrotic tissue glioblastoma multiforme tumor vascular tumor tumors ventricle tumor cavity dura bone Lorenz titanium muscle fascia galea Skin skin blood brain tumor tumor brain']
vect = cv.transform(sample_text).toarray()

# Make Prediction
nv_model.predict(vect)

Оценка модели

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

# Model Classification
print(classification_report(y_test,y_nv_pred))

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

# Confusion Matrix
confusion_matrix(y_test, y_nv_pred)
# Plot Confusion Matrix
plot_confusion_matrix(nv_model, X_test,y_test)

Заключительные мысли

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

SpaCy предоставляет предварительно обученные модели для различных языков, которые обучаются на больших корпусах и могут быть легко использованы для различных задач НЛП. Эти модели экономят время и усилия при обучении пользовательских моделей с нуля.

Давайте общаться

Справочник