Вопрос или проблема
Предположим, у меня есть абзац, который объясняет травмы и их описания. Я хочу извлечь травмы и соответствующие им описания из текста. Как я могу это сделать?
Например, абзац будет следующим:
На мой взгляд, боль в шее вызвана травмой мягких тканей. Перелом на руке будет устранен через 2 месяца. Боль в плече и шее вызвана травмой мягких тканей. Имеется скованность и дискомфорт в области бедра.
Ожидаемый вывод:
{
"шея": ["мягкие ткани"],
"рука": ["перелом"],
"плечо": ["мягкие ткани"],
"бедро": ["скованность", "дискомфорт"]
}
Какие техники обработки естественного языка могут быть использованы здесь?
У нас есть два текстовых файла для травм и описаний.
Но как мы свяжем или сопоставим описание с соответствующей травмой?
Я пробовал зависимый парсер, но проблема в том, что нам нужно написать множество шаблонов для каждой травмы, у нас более 100 травм и более 100 описаний. Поэтому, если мы будем писать шаблоны для всех травм, их будет очень много, и я считаю, что это займет слишком много времени и ресурсов.
Существуют ли другие способы сделать такую извлечение?
Абзац не имеет общей структуры.
Я использую Python и Spacy для этого.
Учитывая неструктурированный характер ваших описаний травм, я не думаю, что это возможно с помощью классических техник обработки естественного языка. Я предлагаю вам использовать большую языковую модель (LLM), либо из семьи OpenAi GPT, либо нечто подобное Llama или RedPajama. Дайте ей подсказку с примером, и она должна дать вам результат.
Это будет пример возможной подсказки с использованием вашего примера:
Дано описание состояния пациента, извлеките диагноз их травм:
Описание: На мой взгляд, боль в шее вызвана травмой мягких тканей. Перелом на руке будет устранен через 2 месяца. Боль в плече и шее вызвана травмой мягких тканей. Имеется скованность и дискомфорт в области бедра.
Травмы: {
"шея": ["мягкие ткани"],
"рука": ["перелом"],
"плечо": ["мягкие ткани"],
"бедро": ["скованность", "дискомфорт"]
}
Описание: боль в копчике вызвана повреждением костей копчика. Ушиб на руке обусловлен травмой мягких тканей.
Травмы: {
Модель завершит JSON с травмами за вас. Затем вы сможете его разобрать. Учитывая недостаток разнообразия в вашем примере, вам, вероятно, понадобится предоставить еще несколько примеров и, возможно, с более широким разнообразием травм. Проектирование эффективной подсказки (также известной как “инженерия подсказок”) является частью использования LLM.
Обратите внимание, что вам не нужно переобучать модель, вы можете просто использовать предварительно обученные модели как таковые, предоставляя разумную подсказку, позволяющую LLM давать желаемые выходы.
Что касается того, какую модель использовать, в настоящее время имеется десятки моделей. Некоторые являются универсальными, другие обучены на медицинских данных. Лицензия некоторых из них позволяет коммерческое использование, а другие разрешают только исследовательские цели. Некоторые очень большие, а другие меньшие. Вам следует исследовать доступные в настоящее время предварительно обученные модели и выбрать ту, которая дает хорошие результаты, соответствуя вашим операционным ограничениям.
Ответ или решение
Чтобы извлечь травмы и их описания из неструктурированного текста, как указано в вашем примере, можно применить несколько подходов. Давайте рассмотрим возможные методы, включая использование нейролингвистического программирования (NLP) и более современные технологии, такие как модели на основе глубокого обучения.
1. Использование традиционных методов NLP
a. Регулярные выражения
Вы можете применить регулярные выражения для поиска паттернов, связанных с травмами и их описаниями. Например, можно искать конструкции "боль в [часть тела]", "травма [часть тела]" и т. д. Однако этот метод имеет ограниченную гибкость и требует тщательной настройки.
b. Обработка зависимостей
Использование парсинга зависимостей (dependency parsing) может помочь установить связь между травмой и ее описанием. Однако, как вы отметили, это потребует написания множества паттернов для каждой травмы, что может быть трудоемким.
2. Модели глубокого обучения и LLM
a. Использование языковых моделей
На сегодняшний день одним из наиболее эффективных способов извлечения информации из неструктурированного текста является использование крупных языковых моделей (LLM), таких как GPT от OpenAI, или других моделей, обученных на медицинских данных. Вы можете использовать предобученные модели, предоставляя им контекст с примерами, чтобы они могли генерировать требуемый формат вывода.
Пример подсказки (prompt):
Предоставьте описание состояния пациента, извлеките диагноз их травм:
Описание: На мой взгляд, боль в шее вызвана мягкотканевой травмой. Перелом на руке будет устранен через 2 месяца. Боль в плече и шее вызвана мягкотканевой травмой. Есть скованность и дискомфорт в области бедра.
Травмы: {
"шея": ["мягкотканевая"],
"рука": ["перелом"],
"плечо": ["мягкотканевая"],
"бедро": ["скованность", "дискомфорт"]
}
Модель может обработать такой запрос и генерировать соответствующий JSON с извлеченными травмами и описаниями.
3. Тестирование и выбор модели
В зависимости от требований вашего проекта (например, масштабируемость, скорость обработки) стоит протестировать несколько моделей и выбрать подходящую. Важно протестировать как общедоступные модели, так и специализированные (обученные на медицинских данных).
Заключение
Для эффективного извлечения информации из текстов о травмах, рекомендую использовать комбинацию традиционных методов NLP и современного подхода с использованием LLM. В идеале, создайте примеры подсказок, которые смогут ориентировать модель на извлечение нужной информации. Применение LLM с предобученными знаниями может значительно ускорить процесс и повысить точность извлечения данных, минимизируя при этом объем ручного труда.