한국어 형태소 분석기 활용 사례

브라우저에서 동작하는 한국어 형태소 분석기 가루(Garu)의 활용 사례 모음. 한국어 풀텍스트 검색 인덱싱, 명사·키워드 추출, 텍스트 마이닝, 챗봇 전처리, 오프라인 PWA·브라우저 확장 등 실전 시나리오를 짧은 코드 예제와 함께 정리합니다.

명사·키워드 추출과 태그 클라우드

블로그, 뉴스, 리뷰 텍스트에서 일반명사(NNG)·고유명사(NNP)만 골라내면 자동 태깅, 관련 글 추천, 워드 클라우드 데이터를 손쉽게 만들 수 있습니다. 외래어(SL) 포함 옵션도 켤 수 있습니다.

const { tokens } = garu.analyze(article);

const nouns = tokens
  .filter((t) => t.pos === 'NNG' || t.pos === 'NNP')
  .map((t) => t.text);

const counts = nouns.reduce<Record<string, number>>((acc, w) => {
  acc[w] = (acc[w] ?? 0) + 1;
  return acc;
}, {});

텍스트 마이닝 · 감성 분석 전처리

한국어 감성 분석, 토픽 모델링, 분류기 학습 전 단계에서 형태소 단위 토큰화가 필수입니다. 가루는 세종 42종 품사 태그를 그대로 제공하므로 동사(VV)·형용사(VA)·부사(MAG)만 골라 감성 자질로 쓰는 식의 파이프라인을 브라우저에서 그대로 돌릴 수 있습니다.

function sentimentFeatures(text: string) {
  const { tokens } = garu.analyze(text);
  return tokens
    .filter((t) => ['VV', 'VA', 'MAG'].includes(t.pos))
    .map((t) => `${t.text}/${t.pos}`);
}

챗봇 · 검색 UI 입력 전처리

사용자 입력을 형태소 단위로 정규화하면 동의어/이형태(예: "아파요"·"아픕니다"·"아프다") 매칭이 훨씬 쉬워집니다. 가루는 1MB 모델이라 챗봇 위젯 번들에 함께 실어도 부담이 적습니다.

function normalizeIntent(utterance: string) {
  const lemma = garu
    .analyze(utterance)
    .tokens
    .filter((t) => t.pos.startsWith('V') || t.pos.startsWith('N'))
    .map((t) => t.text);
  return lemma.join(' ');
}

오프라인 PWA · 브라우저 확장

서비스 워커로 모델·WASM을 캐시해 두면 네트워크 없이도 한국어 분석이 가능합니다. 인트라넷, 의료/금융 같이 외부 전송이 제한된 환경, 브라우저 확장 프로그램, Electron 데스크톱 앱에서 그대로 동작합니다.

// service-worker.ts
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('garu-v1').then((cache) =>
      cache.addAll(['/garu/base.gmdl', '/garu/garu_wasm_bg.wasm'])
    )
  );
});

시작하기

npm에서 가루(garu-ko)를 설치하면 위 시나리오를 모두 같은 한 줄 API로 사용할 수 있습니다.

npm install garu-ko