Опыт использования open-source инструментов Natural Language Processing на медицинском корпусе Максим Брегеда Data Scientist Expasoft Новосибирск 14.05.2015 1 IBM Watson, 2014 IBM is building two versions of Watson in oncology 1) Trained in lung, colorectal, and breast cancer field Memorial Sloan Kettering Cancer Center (NY) In beta-testing!! 2) Trained in leukemia field The University of Texas MD Anderson Cancer Center. Knowledge from: • medical journals • textbooks • treatment guidelines Treatment Plan Patient’s EHR 2 Машинное обучение в медицине Примеры задач ML и решаемых медицинских проблем: Дискретная классификация • Задачи медицинской диагностики Непрерывная регрессия • Прогнозирование рисков осложнений (вероятность) Кластеризация • Обнаружение сходных групп клинических случаев • Задачи эпидемиологии 3 Какие бывают данные? Данные Тип EHR, заключения неструктурированный текст Фото, рентген, УЗИ, MRI, PET изображения Результаты анализов, показатели жизнедеятельности структурированный текст числа Диагностика по методу В.М.Успенского (ЭКГ). К.Воронцов, 2014 И др. 4 Машинное обучение в медицине 1. 2. 3. 4. 5. 6. 7. Выбор моделей (model selection) Сбор данных (data collection) Предобработка (data pre-processing) Выбор/создание признаков (feature engineering) Обучение моделей (learning) Анализ результатов и повышение качества моделей Эксплуатация 5 Машинное обучение в медицине 1. 2. 3. 4. 5. 6. 7. Выбор моделей (model selection) Сбор данных (data collection) Предобработка (data pre-processing) Выбор/создание признаков (feature engineering) Обучение моделей (learning) Анализ результатов и повышение качества моделей Эксплуатация Если мы хотим работать с неструктурированным текстом? = NLP, Natural Language Processing 6 Цель доклада Рассказать об опыте применения некоторых open-source инструментов для процессинга медицинских текстовых корпусов на русском языке. 7 Общепринятая практика: NLP pipeline текст на естественном языке обрабатывается конвейером 8 Общепринятая практика: NLP pipeline 9 Общепринятая практика: NLP pipeline From: IBM Watson: Clinical Decision Support. Dr. Martin Kohn. IBM Research, 2011. 10 На чем разрабатывать конвейер? Apache UIMA Unstructured Information Management Architecture: Java (IBM Watson!) Более прикладные фреймворки: • • • • General Architecture for Text Engineering (GATE): Java Natural Language Toolkit (NLTK): Python Stanford CoreNLP (CoreNLP): Java И множество других: https://nlpub.ru/Обработка_текста 11 На чем разрабатывать конвейер? • Apache UIMA • GATE • NLTK • Stanford CoreNLP • … Что общего? • Конструкторы базовых блоков (моделей) • Используют Machine Learning • Open-source (academic license) 12 На чем разрабатывать конвейер? • Apache UIMA • GATE • NLTK • Stanford CoreNLP • … Что общего? • • • • Конструкторы базовых блоков (моделей) Используют Machine Learning Open-source (academic license) Не поддерживают русский язык 13 Практическая часть NLP для русского корпуса 1. Ресурсные проблемы 2. проблемы РєРѕРґРёСЂРѕРІРєРё (проблемы кодировок ) 3. Вопросы hardware 4. Практика построения конвейера медицинских текстов 5. Некоторые результаты 14 1. Ресурсные проблемы Для английского языка WordNet (1985) • • • lexical database for the English languageю BSD лицензия (допускает проприетарное коммерческое использование ПО) 155K слов Задачи: (word sense disambiguation, similarity between words – важный этап пониманию текста) Treebanks:: Penn Treebank (1992) • • Свободная лицензия Задачи: POS, dependency parsing Медицинский домен: UMLS (1986) коллекция тезаурусов • • • Свободная академическая лицензия Задачи медицинской информатики Ежемесячное обновление! 15 1. Ресурсные проблемы Для английского языка • Это стандарты в NLP • Причем не единственные • + Много датасетов (WallStreet journal etc.) 16 1. Ресурсные проблемы Что для русского? Тезаурус РуТез • web-интерфейс урезанной lite-версии на сайте СинТагРус • История обновлений не публикуется • Подписать лицензионное соглашение • Отослать его и скан паспорта - возможно дадут доступ OpenCorpora (crowd source) морфологически, синтаксически и семантически размеченный корпус русскоязычных текстов • перспектива русскоязычного NLP-сообщества! http://www.opencorpora.org Датасеты: Диалог пытается создавать. • Не выкладывают в свободный доступ. 17 1. Ресурсные проблемы Объемы корпусов меньше (объем не панацея!) • составные слова • коллокации • синонимия • омонимия • гипоним/гипероним • мероним/холоним • логическое следование • и т.д. Закрытость данных не позволяет оценить качество наполнения корпуса в различных приложениях. “car pool” А ведь у нас специализированный домен! 18 1. Ресурсные проблемы Кто виноват? • Там начали раньше • Быстро выложили в свободный доступ • Русский язык богаче и сложнее Что делать? • Работать с чем есть • Собрать свой корпус • Переводить (UMLS) • Поддерживать инициативы вроде OpenCorpora 19 2. проблемы РєРѕРґРёСЂРѕРІРєРё Кодировка Отсуствие поддержки юникода ядром Windows делает невозможной разработку NLP-моделей: • Требуется быстро пробовать множество сторонних утилит/алгоритмов/фреймворков • Костыли вводящие поддержку unicode решают проблемы только Microsoft-программ (в основном утилит в составе ОС) • English-speaking пользователи никогда в жизни не выходят за пределы ASCII • Проблема «символ Я = EOF» (преждевременное прерывание чтения C++, stdin, и проч.) • Вопросы на StackOverflow обсуждают между собой неанглоговорящие пользователи, в каждой кодовой таблице свои экзотические проблемы 20 2. проблемы РєРѕРґРёСЂРѕРІРєРё Забудьте про Windows (и Mac OS тоже) Используйте Unix! Рекомендации по OS • • • • • • Server OS (Ubuntu/Debian) Поддержка юникода в ядре Десктоп/сервер на UNIX мало чем отличаются Минимум ненужных утилит изначально Опыт работы/установки/компиляции под unix Вы сможете участвовать в этапе запуска решения в production (там будет серверная ОС) 21 2. проблемы РєРѕРґРёСЂРѕРІРєРё Рекомендации по кодировке • Только UTF-8 ! • Знать «матчасть» The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) http://www.joelonsoftware.com/articles/Unicode.html http://quantifyingmemory.blogspot.ru/2013/11/top-seven-tips-for-processing-foreign.html 22 2. проблемы РєРѕРґРёСЂРѕРІРєРё Рекомендации по кодировке (продолжение) • Делать валидацию кодировки исходных текстов Google for “UTF-8 validation” Есть готовые библиотеки Python, Java «Эй, но это задача для программистов продакшен-решения!» Не совсем. Мы работаем с Big Data, недельный расчет модели вылетает с исключением «illegal utf-8 character» - неприятно 23 3. Распространенный миф о Hardware «Для серьезного data science нужен мощный кластер и HADOOP» = заблуждение Серьезный не всегда значит большой. Продакшен – да. Для прототипирования моделей, проверки гипотез и экспериментов на корпусе размером с Википедию вполне хватит: • Современный десктоп Corei5-i7 (4 ядра) • Вирутализация Oracle VM Box / VMware / MS Virtual PC – привычная ОС на хосте, unix на гостевой. • Как можно больше оперативной памяти (парсеры зависимостей могут много «есть») half 24 3. Распространенный миф о Hardware «Для серьезного data science нужен мощный кластер и HADOOP» = заблуждение Исключения: 1. Для серьезной работы с Deep Convolution Nets понадобится GPU (Nvidia Cuda) – ускорение десятки раз. (Мощно, на не критично, Tesla K20 - 170K руб.). 2. Случай действительно Big Data: Аренда выч.мощностей в облаке on-demand для расчета готовых отлаженных моделей (Amazon AWS etc…) 3. Быстрый кластер можно собрать своими силами (Apache Storm!) 25 Вкратце об Apache UIMA В паре слов об архитектуре Связь сущностей и аннотаций и их представление в CAS 26 Вкратце об Apache UIMA Analysis Engine = NLP procedure CAS = Common Analysis Structure CPE = main pipeline processor 27 4. Конвейер на Apache UIMA 28 4. Конвейер на Apache UIMA 29 4. Конвейер на Apache UIMA Конвейер: более детально • • • • • • • • • Cleaning Sentence detection Tokenization Lemmatization POS Сhunking Dependency parsing Entity/fact extraction (NER) Domain-specific tasks (у нас специализация – Медицинский домен) 30 4. Конвейер на Apache UIMA Пример результатов работы конвейера (xml) Модели: Sentence detector + tokenizer 31 4. Конвейер на Apache UIMA Как это выглядит на практике? Обычное Java приложение в Eclipse. 32 4. Конвейер на Apache UIMA Как это выглядит на практике? Обычное Java приложение в Eclipse. Устанавливаем: • IDE Eclipse • UIMA Eclipse Plugins (устанавливается из репозитория Maven) • Скачиваем Framework: UIMA SDK (или из maven) Несколько утилит в составе UIMA: • Collection Processing Manager – создание CPE • Component Descriptor Editor – редактор настроек в XML • CAS visual debugger (CVD) – запуск AE и анализ результатов Официальная документация по UIMA = must read! 33 4. Конвейер на Apache UIMA Классическая UIMA Преимущества: • Фундаментальная архитектура, низкого уровня • Популярная (IBM Watson!) • Кросс-платформенная Java (не для всех: Utf-8/Windows) • Хорошо документирована • Все можно написать самому Недостатки: • Устаревший стек технологий (XML файлы) • Все нужно писать самому + Хотелось бы специализации на медицинской тематике 34 Выход? Использовать специализированные фреймворки: • UIMA Fit – библиотека-расширение (забываем об XML) • cTAKES (базируется на UIMA Fit) • DKPro (базируется на UIMA Fit) 35 UIMA FIT 36 Apache cTAKES Homepage: http://ctakes.apache.org Wiki docs: https://cwiki.apache.org/confluence/ display/CTAKES/cTAKES LVG – lexical variant generator, based on UMLS Specialist 37 Apache cTAKES 38 Apache cTAKES Проблемы/особенности: • Существенная интеграция с UMLS • Английский язык моделей • Плохая документация • Почти все переписывать Плюсы: • Много идей что должно входить в конвеер медицинских текстов (NegEx) 39 DKPro Core В итоге был выбран DKPro Core https://code.google.com/p/dkpro-core-asl/ (Apache Licensed components) https://code.google.com/p/dkpro-core-gpl/ (GNU Licensed components) DKPro: • проект по интеграции разнородных внешних NLP-компонентов (моделей) • философия: быстрое прототипирование NLP-моделей и воспроизводство результатов (за счет централизованного model setup) • Open-source (maven, GitHub) • Обновление (добавление новых моделей) • Не привязан к процессингу только английского текста (хотя этот язык доминирует среди моделей) 40 DKPro Core DKPro Core (детали): • Использует UIMA FIT • Поддержка языков Java, Python, Groovy. Две версии: 1. первая содержит только компоненты, распространяющихся под лицензией Apache (ASL) больше моделей! 2. вторая - только компоненты распространяюшщиеся под публичной лицензией (GNU). Списки моделей: • https://code.google.com/p/dkpro-core-asl/ • https://code.google.com/p/dkpro-core-gpl/ 41 DKPro Core 42 DKPro Core Пример кода конвейера 43 Практические результаты • • • • • • • • • Cleaning (R) Sentence detection (DKPro) Tokenization (DKPro) Lemmatization (DKPro + mystem) POS (DKPro + mystem) Сhunking Dependency parsing Entity/fact extraction (NER) Domain-specific tasks (у нас специализация – Медицинский домен) • Корпус 56К записей EHR • 8 часов работы (VM Core i5 2 ядра, 4 Гб, Host: SQL-сервер) • Лематизатор/POS ~ 99% 44 Практические результаты Cleaning • Валидация кодировки • Удалены стоп-слова (top 100 по статистике OpenCorpora) • Удалены лишние пробелы 45 Практические результаты Sentence detection DKPro модель в принципе работает, крайне плохо здесь: «операция проведена в 2005 г. без осложнений» DKPro использует Apache OpenNLP SD В основе MaxEnt (байесовский классификатор) Перетренирован на корпусе OpenCorpora (93K предложений) Существенное сокращение числа ошибок типа «…2005 г.». Дальнейшие пути повышения точности: • исп.медицинский корпус (сокращения мед.терминов, единицы измерения и т.д.) • совмещение rule-based (рег.выражения) 46 Практические результаты Tokenization Использован DKPro – модель OpenNlpSegmenter (Tokenizer) • MaxEnt классификатор • Натренирован на англоязычном корпусе • Хорошо справляется 47 Практические результаты Lemmatization Лемма – начальная форма слова (им.падеж, ед.число) Что есть для русского языка? • Яндекс mystem match по префиксному дереву trie Своя лицензия (есть версия для research) https://tech.yandex.ru/mystem • Pymorthy2 MIT-лицензия, open-source! реализация DAWG/DAFSA (space efficient trie) https://pymorphy2.readthedocs.org/en/latest/ http://habrahabr.ru/post/176575/ • Solarix проприетарный, free demo, версия для research Алгоритмы ML http://solarix.ru Эти же инструменты делают анализ частей речи (POS) 48 Практические результаты Lemmatization Поддержки этого нет для UIMA/DKPro Нужно: • Самим написать Analysis Engine • Решать проблему снятия омонимии Все совр. морфологические анализаторы выдают ранжирование значений омонима при разборе (точность = ?) Lemmatization Использован Яндекс mystem: лемматизатор и POS-таггер Прекрасно справляется с мед.терминологией (морфологические правила единые для языка?). Пример вывода для «стали» [{"text":"стали","analysis":[ {"lex":"становиться","gr":"V,нп=прош,мн,изъяв,сов"}, {"lex":"сталь","gr":"S,жен,неод=пр,ед"}, {"lex":"сталь","gr":"S,жен,неод=вин,мн"}, {"lex":"сталь","gr":"S,жен,неод=дат,ед"}, {"lex":"сталь","gr":"S,жен,неод=род,ед"}, {"lex":"сталь","gr":"S,жен,неод=им,мн"}]}] Технически: CLI (+параметры): вызов из bash >> stdout Корпус > 50К документов (EHR) ~ 8 часов VirtualBox Ubuntu Server, Rобертка, Core i5, 2 ядра, 16Гб ОЗУ (Host: SQL-сервер) 50 Medical domain-specific tasks Это направление дальнейшей работы Детектирование отрицания (очень важно!) cTAKES исп. NegEx – negation detection algorithm Детектирование неточных утверждений («возможно, вероятно») Опечатки (Spell Correction) достаточно просто 1. 2. 3. Detection mispelled term (частота по корпусу) Generate list of candidates to replace (UMLS Specialist Lexicon / Wordnet (secondary src) Rank them (distance) Медицинские онтологии для русского языка Перевод UMLS = ? Омонимия Не очень острая проблема для мед.терминологии И т.д. 51 1. 2. 3. 4. Практические результаты Маленький корпус 1000 документов (EHR) Кардиохирургия Обработан конвейером Word2vec 200 dims Проекция T-SNE для визуализации Lemmatization Поддержки этого нет для UIMA/DKPro Нужно: • Самим написать Analysis Engine • Решать проблему снятия омонимии Все совр. морфологические анализаторы выдают ранжирование значений омонима при разборе (точность = ?) Практические результаты Примеры кластеров Слева: кластер беременности, здесь кроме однокоренных отнесены "неделя" и аббревиатура "нед" Внизу: кластер гипертонии: семантически близки все возможные "гипер *тонии *тензии" и "риск". Термин "эссенциальный" вызвал вопросы, но оказалось есть "эссенциальная гипертония" (95 % всех случаев). Практические результаты Примеры кластеров Вверху: кластер протезирования. Из интересного тут: "Тромбэктомия" операция по удалению тромботических масс из ранее установленного протеза. "Карбоникс" - марка протезов. Практические результаты Здесь не использовано: • ни одного классфикатора • ни одной нейросети, кроме примитивной word2vec только NLP-конвейер (а уже интересная семантика!) ОСНОВНОЙ РЕЗУЛЬТАТ Имеем признаки для более сложных моделей ML (в промышленных масштабах): • • • • • • Предложение Токен Лемма Морфологическая информация Частичное снятие омонимии Статистика семантической близости Основные выводы Предложены практические рекомендации для исследователей в области NLP русского языка по выбору программного open-source инструментария, организации рабочей среды и аппаратной инфраструктуры. Также рассмотрены некоторые аспекты, специфические для текстов медицинской тематики. Показана практическая целесообразность использования UIMA Common Analysis Structure (CAS) в качестве модели представления знаний в медицинском домене. Использование фреймворка DKPro (основан на Apache UIMA) показало высокую скорость разработки NLP-моделей за счет унификации и повторного использования кода, а также интеграции лучших современных алгоритмов обработки текста. Показано что поддержка русского языка достаточно нетрудозатратно реализуема в DKPro как за счет перетренировки стандартных моделей, так и за счет интеграции программных компонент в конвейер (Яндекс mystem). Спасибо Спасибо за внимание! Вопросы?