Часто в обработке естественного языка (НЛП) мы судим об успехе модели по ее точности. Но этот подход может ввести в заблуждение, поскольку он не показывает, насколько хорошо модель обрабатывает реальный язык. Чтобы по-настоящему узнать, хороша ли модель, нам нужно проверить ее надежность — насколько хорошо она справляется с различными видами изменений в предоставленном ей тексте. Вот тут-то и приходит на помощь тестирование на надежность. Это все равно, что ставить перед моделью задачи, чтобы проверить, справится ли она с ними. Представьте себе корабль, плывущий по бурным водам — именно об этом тесте мы говорим для моделей НЛП. В этом блоге мы углубимся в LangTest, способ выйти за рамки просто точности и изучить, насколько хорошо модели распознавания именованных объектов могут справляться с перипетиями реального языка.

Кроме того, в статье подробно рассматриваются детали реализации моделей med7 и ner posology и демонстрируется их использование. Мы демонстрируем оценку производительности модели с использованием функций LangTest, проводя тесты обеих моделей на надежность и точность. Наконец, мы сравниваем производительность этих моделей, предоставляя ценную информацию об их сильных и слабых сторонах в задачах NER здравоохранения.

Что такое распознавание именованных объектов?

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

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

Почему важно проводить тестирование на надежность?

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

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

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

  • Пример 1. Модель точно идентифицирует именованные сущности в исходном предложении, где типы сущностей и регистр совпадают.
  • Пример 2. Когда предложение написано заглавными буквами, модель сохраняет некоторое распознавание сущности, но не может идентифицировать «JEFF BEZOS» как человека и «AMAZON» как организацию из-за измененного регистра.
  • Пример 3. Когда предложение написано строчными буквами, модель сохраняет некоторую распознаваемость сущности, но не может идентифицировать «amazon» как организацию из-за измененного регистра.

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

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

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

ЛангТест

LangTest — это библиотека Python с открытым исходным кодом, которая облегчает оценку моделей НЛП. Он предоставляет полный набор тестов для моделей NER, классификации текста, вопросов-ответов и обобщения. Благодаря более чем 50 готовым тестам LangTest охватывает различные аспекты, такие как надежность, точность, предвзятость, репрезентативность и справедливость.

Вы можете найти библиотеку LangTest на GitHub, где сможете изучить ее возможности, документацию и последние обновления. Кроме того, для получения дополнительной информации о LangTest и его возможностях вы можете посетить официальный сайт langtest.org.

Теперь мы возьмем две модели NER для здравоохранения, такие как ner posology и med7, мы сможем получить представление о их производительность и принимать обоснованные решения об их пригодности для конкретных случаев использования.

Обзор модели

Модели распознавания именованных объектов (NER) играют решающую роль в извлечении соответствующей информации из клинического текста, позволяя решать такие задачи, как извлечение лекарств и идентификация дозировки в здравоохранении. Мы рассмотрим две модели NER: нер позология и med7, где обе модели распознают семь категорий, включая Лекарственное средство, Продолжительность действия, Силу действия, Форму, Частоту, Дозировку и Маршрут.

нер позология — Spark NLP Models Hub

Модель ner posology от John Snow Labs специально разработана для задач NER posology в сфере здравоохранения. Он использует модель встраивания слов embeddings_clinical. Эта предварительно обученная модель глубокого обучения демонстрирует высокую эффективность при извлечении информации, связанной с лекарствами, из клинического текста.

med7 — Репозиторий GitHub

med7 — это мощная клиническая модель NER, предлагающая комплексное решение для извлечения актуальной информации из медицинских текстов. Обученный на наборе данных MIMIC-III, он совместим со spaCy v3+. Подробности модели можно найти в статье под названием Med7: переносимая клиническая модель обработки естественного языка для электронных медицинских записей, авторами которой являются Андрей Кормилицин, Неманья Ваци, Цян Лю и Алехо Невадо-Хольгадо. , опубликованный в виде препринта arXiv в 2020 году.

Реализация: использование модели ner posology.

Убедитесь, что вы приобрели и настроили необходимые лицензионные ключи для Spark NLP. Затем создайте Spark NLP и Spark Session, используя в качестве руководства официальную документацию.

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

ner_posology_langtest = nlp_pipeline.fit(spark.createDataFrame([[""]]).toDF("text"))
result = model.transform(spark.createDataFrame([['The patient is a 30-year-old female with a long history of insulin dependent diabetes, type 2; coronary artery disease; chronic renal insufficiency; peripheral vascular disease, also secondary to diabetes; who was originally admitted to an outside hospital for what appeared to be acute paraplegia, lower extremities. She did receive a course of Bactrim for 14 days for UTI. Evidently, at some point in time, the patient was noted to develop a pressure-type wound on the sole of her left foot and left great toe. She was also noted to have a large sacral wound; this is in a similar location with her previous laminectomy, and this continues to receive daily care. The patient was transferred secondary to inability to participate in full physical and occupational therapy and continue medical management of her diabetes, the sacral decubitus, left foot pressure wound, and associated complications of diabetes. She is given Fragmin 5000 units subcutaneously daily, Xenaderm to wounds topically b.i.d., Lantus 40 units subcutaneously at bedtime, OxyContin 30 mg p.o. q.12 h., folic acid 1 mg daily, levothyroxine 0.1 mg p.o. daily, Prevacid 30 mg daily, Avandia 4 mg daily, Norvasc 10 mg daily, Lexapro 20 mg daily, aspirin 81 mg daily, Senna 2 tablets p.o. q.a.m., Neurontin 400 mg p.o. t.i.d., Percocet 5/325 mg 2 tablets q.4 h. p.r.n., magnesium citrate 1 bottle p.o. p.r.n., sliding scale coverage insulin, Wellbutrin 100 mg p.o. daily, and Bactrim DS b.i.d.']], ["text"]))

Для визуализации извлеченных объектов вы можете использовать класс NerVisualizer из библиотеки sparknlp_display. вы можете обратиться к разделу Spark NLP Display в документации.

Реализация: использование модели med7.

Установите модель:

!pip install https://huggingface.co/kormilitzin/en_core_med7_lg/resolve/main/en_core_med7_lg-any-py3-none-any.whl

Чтобы использовать модель med7, вы можете выполнить следующие действия:

import spacy
med7 = spacy.load("en_core_med7_lg")

col_dict = {}

seven_colours = ['#e6194B', '#3cb44b', '#ffe119', '#ffd8b1', '#f58231', '#f032e6', '#42d4f4']
for label, colour in zip(med7.pipe_labels['ner'], seven_colours):
    col_dict[label] = colour
    
options = {'ents': med7.pipe_labels['ner'], 'colors':col_dict}

text = 'The patient is a 30-year-old female with a long history of insulin dependent diabetes, type 2; coronary artery disease; chronic renal insufficiency; peripheral vascular disease, also secondary to diabetes; who was originally admitted to an outside hospital for what appeared to be acute paraplegia, lower extremities. She did receive a course of Bactrim for 14 days for UTI. Evidently, at some point in time, the patient was noted to develop a pressure-type wound on the sole of her left foot and left great toe. She was also noted to have a large sacral wound; this is in a similar location with her previous laminectomy, and this continues to receive daily care. The patient was transferred secondary to inability to participate in full physical and occupational therapy and continue medical management of her diabetes, the sacral decubitus, left foot pressure wound, and associated complications of diabetes. She is given Fragmin 5000 units subcutaneously daily, Xenaderm to wounds topically b.i.d., Lantus 40 units subcutaneously at bedtime, OxyContin 30 mg p.o. q.12 h., folic acid 1 mg daily, levothyroxine 0.1 mg p.o. daily, Prevacid 30 mg daily, Avandia 4 mg daily, Norvasc 10 mg daily, Lexapro 20 mg daily, aspirin 81 mg daily, Senna 2 tablets p.o. q.a.m., Neurontin 400 mg p.o. t.i.d., Percocet 5/325 mg 2 tablets q.4 h. p.r.n., magnesium citrate 1 bottle p.o. p.r.n., sliding scale coverage insulin, Wellbutrin 100 mg p.o. daily, and Bactrim DS b.i.d.'
doc = med7(text)

spacy.displacy.render(doc, style='ent', jupyter=True, options=options)
[(ent.text, ent.label_) for ent in doc.ents]

Проведя серию тестов с использованием библиотеки LangTest Python, мы можем оценить надежность и точность моделей ner posology и med7. Эти тесты помогут нам понять их эффективность и ограничения в приложениях здравоохранения.

Метрики оценки

Чтобы тщательно оценить производительность и сравнить надежность и точность моделей ner posology и med7, мы будем использовать библиотеку LangTest Python. LangTest предоставляет широкий спектр тестов для оценки моделей NER, включая надежность и точность.

Тестирование надежности

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

Тестирование точности

Тестирование точности имеет решающее значение для оценки общей производительности моделей NER. Он включает в себя измерение того, насколько хорошо модели могут правильно предсказывать результаты на наборе тестовых данных, с которым они раньше не сталкивались. LangTest предоставляет различные тесты на точность для оценки точности, полноты, оценки F1, микро-оценки F1, макро-оценки F1 и взвешенной оценки F1.

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

Оценка производительности модели с помощью LangTest

Теперь, когда мы представили две известные модели здравоохранения NER, ner posology и med7, важно оценить и протестировать их эффективность. Оценка этих моделей позволяет нам понять их сильные и слабые стороны и общую пригодность для извлечения соответствующей информации из клинического текста. Для этого мы будем использовать LangTest.

Чтобы использовать LangTest, вы можете установить его с помощью pip

# Installing LangTest version 1.3.0
!pip install langtest==1.3.0

Сначала мы импортируем класс Harness из библиотеки LangTest следующим образом.

from langtest import Harness

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

Вот список различных параметров, которые можно передать классу Harness:

Тестирование модели нер позологии

Создание экземпляра класса Harness

мы создали экземпляр класса Harness для выполнения NER-тестирования модели ner posology. Мы указали тестовые данные, поставили задачу «нер» и предоставили модель.

harness = Harness(
            task = "ner",
            data={"data_source":"sample-test.conll"},
            model={"model":ner_posology_langtest,"hub":"johnsnowlabs"}
        )

Настройка тестов

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

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

# Define the test configuration function
def configure_tests():  
    robustness_tests = [
        'uppercase', 'lowercase', 'titlecase', 'add_punctuation', 'strip_punctuation',
        'add_slangs', 'dyslexia_word_swap', 'add_abbreviation', 'add_speech_to_text_typo',
        'number_to_word', 'add_ocr_typo', 'adjective_synonym_swap'
    ]
    accuracy_tests = [
        'min_precision_score', 'min_recall_score', 'min_f1_score', 'min_micro_f1_score'
    ]
    
    min_pass_rate = 0.70
    min_score = 0.70
    
    tests_configuration = {
        'defaults': {'min_pass_rate': 0.70},
        'robustness': {test: {'min_pass_rate': min_pass_rate} for test in robustness_tests},
        'accuracy': {test: {'min_score': min_score} for test in accuracy_tests}
    }
    
    harness.configure({
        'tests': tests_configuration
    })

Создание и выполнение тестового набора

#Configure the Tests
configure_tests() # Call the test configuration function

# Generating the test cases
harness.generate()  # This method automatically generates test cases based on the provided configuration.

# Running the tests
harness.run()  # This method is called after harness.generate() and is used to run all the tests. It returns a pass/fail flag for each test.

# Generated Results
harness.generated_results()  # To obtain the generated results.

Отчет об испытаниях

harness.report()

Тестирование модели med7

Создание экземпляра класса Harness

harness = Harness(
            task = "ner",
            data={"data_source":"sample-test.conll"},
            model={"model":"en_core_med7_lg","hub":"spacy"}
        )

Создание и выполнение тестового набора

# Configure the Tests
configure_tests() # Call the test configuration function

# Generating the test cases
harness.generate()  # This method automatically generates test cases based on the provided configuration.

# Running the tests
harness.run()  # This method is called after harness.generate() and is used to run all the tests. It returns a pass/fail flag for each test.

# Running the tests
harness.report()

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

сравнение pass_rate ner posology из JSL и med7 из spacy.

После оценки эффективности моделей ner posology и med7 с точки зрения надежности и точности были получены следующие результаты:

  • Точность. Модель ner_posology продемонстрировала исключительную точность, добившись идеального результата во всех тестах, связанных с точностью. Напротив, модель med7 имела недостатки: наблюдались сбои в тестах на точность, отзыв и оценку F1.
  • Надежность. С точки зрения надежности модель ner posology превзошла модель med7 в большинстве категорий испытаний. Это указывает на способность нер-позологической модели эффективно обрабатывать более широкий диапазон входных данных, подчеркивая ее превосходную надежность.

Заключение

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

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

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