[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[orca-dev:00050] Re: 病名クラス
- To: orca-dev@xxxxxxxxxxxxxx
- Subject: [orca-dev:00050] Re: 病名クラス
- From: Yoshinori Ariie <PBA00250@xxxxxxxxx>
- Date: Mon, 27 May 2002 18:25:20 +0900
有家@松山記念病院です。
ここまで
病名を修飾語と基本病名に分ける(形態素分析する)ことが病名クラス設計の
主な作業になってしまいましたが、コード化された病名をそのまま使うなら、
病名を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