다국어 UI인데 정작 중국어·일본어는 분석 못 하는 N-그램 분석기 — 정규식 언어 편향
N-그램 분석기는 화면 자체가 한국어·영어·중국어·일본어 4개 언어로 번역되어 있습니다. 언어 버튼을 눌러 中文이나 日本語로 바꿔도 메뉴와 안내 문구는 멀쩡하게 그 언어로 표시됩니다. 그런데 정작 그 화면에 중국어나 일본어 문장을 붙여넣고 분석을 돌리면, 결과에는 한자도 가나도 하나도 남지 않습니다. UI가 다국어라는 것과 텍스트 처리 로직이 다국어라는 것은 완전히 다른 층위의 이야기라는 걸 보여주는 실제 사례입니다.
1. "다국어 지원"이라는 말의 두 가지 뜻
웹 도구에서 "다국어 지원"은 보통 두 가지를 뭉뚱그려 가리킵니다. 하나는 버튼·라벨·안내문 같은 인터페이스 문자열을 번역하는 것이고, 다른 하나는 사용자가 입력하는 실제 데이터(텍스트)를 그 언어의 문법과 문자 체계에 맞게 처리하는 것입니다. 앞의 것은 _i18n 객체에 언어별 문자열 사전을 채워 넣기만 하면 끝나지만, 뒤의 것은 정규식·토큰화 규칙·문자 범위 하나하나가 그 언어를 실제로 고려해서 짜여 있어야 합니다. 이 두 층위가 항상 같이 가는 게 아니라는 점이 이번 사례의 핵심입니다.
2. 정규식을 직접 뜯어본 결과
N-그램 분석기의 "구두점 제거" 옵션은 기본값이 켜짐(체크)이며, 코드에서 text.replace(/[^\w\s가-힣]/g, ' ') 형태로 적용됩니다. 이 정규식을 문자 그대로 읽으면 "영문자·숫자·언더스코어(\w), 공백(\s), 그리고 한글 완성형 음절 범위(가-힣)가 아닌 모든 문자를 공백으로 바꿔라"입니다. 즉 허용 목록에 명시적으로 들어간 문자군은 라틴 알파벳과 한글 두 가지뿐이고, 중국어 한자(CJK 통합 한자 영역)나 일본어 히라가나·가타카나는 이 목록 어디에도 없습니다. 허용되지 않은 문자는 예외 처리 없이 그냥 공백으로 치환되므로, 한자·가나로만 이루어진 단어는 토큰화 이전 단계에서 이미 흔적도 없이 사라집니다.
3. 실제로 넣어보면 벌어지는 일
다음은 한중일 세 언어가 섞인 문장을 기본 설정(구두점 제거 켜짐)으로 분석했을 때의 결과입니다.
| 입력 원문 | 정규식 통과 후 남는 텍스트 |
|---|---|
| 这是一个测试。日本語のテストです。한국어 테스트입니다. | 한국어 테스트입니다 |
4. 왜 한글만 예외로 들어갔을까
자바스크립트 정규식의 \w는 유니코드 전체가 아니라 ASCII 범위(a-z, A-Z, 0-9, _)만 의미합니다. 애초에 이 도구가 한국 서비스로 시작해 한국어 콘텐츠 분석을 1순위 요구사항으로 짰기 때문에, 개발 단계에서 "한글이 지워지는 문제"만 발견해 가-힣 범위를 명시적으로 추가한 것으로 보입니다. 그 뒤 UI를 중국어·일본어로도 번역하면서 인터페이스 층위는 확장됐지만, 정규식이라는 처리 로직 층위는 그 확장을 따라가지 못한 채 남아있는 상태입니다. 즉 "한글은 되는데 한자·가나는 안 되는" 비대칭은 실수라기보다, 한 언어를 기준으로 짠 정규식을 다른 언어로 그대로 재사용할 때 생기는 전형적인 구멍입니다.
5. 구두점 제거를 끄면 해결될까
"구두점 제거" 체크박스를 끄면 이 정규식 자체가 적용되지 않으므로 한자·가나가 살아남긴 합니다. 다만 그 대가로 마침표·쉼표·물음표 같은 진짜 문장부호까지 토큰 안에 그대로 남아 N-그램 결과에 섞여 들어갑니다. 예를 들어 "테스트。" 같은 토큰이 "테스트"와 별개의 항목으로 집계되어 빈도 통계가 흐려질 수 있습니다. 또한 이 상태에서 원문에 큰따옴표가 포함돼 있으면, CSV 내보내기 코드가 필드 내부의 큰따옴표를 이스케이프하지 않기 때문에 내보낸 CSV의 열 구조가 깨지는 별개의 버그도 함께 마주칠 수 있습니다. 결국 지금 버전에서 중국어·일본어 텍스트를 다루려면 옵션을 끄는 것 외에는 우회로가 없고, 그마저도 완전한 해결책은 아닙니다.
6. 실무에서 언어 편향을 피하는 법
텍스트 전처리 정규식을 직접 짤 일이 있다면, 특정 문자 범위를 하나씩 나열하는 대신 유니코드 스크립트 속성(\p{Script=Han}, \p{Script=Hiragana}, \p{Script=Katakana} 등, u 플래그 필요)을 쓰는 편이 안전합니다. 다만 이 도구처럼 이미 배포된 정규식을 직접 고칠 수 없는 입장이라면, 분석하려는 언어에 맞춰 옵션을 조정하고 결과를 눈으로 한 번 검산하는 습관이 현실적인 대안입니다. 키워드 빈도만 필요하다면 단어 빈도 카운터나 키워드 추출기가 더 단순한 로직으로 비슷한 결과를 줄 수 있고, 불용어 제거까지 함께 쓴다면 불용어 제거기도 참고할 만합니다. 다만 이 도구들도 내부 로직이 언어별로 다르게 짜여 있을 수 있으므로, 다국어 텍스트를 다룰 때는 항상 실제 결과를 눈으로 검산하는 것이 가장 확실합니다.
자주 묻는 질문
Q. N-그램 분석기가 중국어·일본어를 아예 지원하지 않는다는 뜻인가요?
UI 번역은 지원하지만 기본 옵션 상태의 텍스트 처리 로직은 지원하지 않습니다. "구두점 제거"를 끄면 문자 자체는 살아남지만 문장부호가 섞여 들어가는 부작용이 있어, 완전한 지원이라고 보기는 어렵습니다.
Q. 왜 오류 메시지 없이 조용히 텍스트가 사라지나요?
정규식 치환은 매칭되지 않는 문자를 공백으로 바꿀 뿐 예외를 던지지 않기 때문입니다. 프로그램 입장에서는 정상 동작이라 별도 경고를 띄울 이유가 없고, 그래서 사용자가 결과가 빈 이유를 스스로 알아차리기 어렵습니다.
Q. 영어나 유럽어 텍스트는 문제없이 처리되나요?
기본 ASCII 알파벳(a-z, A-Z)은 \w에 포함되어 정상 처리됩니다. 다만 é, ü, ñ 같은 악센트 부호가 붙은 라틴 문자는 \w 범위 밖이라 마찬가지로 공백으로 치환되어 사라집니다.
Q. 비슷한 언어 편향이 다른 텍스트 도구에도 있을 수 있나요?
네, 있을 수 있습니다. 특정 문자 범위를 하드코딩한 정규식은 그 범위 밖의 언어에서 같은 유형의 문제가 재현될 가능성이 있으므로, 다국어 텍스트를 다룰 도구를 고를 때는 실제로 그 언어를 넣어 결과를 확인해보는 것이 안전합니다.