Skip to content

gph05010/Medication-Info-Text-Classification

Repository files navigation

Medication Info Text Classification

복약정보 탐색을 위한 의약품 설명서 문장 분류 프로젝트입니다.

공공데이터포털의 의약품 설명서 데이터를 활용해 복약 안내 문장을 효능, 복용법, 주의사항, 상호작용, 부작용, 보관법 등 정보 유형별로 분류했습니다.

TF-IDF 기반 베이스라인 모델과 KLUE-RoBERTa 기반 한국어 문장 분류 모델을 비교하며, 실제 복약정보 탐색 서비스에 적용할 때 고려해야 할 데이터셋 구성 방식과 라벨 경계 문제를 분석했습니다.


프로젝트 개요

모델 목적

의약품 설명서 텍스트를 항목별로 분류해 사용자가 필요한 복약정보를 빠르게 확인할 수 있도록 지원하는 것을 목표로 했습니다.

의약품 설명서에는 효능, 복용법, 주의사항, 상호작용, 부작용, 보관법 등 다양한 정보가 섞여 있습니다. 사용자가 긴 설명문을 직접 읽고 필요한 항목을 구분하지 않아도, 문장 단위로 복약정보 유형을 자동 분류할 수 있는지 확인했습니다.

분류 라벨

본 프로젝트에서 사용한 분류 라벨은 다음과 같습니다.

  • 효능
  • 복용법
  • 주의사항
  • 상호작용
  • 부작용
  • 보관법

서비스 시나리오

사용자가 의약품 설명서나 약 봉투를 촬영하면 OCR을 통해 텍스트를 추출하고, 추출된 문장을 항목별로 분류하는 상황을 가정했습니다.

다만 본 프로젝트에서는 실제 OCR 데이터가 아닌 공공데이터 텍스트를 기반으로 모델을 학습하고 평가했습니다.


참여 범위

본 저장소는 팀 프로젝트 중 제가 참여한 데이터 분석 및 문장 분류 모델 실험 과정을 중심으로 정리한 저장소입니다.

주요 참여 범위는 다음과 같습니다.

  • 공공데이터포털 의약품개요정보 Open API 기반 데이터 수집
  • 의약품 설명서 주요 컬럼 구조 확인
  • 효능, 복용법, 주의사항, 상호작용, 부작용, 보관법 기준의 라벨 구조 정리
  • 경고성 주의사항 컬럼을 일반 주의사항에 통합
  • 값이 있는 텍스트만 추출해 text, label 형태의 학습 데이터로 변환
  • 공백, 줄바꿈, 붙어 있는 문장 등을 정리하는 텍스트 전처리 수행
  • 동일한 text-label 조합 중복 제거
  • 문장 기준 데이터셋과 컬럼 기준 데이터셋 구성 및 비교
  • TF-IDF 기반 베이스라인 모델 구축 및 성능 비교
  • Logistic Regression, LinearSVM, Multinomial Naive Bayes 모델 비교
  • KLUE-RoBERTa 기반 한국어 문장 분류 모델 적용 및 성능 개선 확인
  • Accuracy, Macro F1, Weighted F1, Confusion Matrix 기반 평가
  • 혼동행렬과 오분류 사례를 바탕으로 라벨 경계 문제 분석
  • 분석 결과 및 한계, 개선 방향 문서화

데이터 출처 및 주요 필드

본 프로젝트는 공공데이터포털의 식품의약품안전처 의약품개요정보 데이터를 활용했습니다.

Open API를 통해 JSON 응답을 수집하고, 페이지 단위 반복 호출을 통해 전체 데이터를 확보한 뒤 CSV 파일로 저장했습니다.

원본 데이터와 가공 데이터 파일은 저장소에 포함하지 않았으며, 저장소에는 데이터 수집, 전처리, 모델 실험 과정을 확인할 수 있는 노트북만 업로드했습니다.

원본 컬럼 의미 분류 라벨
itemSeq 의약품 품목 기준 코드 식별용
itemName 의약품명 식별용
efcyQesitm 효능·효과 설명 효능
useMethodQesitm 사용법·복용법 설명 복용법
atpnWarnQesitm 경고성 주의사항 주의사항에 통합
atpnQesitm 일반 주의사항 주의사항
intrcQesitm 상호작용 정보 상호작용
seQesitm 부작용 정보 부작용
depositMethodQesitm 보관 방법 보관법

데이터 분석 및 인사이트

데이터 구조를 확인하면서 다음과 같은 특징을 확인했습니다.

  • 설명 컬럼별 결측치 비율에 차이가 있음
  • 경고성 주의사항은 일반 주의사항과 의미가 유사해 통합 필요
  • 동일하거나 유사한 안내 문구가 여러 의약품에서 반복됨
  • 라벨별 데이터 수 차이가 존재함
  • 효능, 복용법, 주의사항 등 항목별로 표현 패턴이 다르지만, 일부 문장은 여러 라벨에서 유사하게 나타남

이러한 특징 때문에 단순히 원본 컬럼을 그대로 사용하는 것보다, 결측치 처리, 컬럼 통합, 중복 제거, 문장 기준 분리 등 전처리 기준이 중요했습니다.


데이터 전처리 과정

1. 컬럼 통합

경고성 주의사항(atpnWarnQesitm)은 결측치가 많고, 의미상 일반 주의사항(atpnQesitm)과 유사한 항목이 많아 주의사항 라벨로 통합했습니다.

이를 통해 라벨 구조를 단순화하고, 실제 사용자가 구분하기 어려운 유사 정보를 하나의 유형으로 정리했습니다.

2. text-label 구조 변환

원본 설명서 컬럼을 모델 학습에 사용할 수 있도록 다음 구조로 변환했습니다.

text label
복약 안내 문장 또는 문단 효능 / 복용법 / 주의사항 / 상호작용 / 부작용 / 보관법

값이 있는 텍스트만 추출했으며, 결측 텍스트는 임의로 채우지 않고 제외했습니다.

3. 텍스트 정제

복약 안내 문장을 모델 학습에 사용할 수 있도록 정제했습니다.

  • 앞뒤 공백 제거
  • 줄바꿈 형식 통일
  • 과도한 공백 및 줄바꿈 정리
  • 붙어 있는 문장 분리 보정
  • 불필요한 공백 제거
  • 너무 짧은 텍스트 제거
  • 동일한 text-label 조합 중복 제거

4. 데이터셋 생성

실제 사용 상황에 가까운 평가 기준을 찾기 위해 두 가지 데이터셋을 구성했습니다.

문장 기준 데이터셋

설명서 텍스트를 문장 단위로 분리한 데이터셋입니다.

실제 사용자가 OCR로 추출한 텍스트를 문장별로 분류하는 상황에 더 가깝습니다. 다만 문장 단위로 분리하면서 앞뒤 문맥 정보가 사라질 수 있어 라벨 경계가 모호해지는 한계가 있습니다.

컬럼 기준 데이터셋

원본 항목 컬럼 단위의 전체 문맥을 하나의 입력으로 사용하는 데이터셋입니다.

이미 항목별로 분리된 텍스트이기 때문에 라벨 단서가 충분하고, 성능이 매우 높게 나올 수 있습니다. 따라서 최종 해석은 실제 사용 상황에 더 가까운 문장 기준 데이터셋 결과를 중심으로 진행했습니다.


모델 실험

1. 베이스라인 모델 선정

먼저 TF-IDF 기반 전통 NLP 모델로 기본 분류 성능을 확인했습니다.

실험한 주요 조합은 다음과 같습니다.

벡터화 방식 분류 모델
TF-IDF Logistic Regression
TF-IDF LinearSVM
TF-IDF Multinomial Naive Bayes
CountVectorizer Logistic Regression

베이스라인 모델은 구현이 단순하고 학습 속도가 빠르기 때문에, 데이터셋 기준에 따른 기본 성능과 오분류 양상을 확인하는 기준으로 활용했습니다.

2. 베이스라인 모델 성능

문장 기준 데이터셋에서 TF-IDF + LinearSVM 조합이 베이스라인 중 가장 좋은 성능을 보였습니다.

모델 Accuracy Macro F1 Weighted F1
TF-IDF + LinearSVM 0.970 0.949 0.970

의약품 설명문은 라벨별 반복 표현이 뚜렷해 TF-IDF 기반 모델만으로도 높은 분류 성능을 보였습니다.

다만 높은 성능에도 불구하고, 혼동행렬을 확인했을 때 특정 라벨 간 오분류가 반복적으로 나타났습니다.

3. KLUE-RoBERTa 기반 모델

문장 내부의 의미와 문맥 정보를 더 잘 반영하기 위해 KLUE-RoBERTa 기반 한국어 문장 분류 모델을 적용했습니다.

KLUE-RoBERTa는 Transformer 기반 한국어 사전학습 언어모델로, 단어 빈도 중심의 TF-IDF 방식보다 문장 내 표현과 문맥을 더 잘 반영할 수 있을 것으로 기대했습니다.

6개 라벨 분류 태스크로 파인튜닝했으며, 베이스라인 최고 모델인 TF-IDF + LinearSVM과 문장 기준 데이터셋에서 성능을 비교했습니다.

4. KLUE-RoBERTa 개선 결과

문장 기준 데이터셋에서 KLUE-RoBERTa는 베이스라인 최고 모델보다 높은 성능을 보였습니다.

모델 Accuracy Macro F1 Weighted F1
TF-IDF + LinearSVM 0.9700 0.9493 0.9699
KLUE-RoBERTa 0.9788 0.9759 0.9788

특히 Macro F1이 개선되면서, 라벨별 데이터 수 차이를 고려했을 때도 성능 향상이 있음을 확인했습니다.

최종 대표 결과는 실제 사용 상황에 가까운 문장 기준 데이터셋과 KLUE-RoBERTa 모델 조합으로 정리했습니다.


평가 및 오분류 분석

평가 지표

모델 평가는 단순 정확도만 보지 않고, 라벨별 성능 차이와 오분류 양상을 함께 확인하기 위해 다음 지표를 활용했습니다.

  • Accuracy
  • Macro F1
  • Weighted F1
  • Classification Report
  • Confusion Matrix

주요 오분류 패턴

최종 모델에서도 일부 라벨 간 오분류가 남았습니다.

대표적인 오분류 패턴은 다음과 같습니다.

  • 복용법 ↔ 주의사항
  • 부작용 ↔ 주의사항
  • 상호작용 ↔ 주의사항
  • 특히 주의사항 → 복용법 혼동이 상대적으로 많이 나타남

오류 원인 해석

오분류 사례를 확인한 결과, 금지·주의 표현이 여러 라벨에서 공통적으로 등장하는 것이 주요 원인으로 보였습니다.

예를 들어 다음과 같은 표현은 특정 라벨에만 한정되지 않고 여러 정보 유형에서 반복될 수 있습니다.

  • 복용하지 마십시오
  • 주의하십시오
  • 상의하십시오
  • 투여하지 마십시오
  • 증상이 좋아지지 않으면 의사와 상의하십시오

이처럼 하나의 문장 안에 복용법, 주의사항, 부작용, 상호작용 의미가 함께 들어가는 경우가 있어, 단일 라벨 분류만으로는 라벨 경계를 명확히 나누기 어려운 사례가 존재했습니다.


핵심 결과

본 프로젝트의 핵심 결과는 다음과 같습니다.

  1. 의약품 설명문은 라벨별 반복 표현이 뚜렷해 TF-IDF 기반 베이스라인 모델만으로도 높은 분류 성능을 보였습니다.

  2. 베이스라인 모델 중에서는 TF-IDF + LinearSVM 조합이 가장 좋은 성능을 보였습니다.

  3. 문장 기준 데이터셋에서 KLUE-RoBERTa를 적용한 결과, 베이스라인 최고 모델보다 성능이 개선되었습니다.

  4. 컬럼 기준 데이터셋은 이미 항목별로 분리된 텍스트이기 때문에 성능이 매우 높게 나타났지만, 실제 사용 상황과는 차이가 있어 참고 실험으로 해석했습니다.

  5. 최종 평가는 실제 OCR 입력 상황에 더 가까운 문장 기준 데이터셋 결과를 중심으로 해석했습니다.

  6. 혼동행렬과 오분류 사례를 통해 주의사항, 복용법, 부작용, 상호작용 등 일부 라벨 간 경계가 모호하다는 점을 확인했습니다.


파일 구성

Medication-Info-Text-Classification/
├── 01_데이터_불러오기.ipynb
├── 02_인사이트_도출_및_전처리.ipynb
├── 03_베이스라인_모델_문장_기준_분리.ipynb
├── 03_베이스라인_모델_컬럼_기준_분리.ipynb
└── README.md

Notebook 설명

파일명 내용
01_데이터_불러오기.ipynb 공공데이터 API 요청, 페이지 단위 데이터 수집, 수집 결과 확인
02_인사이트_도출_및_전처리.ipynb 컬럼 구조 확인, 결측치 확인, 주의사항 통합, 텍스트 정제, 문장/컬럼 기준 데이터셋 생성
03_베이스라인_모델_문장_기준_분리.ipynb 문장 기준 데이터셋을 활용한 TF-IDF 기반 베이스라인 모델 학습 및 오분류 분석
03_베이스라인_모델_컬럼_기준_분리.ipynb 컬럼 기준 데이터셋을 활용한 베이스라인 모델 학습 및 문장 기준 결과와 비교

사용 기술

구분 사용 기술
Language Python
Environment Google Colab, Jupyter Notebook
Data Collection requests
Data Processing pandas, NumPy, re
Machine Learning scikit-learn
Text Vectorization TF-IDF, CountVectorizer
Baseline Models Logistic Regression, LinearSVM, Multinomial Naive Bayes
Transformer Model KLUE-RoBERTa
Evaluation Accuracy, Macro F1, Weighted F1, Confusion Matrix

저장소 공개 범위

현재 이 저장소에는 데이터 수집, 전처리, TF-IDF 기반 베이스라인 모델 실험 과정을 중심으로 정리한 노트북을 업로드했습니다.

팀 프로젝트 전체 서비스 코드와 일부 실험 파일은 포함되어 있지 않을 수 있습니다. KLUE-RoBERTa 기반 모델 실험 결과는 프로젝트 과정에서 수행한 내용을 README에 함께 정리했습니다.


데이터 공개 범위

본 저장소에는 원본 데이터와 가공 데이터 파일을 포함하지 않았습니다.

데이터 파일을 제외한 이유는 다음과 같습니다.

  • 원본 데이터 파일의 용량 및 관리 문제
  • API 기반으로 수집 가능한 데이터라는 점
  • 저장소에는 코드와 분석 흐름을 중심으로 남기는 것이 적절하다고 판단
  • 불필요한 원본 데이터 업로드를 방지하기 위함

한계 및 개선 방향

한계

  • 실제 OCR 데이터가 아닌 공공데이터 텍스트 기반으로 학습했습니다.
  • 실제 촬영 이미지에서 OCR을 수행하면 글자 인식 오류가 발생할 수 있습니다.
  • 문장 단위로 분리하면서 앞뒤 문맥 정보가 사라질 수 있습니다.
  • 하나의 문장이 여러 라벨 의미를 동시에 가질 수 있습니다.
  • 단일 라벨 분류 방식만으로는 복합적인 복약 안내 문장을 충분히 표현하기 어려울 수 있습니다.
  • 주의사항, 복용법, 부작용, 상호작용처럼 표현이 유사한 라벨 간 오분류가 발생할 수 있습니다.

개선 방향

  • 실제 OCR 데이터 추가 수집 및 검증
  • 앞뒤 문장 또는 문단 단위 입력 실험
  • 복수 라벨 분류 방식 검토
  • 오분류가 많은 라벨의 기준 재정의
  • 주의사항, 복용법, 부작용, 상호작용 등 유사 라벨의 추가 데이터 보완
  • 사용자 질문 유형에 맞는 복약정보 섹션 우선 제공 방식 검토

정리

본 프로젝트에서는 의약품 설명서 문장을 효능, 복용법, 주의사항, 상호작용, 부작용, 보관법 등 복약정보 유형별로 자동 분류하는 모델을 실험했습니다.

TF-IDF 기반 베이스라인 모델로 기본 분류 성능을 확인하고, KLUE-RoBERTa 기반 모델을 적용해 문장 기준 데이터셋에서 성능 개선을 확인했습니다.

또한 컬럼 기준 데이터셋과 문장 기준 데이터셋을 함께 비교하며, 실제 사용 상황에서는 문장 기준 평가가 더 적합하다고 판단했습니다.

마지막으로 혼동행렬과 오분류 사례 분석을 통해, 복약정보 문장 분류에서는 단순 성능 수치뿐 아니라 라벨 경계와 문맥 손실 문제를 함께 고려해야 한다는 점을 확인했습니다.

About

공공데이터 기반 의약품 설명서 문장 분류 및 복약정보 유형 분석 프로젝트

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors