漢方薬の効能効果、適用症状、禁忌事項を考慮した推奨アルゴリズムの実装について
漢方薬の効能効果、適用症状、禁忌事項を考慮した推奨アルゴリズムを実装しました。この記事では、34種類の漢方薬に対する詳細なルールの実装について解説します。
漢方薬は、西洋薬とは異なる考え方に基づいています:
ドラッグストアでの現場経験を通じて、漢方薬の選択の難しさを実感しました。漢方薬は、症状だけでなく、患者の体質や症状のパターンを考慮する必要があります。
34種類の漢方薬を以下のカテゴリに分類:
KAMPO_MEDICINES = {
# 風邪・発熱系
"葛根湯": {
"efficacy": ["風邪", "発熱", "頭痛", "首の痛み", "肩こり"],
"contraindications": ["虚弱体質", "胃腸虚弱"],
"symptom_patterns": ["悪寒", "発熱", "頭痛", "首の痛み"]
},
# 胃腸系
"六君子湯": {
"efficacy": ["胃腸虚弱", "食欲不振", "胃もたれ"],
"contraindications": [],
"symptom_patterns": ["胃腸虚弱", "食欲不振", "胃もたれ"]
},
# その他の漢方薬
# ... 34種類の漢方薬
}
患者の体質や症状のパターンに基づく証の判定:
def determine_sho(user_info, symptoms):
"""
証(しょう)を判定
Args:
user_info: ユーザー情報
symptoms: 症状リスト
Returns:
sho: 証(虚証、実証、中間証など)
"""
# 体質の判定
constitution = user_info.get('constitution', 'unknown')
# 症状パターンの判定
symptom_pattern = analyze_symptom_pattern(symptoms)
# 証の判定
if constitution == '虚弱' or '虚弱体質' in user_info.get('conditions', []):
return '虚証'
elif symptom_pattern == '急性':
return '実証'
else:
return '中間証'
def match_kampo_efficacy(kampo_medicine, symptoms):
"""
漢方薬の効能効果と症状のマッチング
Args:
kampo_medicine: 漢方薬の情報
symptoms: 症状リスト
Returns:
match_score: マッチスコア(0.0-1.0)
"""
efficacy_list = kampo_medicine.get('efficacy', [])
symptom_names = [s.get('name') for s in symptoms]
match_count = 0
for efficacy in efficacy_list:
if any(efficacy in symptom_name for symptom_name in symptom_names):
match_count += 1
if len(efficacy_list) > 0:
match_score = match_count / len(efficacy_list)
else:
match_score = 0.0
return match_score
def match_symptom_patterns(kampo_medicine, symptoms):
"""
症状パターンとのマッチング
Args:
kampo_medicine: 漢方薬の情報
symptoms: 症状リスト
Returns:
pattern_score: パターンスコア(0.0-1.0)
"""
required_patterns = kampo_medicine.get('symptom_patterns', [])
symptom_names = [s.get('name') for s in symptoms]
matched_patterns = 0
for pattern in required_patterns:
if any(pattern in symptom_name for symptom_name in symptom_names):
matched_patterns += 1
if len(required_patterns) > 0:
pattern_score = matched_patterns / len(required_patterns)
else:
pattern_score = 0.0
return pattern_score
def check_kampo_contraindications(kampo_medicine, user_info):
"""
漢方薬の禁忌事項をチェック
Args:
kampo_medicine: 漢方薬の情報
user_info: ユーザー情報
Returns:
is_contraindicated: 禁忌かどうか
reason: 禁忌の理由
"""
contraindications = kampo_medicine.get('contraindications', [])
for contraindication in contraindications:
# 体質のチェック
if contraindication in user_info.get('constitution', ''):
return True, f"{contraindication}のため、この漢方薬は推奨できません"
# 症状のチェック
if contraindication in user_info.get('conditions', []):
return True, f"{contraindication}のため、この漢方薬は推奨できません"
return False, None
def calculate_kampo_score(kampo_medicine, symptoms, user_info):
"""
漢方薬のスコアを計算
Args:
kampo_medicine: 漢方薬の情報
symptoms: 症状リスト
user_info: ユーザー情報
Returns:
final_score: 最終スコア
"""
# 1. 効能効果とのマッチング
efficacy_score = match_kampo_efficacy(kampo_medicine, symptoms)
# 2. 症状パターンとのマッチング
pattern_score = match_symptom_patterns(kampo_medicine, symptoms)
# 3. 証の判定
sho = determine_sho(user_info, symptoms)
sho_score = calculate_sho_score(kampo_medicine, sho)
# 4. 禁忌事項のチェック
is_contraindicated, reason = check_kampo_contraindications(
kampo_medicine, user_info
)
if is_contraindicated:
return -1.0, reason # 禁忌の場合は負のスコア
# 最終スコアの計算
final_score = (efficacy_score * 0.4 +
pattern_score * 0.4 +
sho_score * 0.2)
return final_score, None
def calculate_sho_score(kampo_medicine, sho):
"""
証に基づくスコアを計算
Args:
kampo_medicine: 漢方薬の情報
sho: 証(虚証、実証、中間証など)
Returns:
sho_score: 証スコア(0.0-1.0)
"""
# 漢方薬の適応証を取得
applicable_sho = kampo_medicine.get('applicable_sho', [])
if sho in applicable_sho:
return 1.0
elif '中間証' in applicable_sho and sho == '中間証':
return 0.8
else:
return 0.3 # 証が合わない場合は減点
漢方薬は、西洋薬とは異なる考え方に基づいており、症状だけでなく、患者の体質や症状のパターンを考慮する必要があります。
学んだこと:
漢方薬の推奨には、明確なルールが必要です。LLMだけに頼るのではなく、ルールベースのアルゴリズムを実装することで、より正確な推奨が可能になりました。
学んだこと:
漢方薬の推奨には、正確なデータが必要です。効能効果、適用症状、禁忌事項などのデータを正確に収集・整理することが重要でした。
学んだこと:
原因: 証の判定には、患者の体質や症状のパターンを正確に把握する必要がある
解決策:
原因: 漢方薬の禁忌事項が複雑で、すべてを網羅するのが難しい
解決策:
原因: 効能効果と症状のマッチングが不十分
解決策:
漢方薬推奨アルゴリズムの実装により、34種類の漢方薬に対する詳細なルールを統合しました。効能効果、適用症状、禁忌事項を考慮した推奨により、より適切な漢方薬の選択が可能になりました。
漢方薬の複雑さを理解しながらも、継続的な改善により、より正確な推奨を実現できました。
今後も、より多くの漢方薬に対応し、推奨精度の向上を続けていきます。