프로젝트 개요
이 프로젝트는 두 텍스트 문서 간의 유사도를 평가하여 중복률을 계산하는 논문 체크 시스템을 구현한 것입니다. 입력으로 원본 문서와 변형된 복제 문서를 받고, 결과를 소수점 둘째 자리까지 정밀하게 출력합니다.
기능 요구사항
- 명령줄 인자로 세 가지 경로를 입력받음: 원본 파일, 복제 파일, 출력 파일
- 텍스트는 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 기반의 테스트 리포트는 깃허브 저장소에서 확인 가능하며, 컴파일 및 런타임 오류 없이 정상 작동함을 확인했습니다.