среда, 23 августа 2017 г.

Доктор, у меня это… Data Science. Часть 2.

«...risk of dying as a result of a medical error far surpasses the risk of dying in an airline accident»
(риск смерти вследствие врачебной ошибки намного больше, чем риск гибели в авиационной аварии)

"To Err is Human: Building a Safer Health System."
«...во имя безопасности пациентов необходимо превратить непосильную для врача интеллектуальную работу (порождающую врачебные ошибки) в посильную и, по возможности, безошибочную.»[1] Именно эта мысль, наряду с любопытством ученого, явилась основной движущей силой, сподвигнувшей меня написать мой предыдущий пост "Доктор, у меня это… Data Science.".
Примечательно то, что предыдущий пост вызвал ощутимый интерес среди читателей. В частности прозвучало предложение более всесторонне проверить поиск, взяв за основу симптомы болезней известных людей. Хорошая идея. Большое спасибо. Так и поступим.

Великий Федор Иванович Шаляпин, жизнь которого оборвал острый миелобластный лейкоз... В сети есть несколько описаний симптомов его болезни. Например, в "История болезни Ф.И. Шаляпина" говорится "У пациентов с пониженным содержание эритроцитов проявляются классические симптомы анемии: быстрая утомляемость, одышка, бледный цвет лица. У пациентов с низким содержанием тромбоцитов могут возникать длительные кровотечения и образовываться синяки и ссадины, которые заживают очень долго или не заживают вообще. Признаком низкого содержания лейкоцитов являются частые инфекции и боли в костях и суставах." Другие источники дополняют картину заболевания некоторыми деталями.

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

Замечу, что ни в одном из справочников нет статьи, описывающей именно острый миелобластный лейкоз, которому присущи типичные симптомы анемии.

Результаты поиска по первому медицинскому справочнику:

Результаты поиска по второму медицинскому справочнику:

Результаты поиска по третьему медицинскому справочнику:


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

«Вероятность несчастного случая в самолете составляет 1 на 3 миллиона. Риск возникновения несчастного случая в больнице 1 на 300»[2].

«В медицине, как и в других науках, существуют свои незыблемые устои, образовавшиеся в ходе длительного исторического развития. Это стереотипы медицинского мышления, устоявшиеся профессиональные привычки, наработанный стиль написания медицинской литературы.»[1] Стиль написания медицинской литературы, как мне кажется, является одной из причин такого согласия во мнениях. Стилистика медицинских текстов - это тема для исследования, требующая специального обсуждения.

А сейчас возьмем для примера "болезнь великих людей" - Болезнь Паркинсона. От нее страдали Сальвадор Дали, математик Андрей Колмогоров, испанский диктатор Франсиско Франко и многие другие. Жизнеописания этих людей и их недугов найти несложно.

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

Результаты поиска по первому медицинскому справочнику:

Результаты поиска по второму медицинскому справочнику:

Результаты поиска по третьему медицинскому справочнику:

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

«На протяжении тысячелетий ошибки и неудачи были Суровым Учителем не только для начинающих врачей, но и для лучших целителей мира. Бесконечный конвейер сломанных судеб и загубленных душ терялся в волнах вечности и плавно превращался в драгоценные крупицы медицинского опыта.»[1]

Для поиска я формировал симптоматическую картину каждого из рассмотренных здесь заболеваний, стараясь при этом избегать медицинской терминологии, дабы не упрощать задачу поиска и сделать саму картину заболевания менее четкой, придавая ей более пространно-описательный характер, свойственный речам пациента, рассказывающего о своих недугах на приеме у врача. Надеюсь, что мне удалось при формировании списков симптомов добиться баланса между естественностью языка и специальной терминологией.
«Вместе с тем, необходимо обеспечить удобства для врача, который привык к естественному языку и не хочет от него отказываться.»[1]

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

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

Результаты поиска по первому медицинскому справочнику:

Результаты поиска по второму медицинскому справочнику:

Результаты поиска по третьему медицинскому справочнику:

Бедный Джонатан Свифт. Он страдал этой болезнью. Наверное с диагнозом его лечащим врачам пришлось изрядно попотеть...

Полагаю, что на этом можно подвести черту.

Все интересные идеи, конструктивные замечания и добрые слова будут восприняты с вниманием и признательностью.

Литература:
1. Паронджанов В. Д., Почему врачи убивают и калечат пациентов, или Зачем врачу блок-схемы алгоритмов? Иллюстрированные алгоритмы диагностики и лечения – перспективный путь развития медицины. Клиническое мышление высокой точности и безопасность пациентов. / Предисловие члена-корр. РАН Г. В. Порядина – М.: ДМК Пресс, 2017. – 340 с.
2. Восьмой форум по вопросам будущего. Управление безопасностью пациентов. Эрпфендорф, Австрия, 28–29 апреля 2005 г. – Всемирная организация здравоохранения. Европейское региональное бюро. Copenhagen, Denmark, 2006. – 38 с. – С. 3.

понедельник, 14 августа 2017 г.

Доктор, у меня это… Data Science.

У меня мозги за разум не заходят - верьте слову, -
Задаю вопрос с намеком, то есть лезу на скандал:
"Если б Кащенко, к примеру, лег лечиться к Пирогову -
Пирогов бы без причины резать Кащенку не стал..."

(Владимир Высоцкий "Никакой ошибки")

На исходе одного из трудовых программистских будней я смотрел по телеканалу "History" передачу "Dead Famous DNA", которую ведет Марк Эванс. Там шла речь о болезни Чарлза Дарвина и ее симптомах. Эта болезнь называется "Болезнь Крона" (энтерит).

Интересно, а вот как при отсутствии медицинского образования отыскать в "многословно-заумной" медицинской литературе название болезни, имея в распоряжении только набор симптомов, который может оказаться далеко не исчерпывающим?

Эта задача показалась мне интересной. Для ее решения я нашел в Интернете и загрузил три объемных медицинских справочника. Для обработки и индексации медицинских данных (corpus of Russian language plain text documents) написал программу, то есть я проиндексировал медицинские справочники, сделав их доступными для полнотекстового поиска. Медицинский справочник - это такая книга, в которой описания различных недугов приведены в алфавитном порядке от "А" до "Я": от "Аборт" и до "Язва".
Data Science весьма увлекательное и познавательное занятие, но технические подробности процесса исследования и индексирования данных мы здесь опустим.
В результате у меня получилась специализированная медицинская система полнотекстового поиска с учетом морфологии русского и английского языков.

Симптомы болезни Ч.Дарвина, по которым производился поиск, следующие: лихорадка, похудение, боли в суставах, урчание, вздутие, слабость, усталость, повышение температуры, боль в животе, диарея, рвота, вздутие кишечника, потеря веса, бессонница, истерика.

Вот то, что у меня получилось.
На картинках выведены только названия первых 10 болезней, отсортированных по релевантности. Значения показателя релевантности в третьем столбце (это вещественное число, например, 25.4355).

Результаты поиска по первому медицинскому справочнику:



Результаты поиска по второму медицинскому справочнику (в нем описания именно болезни Крона нет, а есть энтерит!) :



Результаты поиска по третьему медицинскому справочнику (и в нем тоже описания именно болезни Крона нет.) :

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

Продолжение "Доктор, у меня это… Data Science. Часть 2."

суббота, 3 июня 2017 г.

How to install Go in Cygwin.

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Prerequisites: Cygwin and Git are already installed in your Windows 7.

0. Read "Installing Go from source". It's optional. :)
1. Download go1.8.3.windows-386.zip
2. Unzip go1.8.3.windows-386.zip into в D:\go1.8.3.windows-386
3. Start Windows console:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D:\Console2>set GOROOT=D:\go1.8.3.windows-386\go

D:\Console2>echo %GOROOT%
D:\go1.8.3.windows-386\go

D:\Console2>set Path=%Path%;%GOROOT%\bin

D:\Console2>echo %PATH%
C:\Windows\system32;C:\Windows;...;D:\Git\cmd;D:\go1.8.3.windows-386\go\bin

D:\Console2>where go
D:\go1.8.3.windows-386\go\bin\go.exe
4. Start cygwin:
Vadim@Vadim-PC ~
$ which git
/cygdrive/d/Git/cmd/git

Vadim@Vadim-PC ~
$ git clone https://go.googlesource.com/go
Cloning into 'go'...
remote: Sending approximately 148.89 MiB ...
remote: Total 305345 (delta 240031), reused 305345 (delta 240031)
Receiving objects: 100% (305345/305345), 148.89 MiB | 1.06 MiB/s, done.
Resolving deltas: 100% (240031/240031), done.
Checking out files: 100% (6627/6627), done.

Vadim@Vadim-PC ~
$ cd go

Vadim@Vadim-PC ~/go
$ git checkout go1.8.3
Note: checking out 'go1.8.3'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b 

HEAD is now at 352996a381... [release-branch.go1.8] go1.8.3

Vadim@Vadim-PC ~/go
$ git checkout master
Previous HEAD position was 352996a381... [release-branch.go1.8] go1.8.3
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

Vadim@Vadim-PC ~/go
$ cd src

Vadim@Vadim-PC ~/go/src
$ ./make.bat
##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find C:\Users\Vadim\Go1.4\bin\go.exe
"Set GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4."

Vadim@Vadim-PC ~/go/src
$ GOROOT_BOOTSTRAP=D:\\go1.8.3.windows-386\\go

Vadim@Vadim-PC ~/go/src
$ echo $GOROOT_BOOTSTRAP
D:\go1.8.3.windows-386\go
5. Add command "set GOROOT_BOOTSTRAP=D:\go1.8.3.windows-386\go" into file go/src/make.bat:
...
echo ##### Building Go bootstrap tool.
echo cmd/dist
if not exist ..\bin\tool mkdir ..\bin\tool
if "x%GOROOT_BOOTSTRAP%"=="x" set GOROOT_BOOTSTRAP=%HOMEDRIVE%%HOMEPATH%\Go1.4

set GOROOT_BOOTSTRAP=D:\go1.8.3.windows-386\go

if not exist "%GOROOT_BOOTSTRAP%\bin\go.exe" goto bootstrapfail
...
6. Try to execute make.bat again:
Vadim@Vadim-PC ~/go/src
$ ./make.bat
##### Building Go bootstrap tool.
cmd/dist

##### Building Go toolchain using D:\go1.8.3.windows-386\go.
bootstrap/cmd/internal/objabi
bootstrap/cmd/internal/src
bootstrap/cmd/internal/dwarf
bootstrap/cmd/internal/sys

...skipped...

cmd/compile/internal/arm
cmd/compile/internal/arm64
cmd/compile/internal/mips
cmd/compile/internal/mips64
cmd/compile/internal/ppc64
cmd/compile/internal/s390x
cmd/compile/internal/x86
cmd/compile

Vadim@Vadim-PC ~/go/src
$ export PATH=$PATH:$HOME/go/bin

Vadim@Vadim-PC ~/go/src
$ which go
/home/Vadim/go/bin/go

Vadim@Vadim-PC ~/go/src
$ cd $HOME

Vadim@Vadim-PC ~
$ mkdir $HOME/mygo

Vadim@Vadim-PC ~
$ mkdir $HOME/mygo/src

Vadim@Vadim-PC ~
$ mkdir $HOME/mygo/src/hello

Vadim@Vadim-PC ~
$ cd mygo/src/hello

Vadim@Vadim-PC ~/mygo/src/hello
$ pwd
/home/Vadim/mygo/src/hello

Vadim@Vadim-PC ~/mygo/src/hello
$ touch hello.go
7. Check that Go is installed correctly by building a simple program.
Create a file named hello.go and put the following program in it:
package main

import "fmt"

func main() {
 fmt.Printf("Hello, world.\n")
}
8. Set up environmental variables:
Vadim@Vadim-PC ~/mygo/src/hello
$ export GOROOT=D:\\cygwin64\\home\\Vadim\\go

Vadim@Vadim-PC ~/mygo/src/hello
$ echo $GOROOT
D:\cygwin64\home\Vadim\go

Vadim@Vadim-PC ~/mygo/src/hello
$ export GOPATH=D:\\cygwin64\\home\\Vadim\\mygo

Vadim@Vadim-PC ~/mygo/src/hello
$ echo $GOPATH
D:\cygwin64\home\Vadim\mygo
9. Build and run it with the go tool:
Vadim@Vadim-PC ~/mygo/src/hello
$ go build

Vadim@Vadim-PC ~/mygo/src/hello
$ ./hello
Hello, world.

Vadim@Vadim-PC ~/mygo/src/hello
$
If you see the "Hello, world" message then Go is installed correctly.