Skip to main content

mecab_ko/
lib.rs

1//! # mecab-ko
2//!
3//! 한국어 형태소 분석기 - MeCab-Ko의 순수 Rust 구현
4//!
5//! ## 소개
6//!
7//! `mecab-ko`는 한국어 형태소 분석을 위한 라이브러리입니다.
8//! 은전한닢(mecab-ko)의 순수 Rust 재구현으로, 빠르고 안전한 형태소 분석을 제공합니다.
9//!
10//! ## 주요 특징
11//!
12//! - **순수 Rust**: unsafe 코드 없이 메모리 안전성 보장
13//! - **한국어 최적화**: 띄어쓰기 패널티, 한글 자모 처리
14//! - **고성능**: Zero-copy 사전, 효율적인 Viterbi 구현
15//! - **유연성**: 사용자 사전, 필터 시스템 지원
16//!
17//! ## 빠른 시작
18//!
19//! ```rust,no_run
20//! use mecab_ko::Tokenizer;
21//!
22//! let mut tokenizer = Tokenizer::new().unwrap();
23//!
24//! // 기본 형태소 분석
25//! let tokens = tokenizer.tokenize("아버지가방에들어가신다");
26//! for token in tokens {
27//!     println!("{}\t{}", token.surface, token.pos);
28//! }
29//!
30//! // 분리만 (wakati)
31//! let words = tokenizer.wakati("안녕하세요");
32//! println!("{:?}", words);  // ["안녕", "하", "세요"]
33//!
34//! // 명사만 추출
35//! let nouns = tokenizer.nouns("오늘 날씨가 좋습니다");
36//! println!("{:?}", nouns);  // ["오늘", "날씨"]
37//! ```
38//!
39//! ## 사용자 사전 추가
40//!
41//! ```rust,no_run
42//! use mecab_ko::Tokenizer;
43//! use mecab_ko::dict::UserDictionary;
44//!
45//! let mut user_dict = UserDictionary::new();
46//! user_dict.add_entry("챗GPT", "NNP", Some(-2000), None);
47//! user_dict.add_entry("딥러닝", "NNG", Some(-1500), None);
48//!
49//! let tokenizer = Tokenizer::new().unwrap()
50//!     .with_user_dict(user_dict);
51//! ```
52//!
53//! ## 성능 팁
54//!
55//! 1. **토크나이저 재사용**: `Tokenizer`는 내부에 Lattice를 재사용하므로 매번 새로 생성하지 마세요.
56//! 2. **배치 처리**: 많은 텍스트를 처리할 때는 `mecab_ko_core::BatchTokenizer`를 사용하세요.
57//! 3. **캐싱**: 반복되는 입력이 있으면 `mecab_ko_core::CachingTokenizer`를 활용하세요.
58//!
59//! ## v0.4.0 새 기능
60//!
61//! ### 세종 코퍼스 호환 출력
62//!
63//! 복합 형태소를 세종 코퍼스 표준 형식으로 분리합니다.
64//!
65//! ```rust,no_run
66//! use mecab_ko::Tokenizer;
67//! use mecab_ko::sejong::SejongConverter;
68//!
69//! let mut tokenizer = Tokenizer::new().unwrap();
70//! let tokens = tokenizer.tokenize("나는 학교에 갔다");
71//!
72//! // 세종 형식 변환
73//! let converter = SejongConverter::new();
74//! let sejong_tokens = converter.convert_tokens(&tokens);
75//!
76//! for token in sejong_tokens {
77//!     println!("{}/{}", token.surface, token.pos);
78//! }
79//! // 출력: 나/NP 는/JX 학교/NNG 에/JKB 갔다오/VV ㄴ/ETM
80//! ```
81//!
82//! ### 분해 정보 추출
83//!
84//! mecab-ko-dic의 분해 컬럼(12번째)을 활용합니다.
85//!
86//! ```rust,no_run
87//! use mecab_ko::sejong::SejongConverter;
88//!
89//! // 분해 정보 파싱
90//! let decomp = SejongConverter::parse_decomposition("가깝/VA/*+아/EC/*");
91//! // 결과: [("가깝", "VA"), ("아", "EC")]
92//! ```
93//!
94//! ## 고급 기능 (v0.3.0+)
95//!
96//! ### N-best 경로 탐색
97//!
98//! ```rust,no_run
99//! use mecab_ko::{Tokenizer, ImprovedNbestSearcher};
100//!
101//! let tokenizer = Tokenizer::new().unwrap();
102//! let nbest = ImprovedNbestSearcher::new(5); // 상위 5개 경로
103//! ```
104//!
105//! ### 분석 모드
106//!
107//! ```rust,no_run
108//! use mecab_ko::{AnalysisMode, PosFilter};
109//!
110//! // 명사만 추출
111//! let filter = PosFilter::new()
112//!     .include_prefix("NNG")
113//!     .include_prefix("NNP");
114//! ```
115//!
116//! ### 토큰화 캐싱
117//!
118//! ```rust,no_run
119//! use mecab_ko::{Tokenizer, CachingTokenizer, CacheConfig};
120//!
121//! let tokenizer = Tokenizer::new().unwrap();
122//! let cached = CachingTokenizer::new(tokenizer, CacheConfig::default());
123//! ```
124//!
125//! ### 배치/스트리밍 처리
126//!
127//! ```rust,no_run
128//! use mecab_ko::BatchTokenizer;
129//!
130//! // 병렬 배치 처리 (기본 스레드 수)
131//! let batch = BatchTokenizer::new().unwrap();
132//! ```
133//!
134//! ## 모듈 구조
135//!
136//! - [`tokenizer`]: 형태소 분석 메인 인터페이스
137//! - [`pos_tag`]: 품사 태그 정의 (세종 품사 체계)
138//! - [`hangul`]: 한글 자모 처리 유틸리티
139//! - [`dict`]: 사전 로딩 및 검색
140//!
141//! ## Feature Flags
142//!
143//! - `builder`: 사전 빌더 기능 포함
144
145#![warn(missing_docs)]
146#![deny(unsafe_code)]
147
148// Re-export core types
149pub use mecab_ko_core::{
150    pos_tag::PosTag,
151    tokenizer::{Token, Tokenizer},
152    Error, Result,
153};
154
155// Re-export v0.3.0 features
156pub use mecab_ko_core::{
157    analysis_mode::{AnalysisMode, AnalyzerConfig, PosFilter},
158    batch::{BatchTokenizer, LargeFileProcessor},
159    cache::{CacheConfig, CacheStats, CachingTokenizer, TokenCache},
160    nbest::{ImprovedNbestSearcher, NbestPath, NbestResult},
161    streaming::{StreamingTokenizer, TokenStream},
162};
163
164// Re-export hangul utilities
165pub use mecab_ko_hangul::{
166    classify_char, compose, compose_str, decompose, decompose_str, has_jongseong, is_hangul,
167    is_hangul_syllable, is_jamo, CharType,
168};
169
170// Re-export dictionary types
171pub use mecab_ko_dict::{Dictionary, Entry};
172
173/// 한글 자모 처리
174///
175/// 한글 음절의 자모 분리/결합, 종성 판별 등을 제공합니다.
176pub mod hangul {
177    pub use mecab_ko_hangul::*;
178}
179
180/// 세종 코퍼스 호환 (v0.4.0+)
181///
182/// 복합 형태소를 세종 코퍼스 표준 형식으로 변환합니다.
183pub mod sejong {
184    pub use mecab_ko_core::sejong::*;
185}
186
187/// 품사 태그 정의
188///
189/// 세종 품사 태그 체계 + mecab-ko-dic 확장 태그
190pub mod pos_tag {
191    pub use mecab_ko_core::pos_tag::*;
192}
193
194/// 형태소 분석기
195///
196/// 메인 형태소 분석 인터페이스
197pub mod tokenizer {
198    pub use mecab_ko_core::tokenizer::*;
199}
200
201/// 형태소 사전
202///
203/// 사전 로딩, 검색, 연접 비용 조회
204pub mod dict {
205    pub use mecab_ko_dict::*;
206}
207
208/// 사전 빌더 (builder feature 활성화 시)
209#[cfg(feature = "builder")]
210pub mod builder {
211    //! 사전 빌더
212    //!
213    //! CSV에서 바이너리 사전 생성
214
215    pub use mecab_ko_dict_builder::*;
216}
217
218/// 버전 정보
219pub const VERSION: &str = env!("CARGO_PKG_VERSION");
220
221#[cfg(test)]
222#[allow(clippy::similar_names, clippy::unwrap_used, clippy::const_is_empty)]
223mod tests {
224    use super::*;
225
226    #[test]
227    fn test_hangul_decompose() {
228        let (cho, jung, jong) = decompose('한').unwrap();
229        assert_eq!(cho, 'ㅎ');
230        assert_eq!(jung, 'ㅏ');
231        assert_eq!(jong, Some('ㄴ'));
232    }
233
234    #[test]
235    fn test_version() {
236        assert!(!VERSION.is_empty());
237    }
238}