사용자 사전

사용자 사전은 기본 사전에 없는 단어를 추가하여 형태소 분석 품질을 향상시키는 기능입니다. 신조어, 전문 용어, 고유명사 등을 등록할 수 있습니다.

사전 파일 형식

CSV 포맷

사용자 사전은 CSV(Comma-Separated Values) 형식을 사용합니다.

# 주석 라인 (# 으로 시작)
# 표면형,품사,비용,읽기
딥러닝,NNG,-1000,딥러닝
머신러닝,NNG,-1000,머신러닝
챗GPT,NNP,-1000,챗지피티
앤트로픽,NNP,-1000,앤트로픽

필드 설명

필드필수설명예시
표면형O등록할 단어딥러닝
품사O품사 태그NNG, NNP, VV
비용X선택 우선도 (낮을수록 우선)-1000
읽기X발음 정보딥러닝

비용(Cost) 이해하기

비용은 형태소 분석 시 해당 단어의 선택 우선도를 결정합니다:

  • 음수 값: 우선 선택 (추천: -1000 ~ -500)
  • 0: 기본 비용
  • 양수 값: 후순위 선택
# 높은 우선순위 (신조어, 전문 용어)
딥러닝,NNG,-1000,
GPT,NNP,-1000,

# 보통 우선순위
인공지능,NNG,-500,

# 낮은 우선순위 (거의 사용되지 않는 단어)
오래된단어,NNG,100,

품사 태그

사용자 사전에서 자주 사용하는 품사 태그:

태그의미예시
NNG일반 명사딥러닝, 인공지능
NNP고유 명사앤트로픽, 오픈AI
NNB의존 명사것, 수, 등
VV동사분석하다, 처리하다
VA형용사빠르다, 좋다
MAG일반 부사매우, 아주
SL외국어API, GPU
SH한자韓國, 人工
SN숫자123, 456

전체 품사 태그 목록은 품사 태그 장을 참조하세요.

CLI에서 사용

기본 사용

mecab-ko --user-dic user.csv "딥러닝 기술이 발전하고 있습니다"

조용히 실행

사전 로드 메시지 숨기기:

mecab-ko -q --user-dic user.csv "테스트"

여러 사전 파일

현재는 하나의 사용자 사전만 지정 가능합니다. 여러 사전을 사용하려면 파일을 합치세요:

cat dict1.csv dict2.csv > combined.csv
mecab-ko --user-dic combined.csv "테스트"

라이브러리에서 사용

기본 사용법

use mecab_ko_dict::UserDictionary;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut dict = UserDictionary::new();

    // Add entries programmatically
    dict.add_entry("딥러닝", "NNG", Some(-1000), None);
    dict.add_entry("머신러닝", "NNG", Some(-1000), Some("머신러닝".to_string()));

    // Or load from file
    dict.load_from_csv("user.csv")?;

    println!("Loaded {} entries", dict.len());
    Ok(())
}

빌더 패턴

#![allow(unused)]
fn main() {
use mecab_ko_dict::UserDictionaryBuilder;

let dict = UserDictionaryBuilder::new()
    .default_cost(-500)              // Set default cost
    .add("딥러닝", "NNG")            // Uses default cost
    .add_with_cost("GPT", "NNP", -1000)
    .add_full("챗GPT", "NNP", -1000, Some("챗지피티"))
    .load_csv("extra.csv")?         // Load additional entries
    .build();
}

엔트리 조회

#![allow(unused)]
fn main() {
let entries = dict.lookup("딥러닝");
for entry in entries {
    println!("Surface: {}", entry.surface);
    println!("POS: {}", entry.pos);
    println!("Cost: {}", entry.cost);
    if let Some(reading) = &entry.reading {
        println!("Reading: {}", reading);
    }
}
}

문자열에서 로드

#![allow(unused)]
fn main() {
let csv_content = r#"
IT 용어 사전
딥러닝,NNG,-1000,
머신러닝,NNG,-1000,
자연어처리,NNG,-1000,자연어처리
"#;

dict.load_from_str(csv_content)?;
}

컨텍스트 ID 지정

고급 사용자를 위해 좌/우 문맥 ID를 직접 지정할 수 있습니다:

#![allow(unused)]
fn main() {
dict.add_entry_with_ids(
    "특수단어",
    "NNG",
    -1000,    // cost
    1234,     // left_id
    5678,     // right_id
    None,     // reading
);
}

사전 저장

#![allow(unused)]
fn main() {
dict.save_to_csv("output.csv")?;
}

도메인별 사전 예시

IT/기술 용어

# IT 기술 용어 사전
딥러닝,NNG,-1000,딥러닝
머신러닝,NNG,-1000,머신러닝
인공지능,NNG,-1000,인공지능
자연어처리,NNG,-1000,자연어처리
GPT,NNP,-1000,지피티
API,SL,-1000,에이피아이
클라우드,NNG,-1000,클라우드
쿠버네티스,NNP,-1000,쿠버네티스
도커,NNP,-1000,도커

브랜드/회사명

# 회사 및 브랜드명
앤트로픽,NNP,-1000,앤트로픽
오픈AI,NNP,-1000,오픈에이아이
구글,NNP,-1000,구글
마이크로소프트,NNP,-1000,마이크로소프트
메타,NNP,-1000,메타
테슬라,NNP,-1000,테슬라

신조어/인터넷 용어

# 신조어 및 인터넷 용어
갓생,NNG,-1000,갓생
소확행,NNG,-1000,소확행
워라밸,NNG,-1000,워라밸
MZ세대,NNG,-1000,엠지세대
플렉스,NNG,-1000,플렉스
TMI,NNG,-1000,티엠아이

사전 작성 팁

1. 적절한 비용 설정

# 일반적인 경우: -1000
신조어,NNG,-1000,

# 자주 사용되는 경우: -1500
아주자주쓰는단어,NNG,-1500,

# 덜 중요한 경우: -500
덜중요한단어,NNG,-500,

2. 같은 표면형, 다른 품사

하나의 단어가 여러 품사로 사용될 수 있습니다:

# '분석'은 명사와 동사 어간 모두 가능
분석,NNG,-1000,

3. 복합어 등록

띄어쓰기 없는 복합어를 하나의 단어로 등록:

자연어처리,NNG,-1000,자연어처리
인공지능,NNG,-1000,인공지능

4. 외래어 표기 변형

다양한 표기를 모두 등록:

# 같은 단어의 다른 표기
쿠버네티스,NNP,-1000,
쿠버네테스,NNP,-1000,
kubernetes,SL,-1000,

5. 읽기 정보 활용

발음이 표기와 다른 경우 읽기 정보 제공:

GPT,NNP,-1000,지피티
API,SL,-1000,에이피아이
CEO,SL,-1000,씨이오

검증 및 테스트

사전 로드 테스트

#![allow(unused)]
fn main() {
use mecab_ko_dict::UserDictionary;

fn test_dictionary() -> Result<(), Box<dyn std::error::Error>> {
    let mut dict = UserDictionary::new();
    dict.load_from_csv("user.csv")?;

    // Verify entry count
    println!("Total entries: {}", dict.len());

    // Test specific lookup
    let entries = dict.lookup("딥러닝");
    assert!(!entries.is_empty(), "Entry 'Deep Learning' not found");

    Ok(())
}
}

분석 결과 비교

# Without user dictionary
echo "딥러닝 기술" | mecab-ko

# With user dictionary
echo "딥러닝 기술" | mecab-ko --user-dic user.csv

문제 해결

엔트리가 적용되지 않음

  1. 비용이 너무 높은지 확인 (음수 값 사용)
  2. 품사 태그가 올바른지 확인
  3. CSV 형식이 정확한지 확인 (콤마 구분)

파싱 오류

Error: Invalid user dictionary format at line 5

해당 라인의 형식 확인:

  • 최소 2개 필드 (표면형, 품사) 필요
  • 빈 필드 허용 (예: 단어,NNG,,)
  • 콤마가 포함된 값은 큰따옴표로 감싸기

인코딩 문제

사전 파일은 UTF-8 인코딩을 사용해야 합니다:

# Check encoding
file user.csv

# Convert from EUC-KR to UTF-8
iconv -f EUC-KR -t UTF-8 user_euckr.csv > user.csv