Intro
소프트웨어 개발에서 언어 감지(Language Detection)는 사용자 입력의 언어를 파악하거나, 다국어 텍스트를 처리할 때 자주 마주치는 문제입니다.
어떤 라이브러리를 사용해야 할지 고민해 보신 적이 있으실 겁니다.
pemistahl/lingua는 이러한 고민을 해결해 줄 강력하고 정확한 JVM 기반 언어 감지 라이브러리입니다.
pemistahl/lingua이란 무엇인가?
pemistahl/lingua는 Apache 2.0 라이선스하에 개발된 오픈 소스 언어 감지 라이브러리입니다.
주로 코틀린(Kotlin)으로 작성되었으며, Java, Scala, Groovy 등 JVM 언어 환경에서 뛰어난 성능을 발휘합니다.
- pemistahl/lingua-rs: Rust 구현 버전
- pemistahl/lingua-go: Go 구현 버전
- pemistahl/lingua-py: Python 구현 버전
100개가 넘는 언어를 지원하며, 높은 정확성과 빠른 처리 속도를 자랑합니다.
pemistahl/lingua을 왜 사용하는가?
- 높은 정확성
- pemistahl/lingua는 통계적 모델과 n-그램(n-gram) 분석을 기반으로 매우 높은 정확도를 보여줍니다.
- 짧은 텍스트에서도 신뢰할 수 있는 결과를 제공하며, 다른 라이브러리보다 뛰어난 성능을 자랑합니다.
- 빠른 속도
- JVM 기반 라이브러리임에도 불구하고 효율적인 구현으로 빠른 처리 속도를 제공합니다.
- 대량의 텍스트를 처리해야 하는 애플리케이션에 적합합니다.
- 다양한 언어 지원
- 100개 이상의 언어를 지원하여 전 세계 다양한 언어 환경에 대응할 수 있습니다.
- 쉬운 사용법
- 코틀린 친화적인 직관적인 API를 제공하여 JVM 개발자가 쉽게 통합하고 사용할 수 있습니다.
- 강력한 기능
- 단순히 언어를 감지하는 것을 넘어, 신뢰도 점수(confidence score)를 제공하고, 특정 언어를 필터링하거나 선호하는 언어를 지정하는 등 유연한 기능을 제공합니다.
pemistahl/lingu 동작 방식
pemistahl/lingua의 핵심은 n-그램 빈도(n-gram frequency)를 기반으로 한 통계적 모델에 있습니다. 라이브러리는 각 지원 언어에 대한 방대한 텍스트 코퍼스(corpus)로부터 1-그램(단일 문자)부터 5-그램(5개 문자)까지의 빈도 분포를 학습합니다. 이 학습된 데이터는 각 언어의 fingerprint 역할을 합니다.
언어 감지 과정은 다음과 같이 진행됩니다.
- 입력 텍스트 정규화
- 입력된 텍스트에서 불필요한 문자(예: 숫자, 특수 기호)를 제거하고 소문자로 변환하는 등의 전처리 과정을 거칩니다.
- n-그램 추출
- 정규화된 텍스트에서 1-그램부터 5-그램까지의 n-그램을 추출합니다.
- 예를 들어, “hello”라는 텍스트에서 2-그램은 “he”, “el”, “ll”, “lo”가 됩니다.
- 확률 계산 (베이즈 정리 기반)
- 추출된 각 n-그램
g
에 대해, 각 후보 언어 L
에서 해당 n-그램이 나타날 조건부 확률 P(g∣L)
을 미리 학습된 모델에서 가져옵니다.
- 이때, 베이즈 정리(Bayes’ Theorem)와 유사한 방식으로 각 언어의 사후 확률(posterior probability)을 계산합니다.
- 확률 집계 및 언어 결정
- 모든 n-그램에 대한 확률을 합산하여 각 후보 언어에 대한 “점수”를 계산합니다.
- 가장 높은 점수를 받은 언어가 감지된 언어로 결정됩니다.
- 이때, 각 언어에 대한 점수를 기반으로 신뢰도 점수(confidence score)도 함께 제공됩니다.
- 예를 들어, 점수 분포의 표준편차나 최대 점수와 다음 점수 간의 차이를 이용하여 신뢰도를 추정할 수 있습니다.
- 예측 불가능한 경우 처리
- 모든 n-그램에 대한 점수가 특정 임계값 미만이거나, 여러 언어의 점수 차이가 미미하여 명확한 판단이 어려운 경우
Language.UNKNOWN
을 반환하여 잘못된 예측을 최소화합니다.
참고
- https://github.com/pemistahl/lingua