[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[orca-dev:00050] Re: 病名クラス



有家@松山記念病院です。

ここまで
病名を修飾語と基本病名に分ける(形態素分析する)ことが病名クラス設計の
主な作業になってしまいましたが、コード化された病名をそのまま使うなら、
病名をsplitするような場面は、実際、ほとんど無いことと思います。

さて
修飾語の結合順位が定義できたので、ようやく加算メソッド '+' が書けそうです。

ChaSenの拡張(IPADICの編集)は一朝一夕のことではないので棚上げします (^^);
とりあえず class Disease の splitメソッドが完成するまでの間、
文節(形態素)分離子をセミコロン ":" として split, join することにします。

以下のスクリプトは 

「胃角部:出血性:重度:の疑い」「潰瘍」「急性:活動性:の再発」

という3つの病名(?)を加算すると

"急性:重度:胃角部:出血性:活動性:潰瘍:の再発:の疑い"

になるような加算メソッド '+' を定義するものです。

このままでも十分奇妙な病名なのですが、簡単に「急性胃潰瘍強迫神経症」
なんていうhybridな病名ができてしまうのが難点です。
これは最初にあげた orca? とか medis? 等でチェックして除外することにします。


▼ 以下のコードを実行してみようと思われるかたのために。
Ruby にはコマンドラインオプションとして -x というものがあり
いちいちスクリプト部分だけを切り出さなくても
このメールごと実行することができます。

 $ ruby -x (このメールのファイル名)


#!/usr/local/bin/ruby -Ke

class Disease < String
    BaseDeg = 200    # degree for combination of disease basename
    @deg = Integer   # degree for combination of disease modifier

    # read regular expressions of ICD modifiers
    Mod = Array.new
    DATA.each{|line|
        next if /^$/ =~ line || /^#/ =~ line    # skip non-data lines
        Mod.push line.split
    }

    # 病名修飾語かどうか
    def modifier?
        Mod.each{|line|
            @deg = Integer(line[0])
        #   @apd = Integer(line[1])
            tmp = "^#{line[2]}$"
            reg = Regexp.new(tmp)
            return true if reg =~ (self)
        }
        return false
    end

    # 連結強度
    def degree
        if (self).modifier?
            @deg        # return @deg as own degree of (self)
        else # basename
            BaseDeg     # return BaseDeg as common degree for basename
        end
    end

    # 加算(連結)
    def +(other)
        ((self).split(/:/).concat((other).split(/:/))).sort{|a, b|
            Disease.new(b).degree <=> Disease.new(a).degree
        }.join(":")

#       # splitメソッド完成の後には次のようになる予定
#       #
#       ((self).split.concat((other).split)).sort{|a, b|
#           Disease.new(b).degree <=> Disease.new(a).degree
#       }.join
    end
end

a = Disease.new("胃角部:の疑い:出血性:重度")
b = Disease.new("潰瘍")
c = Disease.new("急性:の再発:活動性")

p a + b + c  # <= "急性:重度:胃角部:出血性:活動性:潰瘍:の再発:の疑い"

__END__
#
# referred to 'mdfy200.txt' in archived file 'byomei20.exe'
#
# 1st field means degree of combination (renumbered)
# 2nd field reserved for appended informations
# 3rd field means regular expression of ICD modifiers

130  0   の(疑い|術後|術後障害)
180  0   の(緩解期|急性増悪|再発|初発|遷延)
#
# 200 <= 基本病名の結合強度を 200 とする。
#
240  0  (角化|活動|乾|乾燥|乾酪|還納|間擦|気腫|亀裂|丘疹|強直|狭窄|興奮)性
240  0  (湿|習慣|出血|症候|浸潤|深在|尋常|水疱|全身|多形|多発|単発|中心)性
300  0  胃(角|前庭|体|底)部
500  0  (強|軽|高|重)度
800  0  (一側|急性|慢性)

#▼ mastering Ruby 補記
#
# Rubyのクラス内での情報の持ち方として
#
# 1) 定数
#      大文字で始める。書き換えができない。
# 2) クラス変数
#      "@@"の後、小文字で始める。書き換えできる。クラス内の「集合的記憶」
# 3) インスタンス変数
#      "@"の後、小文字で始める。書き換えできる。インスタンスの「個別的記憶」
#
# の、どれを使うべきかの切り分け方が、なかなかわかりません。
# 「慣れ」しかない、とは思うのですが..
#
# => 「書くべし、書くべし」と言うだろうなあ(段平

# pba00250@xxxxxxxxx
# yoariie@xxxxxxxxxxxxxxx
# -------------------------
# 有家佳紀  Yoshinori Ariie