Lexicon 기반 약지도 학습을 통한 한국어 Aspect Term Extraction
absa_experiment/
├── data/
│ ├── raw/ # 원본 JSON 데이터
│ ├── lex/ # Aspect lexicons
│ │ ├── aspect_lexicon.json # 추출된 aspect lexicon (58,537개 표현)
│ │ ├── lexicon_stats.json # Lexicon 통계
│ │ └── forbid.txt # 제외할 단어 리스트
│ ├── F_final/ # F policy 데이터셋 (권장)
│ └── LF_final/ # LF policy 데이터셋
├── models/ # 학습된 모델 저장
├── scripts/ # 실행 스크립트
│ ├── 1_extract_lexicon.sh # Step 1: Lexicon 추출
│ ├── 2_prepare_dataset.sh # Step 2: 데이터셋 생성
│ ├── 3_train_model.sh # Step 3: 모델 학습
│ ├── run_full_pipeline.sh # 전체 파이프라인 실행
│ ├── extract_improved_lexicons.py # Lexicon 추출 Python 스크립트
│ ├── prepare_dataset.py # 데이터셋 생성 (F policy)
│ ├── prepare_lf_dataset.py # 데이터셋 생성 (LF policy)
│ ├── train_token_classifier.py # 모델 학습 스크립트
│ └── archived/ # 사용하지 않는 구 버전 스크립트
└── src/ # 유틸리티 모듈
├── align.py # Span alignment 함수
└── utils.py # 기타 유틸리티
# Python 가상환경 생성 (권장)
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 필요한 패키지 설치
pip install -r requirements.txt# F Policy (권장) - Lexicon 기반으로 정확한 aspect term만 추출
./scripts/run_full_pipeline.sh fallback
# 또는 LF Policy - L(Loose) + F(Fallback) 병합
./scripts/run_full_pipeline.sh loose_fallback각 단계를 개별적으로 실행할 수도 있습니다:
# Step 1: Lexicon 추출
./scripts/1_extract_lexicon.sh
# Step 2: 데이터셋 생성 (F Policy)
./scripts/2_prepare_dataset.sh fallback data/F_final
# Step 3: 모델 학습
./scripts/3_train_model.sh data/F_final models/bert_f_final- 방식: Lexicon에 있는 단어만 aspect term으로 레이블링
- 장점:
- Precision 높음 (정확한 aspect term만 레이블링)
- 노이즈 적음
- F1 score 높을 것으로 예상
- Coverage: ~67% (20,641 mentions 중 13,949 매칭)
- 사용 시나리오: 정확도가 중요한 경우
- 방식: L policy (SentimentText 매칭) + F policy (Lexicon) 병합
- 장점:
- Coverage 매우 높음 (116%)
- F policy 기여도 85.72%로 품질 개선됨
- 단점:
- L policy의 긴 span 레이블링이 일부 포함 (노이즈)
- Precision이 F policy보다 낮을 수 있음
- 사용 시나리오: Coverage가 중요한 경우
scripts/run_full_pipeline.sh- 전체 파이프라인 한 번에 실행scripts/1_extract_lexicon.sh- Lexicon 추출scripts/2_prepare_dataset.sh- 데이터셋 생성scripts/3_train_model.sh- 모델 학습
scripts/extract_improved_lexicons.py- Lexicon 자동 추출scripts/prepare_dataset.py- F policy 데이터셋 생성scripts/prepare_lf_dataset.py- LF policy 데이터셋 생성scripts/train_token_classifier.py- 모델 학습
# 생성된 데이터셋 통계
cat data/F_final/stats_train.json
# 출력 예시:
# {
# "mentions": 20641,
# "matched": 13949,
# "matched%": 67.58,
# "fallback_used%": 100.0
# }# Lexicon 파일 보기
cat data/lex/aspect_lexicon.json | python3 -m json.tool | head -50
# 통계 확인
cat data/lex/lexicon_stats.json# 학습된 모델 디렉토리
ls -la models/bert_f_final/
# 평가 결과 (학습 후 생성됨)
cat models/bert_f_final/eval_results.jsonscripts/1_extract_lexicon.sh 파일 내 파라미터 수정:
MIN_FREQ: 최소 출현 빈도 (기본값: 2)MIN_LENGTH: 최소 표현 길이 (기본값: 2)MAX_LENGTH: 최대 표현 길이 (기본값: 15)
scripts/3_train_model.sh 파일 내 파라미터 수정:
NUM_EPOCHS: 학습 에포크 (기본값: 3)BATCH_SIZE: 배치 크기 (기본값: 16)LEARNING_RATE: 학습률 (기본값: 2e-5)
# Step 1 다시 실행
./scripts/1_extract_lexicon.sh# Lexicon 파일 확인
ls -la data/lex/aspect_lexicon.json
# 수동으로 데이터셋 생성
./scripts/2_prepare_dataset.sh fallback data/F_final# 스크립트 실행 권한 부여
chmod +x scripts/*.sh모든 스크립트는 GPU가 없어도 CPU로 자동 실행됩니다 (속도는 느림).
| 지표 | 기존 (105개) | 확장 (58,537개) | 개선 |
|---|---|---|---|
| F Coverage | 46.92% | 67.58% | +20.66%p |
| LF From F | 51.25% | 85.72% | +34.47%p |
- F Policy: Precision ↑ → F1 score 향상 예상
- LF Policy: F 기여도 ↑ → L 노이즈 희석, 품질 개선
DATASET_ANALYSIS.md: LF F1 score 문제 분석LEXICON_EXPANSION_RESULTS.md: Lexicon 확장 효과 비교LEXICON_EXPANSION_SUMMARY.md: 전체 작업 요약