Разработка системы рассуждения по прецедентам на основе онтологий в области диагностики заболеваний
Расскажу, как сделать CBR-систему (система рассуждения по прецедентам, в данном случае, на основе онтологий). Тема этого примера: диагностика типа ОРВИ по симптомам. Я работаю с Protege 3.4 ( http://protege.stanford.edu/ ) и JColibri 1.1 ( http://sourceforge.net/projects/jcolibri-cbr/ ).
Шаг 1 Создание классовНеобходимо выделить так называемые классы, т.е. параметры каждого из прецедентов. У нас будет 8 параметров заболевания (прецедента) и 1 результирующий параметр, значение которого должно будет вычисляться из этих 8, т.е. Диагноз пациента. Мы будем определять вид ОРВИ по следующим параметрам:
И в итоге мы получим один из диагнозов типа ОРВИ:
Создадим в Protege проект типа "OWL/RDF Files". Замечу, что после создания нужно сразу сохранить его через "Save as..." Переходим во вкладку OWLClasses, в окошке Asserted Hierarchy для суперкласса owl:Thing создадим подклассы:
У класса CBR_INDEX создаём подклассы, названные соответственно параметрам заболевания (т.е. температура, кашель и т.д.). Далее в классе CBR_DESCRIPTION создаём подкласс "Диагноз ОРВИ". Затем выделяем этот класс и справа в "Asserted Conditions" нажимаем на кнопку "Add named class..." и выбираем CBR_CASE. В CBR_CASE тоже появился "Диагноз ОРВИ”. Если справа нет такой кнопки, как нет и области "Asserted Conditions", стоит переключиться с "Properties View" на "Logic View". В итоге на вкладке OWLClasses должно получиться что-то вроде этого: Шаг 2. Заполнение свойствНа вкладке "Properties" добавляем свойства. Свойств столько же, сколько и классов в CBR_INDEX. И называются они похожим образом. Далее, переходим во вкладку OWL Classes, выделяем подкласс "Диагноз_ОРВИ" у CBR_CASE и справа в "Asserted Conditions" нажимаем на кнопку "Create new expression...". Таким образом связываем свойства с классами в CBR_INDEX. Можно использовать значок "Каждый", можно просто писать "some". Также возможно автодополнение по Tab и Ctrl+Пробел. Наконец, получилось вот что: Шаг 3. Создание списка возможных значений для каждого класса/свойстваПереходим во вкладку Individuals, перебираем все подклассы из CBR_INDEX и заполняем возможные значения для них. За создание Individual отвечает кнопка "Create instance". Например: начало болезни в нашем случае может быть: острым, постепенным, внезапным, тяжёлым. На рисунке показан этот класс с заполненными Individuals. В таком же стиле делаем оставшиеся классы. Шаг 4. Заполнение онтологии прецедентамиТеперь Выделяем CBR_CASE->Диагноз ОРВИ и добавляем Individuals для него. Каждый Individual будет отдельным case'ом, случаем, отдельной историей болезни. При добавлении должно быть показано что-то вроде этого. В каждой форме вправа нажимаем "Add..." и выбираем значение соответствующего подкласса CBR_INDEX, описывающее ситуацию в данной истории болезни. Замечу, что можно добавлять несколько значений в каждую форму. К примеру, начало болезни в одном из случаев тяжёлое и постепенное. 15 прецедентов вполне хватит. Должно получиться что-то вроде этого. Названия можно менять. Где брать case'ы? В рамках данной семестровой — нужно найти пару источников с описаниями типичных ситуаций вашей предметной области (истории болезни и диагнозы, поставленные на их основе, описания состояний системы и выводы об её работоспособности, описание вменяемых обвинений подсудимому и вынесенный приговор и т.д.). Шаг 5. Создание CBR-системыСоздаём новое CBR-приложение через CBR->New CBR system. Вводим название для новой системы и выбираем расширение "Description Logic Extension". Шаг 5.1 Настройка структуры прецедентаИдём в CBR->Manage Case Structures. В списке Type выбираем ONTOLOGY вместо STANDARD. В древовидной структуре выделяем Case – справа появляется кнопка Select Case Concept. Нажимаем эту кнопку, выбираем owl-файл с подготовленной ранее онтологией. Нажимаем ”Read Ontology”, появляются классы из Protege, выбираем класс CBR_CASE->Диагноз ОРВИ и нажимаем Select Concept. Нажать кнопку Apply Changes (иначе то, что вы изменили не сохранится!). Шаг 5.1.1 Настройка каждого параметра прецедентаВ древовидной структуре «Case» выбрать "Description", нажать "Add simple". Нажимаем "Select Concept", выбираем некоторый подкласс CBR_INDEX, соотносим его с соответствующим свойством вида "св_XXX" в выпадающем списке "Relation", "Weight" оставим 1.0, "Local Similarity" устанавливаем в "Equal" и нажимаем "Apply Changes" (иначе то, что вы изменили не сохранится!). Шаг 5.1.1 нужно повторить для всех подклассов и свойств класса CBR_INDEX из заранее подготовленного OWL-файла. В итоге должно получиться что-то вроде этого. Нажимаем "Save case structure", сохраняем структуру прецедента в xml-файл и закрываем вкладку. Шаг 6. Настройка работы CBR-машиныТеперь в древовидной структуре CBR System нажимаем на PreCycle, справа появляются свойства — нажимаем кнопку Instance – у CBR System->PreCycle появляется ещё одна ветка Obtain cases task – в её свойствах выделяем jcolibri.extensions.DL.method.LoadDLCaseBaseMethod и нажимаем Instance, в запросе файла указываем сохранённый caseStructure.xml.
Должно получиться вот так: Если какой-то квадрат остался бесцветным, значит вы забыли где-то сделать Instance. Шаг 7 Выполнение запросовВыделяем shift'ом всё от PreCycle->Obtain Cases task до Select Best Task: Нажимаем сверху на кнопку "Solve to...". Появилось окно запроса: Приведу тестовый запрос. Замечу, что заключение о типе ОРВИ оставлено пустым (empty) и ему задан нулевой вес (т.е. это значение не будет учитываться при нахождении близких прецедентов). Если в задании нужно сделать вывод о нескольких параметрах, к примеру, скорость и направление ветра, то оба параметра нужно определить таким же образом. Нажимаем OK и наблюдаем отчёт подобного вида: Отчет программы:
[JenaConnector] INFO: 15 cases loaded in 0 seconds [OntoBridge] INFO: Optimizing ontology access. This may take few minutes. [OntoBridge] INFO: Optimization finished. [SelectAllCasesMethod] INFO: Selecting all cases. [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_36 :0.1111111111111111 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_46 :0.3333333333333333 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_47 :0.4444444444444444 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_45 :0.4444444444444444 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_44 :0.4444444444444444 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_42 :0.3333333333333333 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_43 :0.2222222222222222 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_41 :0.4444444444444444 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_40 :0.3333333333333333 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_39 :0.1111111111111111 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_37 :0.5555555555555556 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_38 :0.3333333333333333 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_50 :0.2222222222222222 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_49 :0.3333333333333333 [NumericSimComputationMethod] INFO: Similarity with case Диагноз_ОРВИ_48 :0.4444444444444444
WORKING CASES: Диагноз_ОРВИ_37 has-Description: Description св_Длительность_температуры: _3-5дней св_Температура: _38-39C св_Начало_болезни: Тяжёлое св_Общая_интоксикация_организма: Выраженная св_Увеличение_лимфоузлов: Очевидно св_Кашель: Сухой св_Тип_ОРВИ: Грипп св_Лихорадка: Была св_Поражения_дыхательных_путей: Насморк has-Result: Result has-Solution: Solution
CASE BASE: 15 cases QUERY: has-Description: Description св_Длительность_температуры: _3-7дней св_Температура: _38-39C св_Начало_болезни: Острое св_Общая_интоксикация_организма: Выраженная св_Увеличение_лимфоузлов: Нет св_Кашель: Сухой св_Тип_ОРВИ: null св_Лихорадка: Была св_Поражения_дыхательных_путей: Насморк jColibri определила, что прецедентом с наиболее близкими параметрами является "Диагноз_ОРВИ_37" со значением близости 0.55(5), что и было показано после надписи WORKING CASES. А это значит, что исходя из предыдущего опыта, по текущей истории болезни поставлен диагноз "Грипп”. Некоторые улучшения:
При использовании самой библиотеки также появляются возможности улучшения интерфейса для ввода онтологий, запросов и других действий. Подробнее о взаимодействии с java-кодом в jColibri можно почитать здесь. В jColibri версии 2 особое внимание уделено именно этому взаимодействию, а не построению системы по шагам в мастере.
Бонус. Возможные области применения рассуждения на прецедентах
Часто жалуются на ошибку
Подобное может возникнуть по следующим причинам:
Добавил: FEVTMan (30.04.2013) | Категория: Искуственный интеллект Просмотров: 11009 | Загрузок: 0 | Рейтинг: 5.0/5 | Теги: |
Комментарии (7) | |||||
| |||||