코드 언어 자동 식별: 통계 기반 머신러닝 접근

코드 언어 자동 식별: 통계 기반 머신러닝 접근
안내: 본 포스트의 한글 요약 및 분석 리포트는 AI 기술을 통해 자동 생성되었습니다. 정보의 정확성을 위해 하단의 [원본 논문 뷰어] 또는 ArXiv 원문을 반드시 참조하시기 바랍니다.

초록

본 논문은 웹에 흩어져 있는 식별되지 않은 소스 코드를 자동으로 프로그래밍 언어를 판별하기 위해, GitHub에서 수집한 41 000여 파일(324 MB)을 학습 데이터로 활용한 지도학습 모델을 제안한다. 주된 특징은 주석·문자열을 제외한 뒤, 괄호 종류, 첫 단어, 키워드, 행 끝 문자, 연산자, 구두점 비율 등 7가지 통계적 특성을 정량화하여 각 언어별 점수를 계산하는 것이다. 실험 결과, 25개 언어 중 48 %를 1위로 정확히 맞추었으며, 기존 베이지안 기반 도구인 SourceClassifier보다 현저히 우수했다. 문법 기반 접근도 시도했지만 구현 난이도와 정확도 문제로 현재는 포기하고 향후 연구 과제로 남겼다.

상세 분석

이 연구는 프로그래밍 언어 식별이라는 실용적 문제에 통계적 특성 추출과 지도학습을 결합한 점이 가장 큰 강점이다. 먼저 학습 데이터는 GitHub 크롤러를 통해 자동 수집했으며, 파일 확장자와 태그를 교차 검증해 노이즈를 최소화하였다. 이렇게 확보한 41 000여 파일은 24개 언어(액션스크립트, Ada, Brainfuck 등)를 골고루 포함하고 있어, 언어 간 차이를 학습하기에 충분한 다양성을 제공한다.

주석·문자열 처리 단계는 ‘words property’를 이용해 알파벳 전용 단어가 연속된 라인을 후보로 선정하고, 가장 긴 캡처를 선택하는 간단하면서도 효과적인 휴리스틱을 적용한다. 이는 주석·문자열 내부에 자연어가 섞여 있을 경우 통계적 특성에 오염을 방지한다는 점에서 중요하다.

통계적 특성은 총 7가지로 구분된다.

  1. Brackets – 괄호 종류별 비율을 통해 C계열과 Lisp계열을 구분한다.
  2. FirstWord – 각 라인의 첫 토큰을 분석해 ‘public’, ‘int’ 등 언어 고유의 선언 패턴을 포착한다.
  3. Keywords – 순수 알파벳 단어만을 추출해 언어별 키워드 빈도를 비교한다.
  4. LastCharacter – 행 끝 문자를 활용해 Prolog(‘.’)나 Java(‘;’)와 같은 특성을 감지한다.
  5. Operators – 연산자 집합을 추출해 ‘=>’, ‘::=’ 등 특수 연산자를 식별한다.
  6. Punctuation – 구두점 대비 문자 비율을 계산해 esoteric 언어(Brainfuck, Chef) 구분에 활용한다.
  7. Comments and Strings – 앞서 검출한 주석·문자열 토큰이 기존 언어 데이터와 일치하는지를 점수화한다.

각 특성별 점수는 제시된 수식(s_l)으로 정규화되며, 모든 특성의 점수를 합산해 최종 언어 후보 순위를 산출한다. 특히 Brackets와 Punctuation은 1‑X(p_i,l−x_i)^2 형태의 제곱 오차를 사용해 차이를 강조함으로써, 희소한 토큰이지만 언어 구분에 중요한 역할을 하는 경우에도 민감하게 반응한다.

성능 평가에서는 25개의 무작위 파일에 대해 1위 정확도가 48 %였으며, 2~4위까지 포함하면 84 %에 도달한다. 이는 25개 언어 중 무작위 선택(4 %)에 비해 현저히 높은 수치이며, 동일 데이터셋으로 학습한 SourceClassifier(1위 12 %)보다 4배 이상 우수함을 보여준다. 다만 1위 정확도가 아직 절반 수준에 머물러, 실시간 코드 하이라이팅이나 검색 엔진에 바로 적용하기엔 추가 개선이 필요하다.

문법 기반 접근은 OMeta를 활용해 PEG(Parsing Expression Grammar) 형태의 규칙을 자동 생성하려 했지만, 문법 조각의 스코어링 및 조합 방법이 복잡하고, 언어마다 문법 구조가 크게 달라 일반화가 어려웠다. 따라서 현재는 통계적 방법을 주축으로 두고, 향후 문법 특성을 보완적으로 통합하는 방향을 제시한다.

전체적으로 이 논문은 기존 베이지안·Bag‑of‑Words 방식의 한계를 뛰어넘는, 다중 통계 특성을 활용한 실용적인 언어 식별 프레임워크를 제시한다. 향후 데이터셋 확대, 딥러닝 기반 특징 학습, 그리고 문법‑통계 하이브리드 모델 도입을 통해 정확도를 크게 향상시킬 여지가 있다.


댓글 및 학술 토론

Loading comments...

의견 남기기