Skip to content

약물 추출 예제 🏥

LangExtract는 임상 텍스트에서 구조화된 의료 정보를 추출하는 데 탁월하며, 의료 애플리케이션에 특히 유용합니다.

WARNING

면책 조항: 이 데모는 LangExtract의 기본 기능을 설명하기 위한 것입니다. 완성되거나 승인된 제품을 나타내지 않으며, 질병이나 상태의 진단 또는 치료를 제안하기 위한 것이 아니며, 의료 조언으로 사용해서는 안 됩니다.

기본 개체명 인식 (NER)

이 기본 의료 예제에서 LangExtract는 구조화된 약물 정보를 추출합니다:

python
import langextract as lx

# 약물이 포함된 텍스트
input_text = "환자가 이부프로펜 400mg을 경구로 4시간마다 이틀간 복용했습니다."

# 추출 프롬프트 정의
prompt_description = "텍스트에 나타나는 순서대로 약물명, 용량, 투여 경로, 빈도, 기간을 포함한 약물 정보를 추출하세요."

# 출현 순서대로 예제 데이터 정의
examples = [
    lx.data.ExampleData(
        text="환자에게 세파졸린 250mg을 정맥 주사로 하루 3회, 일주일간 투여했습니다.",
        extractions=[
            lx.data.Extraction(extraction_class="dosage", extraction_text="250mg"),
            lx.data.Extraction(extraction_class="route", extraction_text="정맥 주사"),
            lx.data.Extraction(extraction_class="medication", extraction_text="세파졸린"),
            lx.data.Extraction(extraction_class="frequency", extraction_text="하루 3회"),
            lx.data.Extraction(extraction_class="duration", extraction_text="일주일간")
        ]
    )
]

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt_description,
    examples=examples,
    model_id="gemini-2.5-pro",
)

# 위치와 함께 엔티티 표시
print(f"입력: {input_text}\n")
print("추출된 엔티티:")
for entity in result.extractions:
    position_info = ""
    if entity.char_interval:
        start, end = entity.char_interval.start_pos, entity.char_interval.end_pos
        position_info = f" (위치: {start}-{end})"
    print(f"• {entity.extraction_class}: {entity.extraction_text}{position_info}")

# 결과 저장 및 시각화
lx.io.save_annotated_documents([result], output_name="medical_ner_extraction.jsonl", output_dir=".")

# 인터랙티브 시각화 생성
html_content = lx.visualize("medical_ner_extraction.jsonl")
with open("medical_ner_visualization.html", "w") as f:
    if hasattr(html_content, 'data'):
        f.write(html_content.data)
    else:
        f.write(html_content)

print("인터랙티브 시각화가 medical_ner_visualization.html에 저장되었습니다")

관계 추출 (RE)

엔티티 간의 관계를 포함하는 더 복잡한 추출의 경우, LangExtract는 약물과 관련 속성을 추출할 수 있습니다:

python
import langextract as lx

# 여러 약물이 포함된 텍스트
input_text = """
환자는 지난달 리시노프릴과 메트포르민을 처방받았습니다.
그는 고혈압을 위해 리시노프릴 10mg을 매일 복용하지만,
당뇨병을 위해 하루 두 번 복용해야 하는 메트포르민 500mg을 자주 놓칩니다.
"""

# 추출 프롬프트 정의
prompt_description = """
속성을 사용하여 관련 정보를 그룹화하고 약물과 세부 정보를 추출:

1. 텍스트에 나타나는 순서대로 엔티티 추출
2. 각 엔티티는 해당 약물에 연결하는 'medication_group' 속성이 있어야 함
3. 약물에 대한 모든 세부 정보는 동일한 medication_group 값을 공유
"""

examples = [
    lx.data.ExampleData(
        text="환자는 심장 건강을 위해 아스피린 100mg을 매일, 취침 시 심바스타틴 20mg을 복용합니다.",
        extractions=[
            lx.data.Extraction(
                extraction_class="medication",
                extraction_text="아스피린",
                attributes={"medication_group": "아스피린"}
            ),
            lx.data.Extraction(
                extraction_class="dosage",
                extraction_text="100mg",
                attributes={"medication_group": "아스피린"}
            ),
            lx.data.Extraction(
                extraction_class="frequency",
                extraction_text="매일",
                attributes={"medication_group": "아스피린"}
            ),
            lx.data.Extraction(
                extraction_class="medication",
                extraction_text="심바스타틴",
                attributes={"medication_group": "심바스타틴"}
            ),
            lx.data.Extraction(
                extraction_class="dosage",
                extraction_text="20mg",
                attributes={"medication_group": "심바스타틴"}
            ),
            lx.data.Extraction(
                extraction_class="frequency",
                extraction_text="취침 시",
                attributes={"medication_group": "심바스타틴"}
            )
        ]
    )
]

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt_description,
    examples=examples,
    model_id="gemini-2.5-pro",
)

# 약물별로 그룹화하여 표시
print("추출된 약물:")
medication_groups = {}
for extraction in result.extractions:
    if extraction.attributes and "medication_group" in extraction.attributes:
        group_name = extraction.attributes["medication_group"]
        medication_groups.setdefault(group_name, []).append(extraction)

for med_name, extractions in medication_groups.items():
    print(f"\n* {med_name}")
    for extraction in extractions:
        print(f"  • {extraction.extraction_class}: {extraction.extraction_text}")

주요 기능

  • 개체명 인식: 타입이 있는 엔티티 추출 (약물, 용량, 경로 등)
  • 관계 추출: 속성을 사용하여 관련 엔티티 그룹화
  • 위치 추적: 소스 텍스트에서 추출된 엔티티의 정확한 위치 기록
  • 구조화된 출력: 의료 애플리케이션에 적합한 형식으로 정보 구성
  • 인터랙티브 시각화: 복잡한 의료 추출을 탐색하기 위한 HTML 시각화 생성

비공식 가이드. Google과 관련 없음.