mecab-ko-dict 0.6.0

한국어 형태소 사전 관리 - 바이너리 포맷, FST 검색, 연접 비용
Documentation
# Dictionary Module Implementation Summary

## 개요

RST-003 이슈를 보완하여 실제 사전을 로드하는 통합 Dictionary 구조체를 구현했습니다.

## 구현 완료 항목

### 1. 핵심 구조체

#### SystemDictionary (`src/dictionary.rs`)
- Trie + Matrix + Features를 통합한 시스템 사전
- 메모리 맵 기반 효율적 로딩
- 사용자 사전과의 통합 지원
- 공통 접두사 검색 기능

**주요 메서드:**
- `load_default()`: 기본 경로에서 사전 로드
- `load(dicdir)`: 특정 경로에서 사전 로드
- `lookup(surface)`: 형태소 검색 (Dictionary trait)
- `lookup_combined(surface)`: 시스템 + 사용자 사전 통합 검색
- `common_prefix_search(text)`: 공통 접두사 검색
- `get_connection_cost(left_id, right_id)`: 연접 비용 조회

#### DictEntry
- 사전 엔트리 내부 표현
- Entry와 상호 변환 가능
- 메모리 효율적 설계

#### DictionaryLoader
- 사전 경로 탐색 로직
- 환경변수 `MECAB_DICDIR` 지원
- 기본 경로 자동 탐색
- 사전 유효성 검증

### 2. 사전 경로 탐색

환경변수 우선 순위:
1. `MECAB_DICDIR` 환경변수
2. `/usr/local/lib/mecab/dic/mecab-ko-dic`
3. `/usr/lib/mecab/dic/mecab-ko-dic`
4. `/opt/mecab/dic/mecab-ko-dic`
5. `./dic/mecab-ko-dic`

### 3. 파일 포맷 지원

**Trie:**
- `sys.dic`: 비압축 Trie
- `sys.dic.zst`: 압축 Trie (zstd)

**Matrix:**
- `matrix.bin`: 바이너리 행렬
- `matrix.def`: 텍스트 행렬
- `matrix.bin.zst`: 압축 바이너리 행렬

### 4. 통합 기능

- SystemDictionary + UserDictionary 통합
- `lookup_combined()`: 양쪽 사전 동시 검색
- Arc 기반 스레드 안전 사용자 사전 공유

## 테스트

### 단위 테스트 (15개)
- `test_dict_entry_creation`
- `test_dict_entry_to_entry`
- `test_dict_entry_from_entry`
- `test_system_dictionary_lookup`
- `test_system_dictionary_get_connection_cost`
- `test_common_prefix_search`
- `test_common_prefix_search_at`
- `test_with_user_dictionary`
- `test_lookup_combined_system_and_user`
- `test_get_entry`
- `test_dicdir`
- `test_trie_reference`
- `test_matrix_reference`
- `test_entries_reference`
- `test_dictionary_loader_find_dicdir`

### 통합 테스트 (9개)
- `test_system_dictionary_integration`
- `test_user_dictionary_integration`
- `test_user_dictionary_builder`
- `test_user_dictionary_from_csv`
- `test_dict_entry_conversion`
- `test_dictionary_loader_find_dicdir`
- `test_common_prefix_search_korean`
- `test_multi_pos_entries`
- `test_dictionary_trait_implementation`

**총 테스트: 60개 (51 unit + 9 integration)**
**테스트 결과: 100% 통과**

## 예제

### dictionary_usage.rs
사전 사용법을 보여주는 실행 가능한 예제:
1. 시스템 사전 로드
2. 사용자 사전 생성
3. 엔트리 검색
4. 공통 접두사 검색
5. CSV 파일에서 로드

실행:
```bash
cargo run -p mecab-ko-dict --example dictionary_usage
```

## 문서

### README.md
- API 사용법
- 설치 방법
- 예제 코드
- 성능 정보

### rustdoc
모든 public API에 대한 상세한 문서 포함:
- 모듈 레벨 문서
- 구조체 및 메서드 문서
- 예제 코드 (ignore로 표시)

## API 설계 원칙

### 1. 타입 안전성
- Entry와 DictEntry 명확히 구분
- u32 인덱스를 EntryIndex로 래핑 (trie 모듈)
- Result 타입 일관성 있게 사용

### 2. 메모리 효율성
- Arc를 통한 사용자 사전 공유
- 메모리 맵 기반 Trie 로딩
- 소유권 명확한 API (`&`, `&mut`, 소유)

### 3. 에러 처리
- 모든 I/O 에러 전파
- `unwrap()`/`expect()` 사용 금지 (라이브러리 코드)
- 명확한 에러 메시지

### 4. 확장성
- Dictionary trait로 다양한 구현 가능
- SystemDictionary 확장 가능
- Feature 파일 지원 준비 (FEATURE_FILE 상수)

## 파일 구조

```
crates/mecab-ko-dict/
├── src/
│   ├── lib.rs               # 메인 라이브러리
│   ├── dictionary.rs        # ✨ 새로 추가: SystemDictionary
│   ├── trie.rs              # Trie 구현
│   ├── matrix.rs            # Matrix 구현
│   └── user_dict.rs         # UserDictionary 구현
├── tests/
│   └── integration_test.rs  # ✨ 새로 추가: 통합 테스트
├── examples/
│   └── dictionary_usage.rs  # ✨ 새로 추가: 사용 예제
├── README.md                # ✨ 새로 추가: 문서
└── IMPLEMENTATION.md        # ✨ 이 문서
```

## 향후 작업

### 1. Feature 파일 지원
- `feature.txt` 파싱 구현
- DictEntry에 feature 인덱싱 추가

### 2. 성능 최적화
- Trie 검색 벤치마크
- 메모리 사용량 프로파일링

### 3. 사전 빌더
- mecab-ko-dict-builder와 통합
- CSV에서 바이너리 사전 생성

### 4. 고급 검색
- 정규표현식 검색
- 퍼지 매칭

## 코딩 규칙 준수

✅ `unsafe` 최소화 (memmap2만 사용, 주석으로 안전성 설명)
✅ `unwrap()`, `expect()` 라이브러리 코드에서 금지
✅ 모든 public API에 rustdoc 작성
✅ 모든 테스트 통과
✅ cargo fmt 적용
✅ Dictionary trait 구현

## 성능 특성

- **Trie 검색**: O(m) where m = 키 길이
- **연접 비용 조회**: O(1)
- **메모리**: 사전 크기 + 사용자 사전 크기
- **로딩 시간**: mmap 사용으로 지연 로딩

## 의존성

- `yada`: Double-Array Trie
- `memmap2`: 메모리 맵 (unsafe 코드 포함)
- `zstd`: 압축 지원
- `thiserror`: 에러 타입 정의

## 결론

RST-003 이슈의 Dictionary 통합 구조체를 성공적으로 구현했습니다.
- 60개 테스트 모두 통과
- 실제 사용 가능한 API 제공
- 확장 가능한 아키텍처
- 완전한 문서화