논문 중복 검사 시스템 구현

프로젝트 개요

이 프로젝트는 두 텍스트 문서 간의 유사도를 평가하여 중복률을 계산하는 논문 체크 시스템을 구현한 것입니다. 입력으로 원본 문서와 변형된 복제 문서를 받고, 결과를 소수점 둘째 자리까지 정밀하게 출력합니다.

기능 요구사항

  • 명령줄 인자로 세 가지 경로를 입력받음: 원본 파일, 복제 파일, 출력 파일
  • 텍스트는 UTF-8 인코딩으로 읽기
  • 결과는 소수점 두 자리까지 반올림된 퍼센트 형식으로 저장
  • 입력 파일이 존재하지 않거나 쓰기 권한이 없을 경우 예외 처리 후 종료

핵심 알고리즘 설계

본 시스템은 다음과 같은 단계로 동작합니다:

1. 파일 읽기

def load_content(filepath):
    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            return f.read()
    except Exception as e:
        print(f"파일 읽기 실패: {e}")
        exit(1)

2. 텍스트 전처리

import re
import jieba

def clean_and_segment(text):
    # 특수 문자 제거 (알파벳, 숫자, 공백만 유지)
    cleaned = re.sub(r'[^a-zA-Z0-9\s]', '', text)
    # 한글 및 영문 분석을 위한 토큰화
    tokens = list(jieba.cut(cleaned))
    return [word.strip() for word in tokens if word.strip()]

3. 단어 빈도 벡터 생성

from collections import Counter

def create_frequency_vector(tokens):
    return Counter(tokens)

4. 코사인 유사도 계산

import math

def compute_cosine_sim(vec1, vec2):
    dot_product = sum(vec1[word] * vec2.get(word, 0) for word in vec1)
    norm1 = math.sqrt(sum(count**2 for count in vec1.values()))
    norm2 = math.sqrt(sum(count**2 for count in vec2.values()))

    if norm1 == 0 or norm2 == 0:
        return 0.0

    return dot_product / (norm1 * norm2)

5. 중복률 변환

def convert_to_repetition_rate(similarity):
    return round(similarity * 100, 2)

성능 분석

성능 측정 도구인 cProfile를 사용해 함수별 실행 시간을 분석한 결과, 주요 비용 발생 지점은 다음과 같습니다:

  • jieba.cut() 호출이 가장 많은 횟수(11,120회)로 발생하며, 누적 시간 약 1.38초
  • 내부 __cut_DAG 함수가 분할 처리의 핵심 역할을 하며, 대부분의 시간 소모
  • 모델 초기화 과정(initialize, marshal.load)에서 약 1.2초 소요

최적화 방향

  • 분석 결과를 캐시하여 반복적인 분석 작업 회피
  • 프로그램 시작 시 사전에 분석 모델 로드 (지연 부하 감소)
  • 대량 데이터 처리 시 멀티스레딩 또는 멀티프로세싱 활용

예외 처리

파일 접근 오류에 대해 적절한 예외 처리를 수행하며, 아래와 같은 상황을 고려했습니다:

  • 파일 경로가 잘못되었을 때
  • 출력 디렉토리가 존재하지 않을 때 자동 생성
  • 디스크 공간 부족이나 권한 문제 발생 시 명확한 메시지 출력 후 종료

테스트 및 커버리지

Python의 unittest를 활용해 모든 핵심 함수에 대한 단위 테스트를 수행하였으며, 코드 커버리지율은 100% 달성했습니다. 특히 코사인 유사도가 0인 경우에도 올바른 처리를 보장하였습니다.

HTML 기반의 테스트 리포트는 깃허브 저장소에서 확인 가능하며, 컴파일 및 런타임 오류 없이 정상 작동함을 확인했습니다.

태그: python jieba cosine similarity text processing unit testing

6월 4일 19:02에 게시됨