콘텐츠로 이동

다국어에서 한국어 추출

다국어 환경에서 한국어 문장만 추출·분석하기

글로벌 서비스의 로그·리뷰·고객 문의에는 여러 언어가 섞여 있습니다. 한국어 분석 파이프라인에 영어·중국어·일본어 문장이 그대로 들어오면 결과가 오염됩니다. 바른은 한국어(ko_KR) 전용 분석기이며, 형태소 태그를 활용해 외국어 토큰을 걸러낼 수 있습니다.

문제 상황

  • 다국어가 섞인 텍스트에서 한국어 문장만 골라 분석하고 싶습니다.
  • 한 문장 안에 영어 단어가 섞여 있을 때(코드 스위칭) 외국어 부분을 구분해야 합니다.
  • 한국어가 아닌 문장에 형태소 분석을 돌리면 무의미한 결과가 나옵니다.

바른을 어떻게 적용하나

바른은 외국어를 SL(외국어) 태그로 분류합니다(각 태그의 의미는 품사 태그표 참고). 문장을 형태소 분석한 뒤 SL·SH(한자) 비중을 보면 한국어 문장인지, 외국어가 섞였는지 판별할 수 있습니다. 바른이 지원하는 분석 언어는 ko_KR 하나입니다. 형태소 단위만 빠르게 끊고 싶다면 토큰화와 형태소 분석의 차이도 참고하세요.

graph TD
  MIX[다국어 텍스트] --> SPLIT[문장 분할];
  SPLIT --> TAG[바른 형태소 분석];
  TAG --> RATIO[외국어 SL 비중 계산];
  RATIO -->|한국어 위주| KO[한국어 분석 결과];
  RATIO -->|외국어 위주| SKIP[제외 또는 다른 파이프라인];
from bareunpy import Tagger

tagger = Tagger("koba-XXXX-...", "localhost")

def is_korean(text: str, threshold=0.5) -> bool:
    """한국어 형태소 비중으로 한국어 문장인지 판별합니다."""
    res = tagger.tags([text])
    pos = res.pos()
    if not pos:
        return False
    # SL(외국어)·SH(한자)·SN(숫자)·기호를 제외한 비율
    non_ko = sum(1 for _, t in pos if t in ("SL", "SH", "SN", "SW"))
    return (len(pos) - non_ko) / len(pos) >= threshold

print(is_korean("오늘 회의는 3시에 시작합니다."))
print(is_korean("Please join the meeting at 3."))
True
False

한국어 문장만 골라 후속 분석에 넘길 수 있습니다.

결과와 이점

입력 외국어 토큰 비중 판정
오늘 회의는 3시에 시작합니다. 낮음 한국어
Please join the meeting at 3. 높음(SL 위주) 외국어

SL 태그란

SL은 외국어(주로 로마자) 토큰에 붙는 품사 태그입니다. 한자는 SH, 숫자는 SN으로 따로 분류되어, 텍스트 구성 비중을 세분해 판단할 수 있습니다.

자주 묻는 질문

Q. 한국어 안에 섞인 영어 단어는 어떻게 처리되나요?

API, OK 같은 영어 단어는 SL 태그로 분류됩니다. 문장 전체가 한국어면 SL 토큰만 따로 모아 영어 용어 목록으로 활용할 수 있습니다.

Q. 바른이 영어·일본어도 분석하나요?

아니요. 바른의 분석 언어는 ko_KR 하나입니다. 다른 언어는 해당 언어 전용 분석기로 보내고, 바른은 한국어 문장에만 적용하세요.

Q. 문장 단위로 언어를 가르려면요?

먼저 문장 단위로 나눈 뒤 각 문장의 외국어 토큰 비중을 계산해 한국어 문장만 추립니다. 임계값은 데이터 특성에 맞게 조정하세요. 대량 문장을 한 번에 처리할 때는 여러 문장 한 번에 분석하기를 참고하세요.

Q. 다국어 로그·리뷰에서 한국어만 분석하는 파이프라인을 어떻게 짜나요?

여러 언어가 섞인 텍스트를 문장 단위로 나눈 뒤 각 문장을 바른 형태소 분석에 넘기고, SL(외국어)·SH(한자) 등 비한국어 토큰의 비중을 계산합니다. 비중이 임계값보다 낮으면 한국어 문장으로 보고 후속 분석에 넘기고, 높으면 제외하거나 해당 언어 전용 분석기로 보냅니다. 바른의 분석 언어는 ko_KR 하나입니다.

관련 문서

도움이 되었나요?