[Python] Excel 파일 간 문장 유사도 비교하기

2025. 1. 12. 18:42·개발 (Development)/Python

이번 글에서는 Python을 사용하여 두 개의 Excel 파일(A.xlsx, B.xlsx)에서 특정 컬럼(description)의 각 요소를 비교하고, 가장 유사한 값을 찾아내는 과정을 정리합니다. 유사도 기준은 60~70%로 설정하고, 결과를 Excel 파일로 저장합니다.

주요 목표

  1. Excel 파일 간 특정 컬럼의 문장 유사도 비교
  2. A의 각 문장에 대해 B에서 가장 유사한 문장을 찾아내기
  3. 유사도 결과를 새로운 Excel 파일로 저장하기

1. 필요한 라이브러리 설치

먼저 아래 라이브러리를 설치합니다.

pip install pandas openpyxl scikit-learn
  • pandas: Excel 파일을 읽고 쓰기 위해 필요합니다.
  • openpyxl: .xlsx 파일 포맷을 처리합니다.
  • scikit-learn: Jaccard 유사도 계산에 사용합니다.

추가적으로 학습된 모델을 사용하고 싶다면 sentence-transformers 라이브러리를 설치할 수 있습니다.

pip install sentence-transformers

하지만 이번 글에서는 학습된 모델 없이 단순 문자열 비교(Jaccard 유사도)를 사용합니다.


2. 코드 작성

a. 예외 처리를 포함한 안전한 split 함수

데이터가 float 형식일 경우에도 문자열로 변환하여 처리할 수 있도록 safe_split 함수를 작성합니다.

def safe_split(value, delimiter=" "):
    """
    주어진 값을 문자열로 변환한 후 split()을 수행합니다.
    :param value: split()을 적용할 값 (str, float, int 등)
    :param delimiter: split에 사용할 구분자 (기본값: 공백)
    :return: split된 값의 리스트
    """
    try:
        # 문자열로 변환 후 split
        return str(value).split(delimiter)
    except Exception as e:
        print(f"Error while splitting value: {value}, Error: {e}")
        return []

b. Jaccard 유사도 계산 함수

Jaccard 유사도는 두 집합 간의 교집합과 합집합의 비율로 계산합니다.

def jaccard_similarity(str1, str2):
    set1 = set(str(str1).split())
    set2 = set(str(str2).split())
    intersection = len(set1 & set2)
    union = len(set1 | set2)
    return intersection / union if union != 0 else 0

c. 가장 유사한 값을 찾는 함수

A의 각 항목에 대해 B 중 가장 유사한 값 하나만 반환하도록 수정한 함수입니다.

def find_most_similar(df_a, df_b, column_name, similarity_func=jaccard_similarity):
    results = []
    for index_a, desc_a in enumerate(df_a[column_name]):
        max_similarity = -1
        best_match = None

        for index_b, desc_b in enumerate(df_b[column_name]):
            similarity = similarity_func(desc_a, desc_b)

            # 가장 높은 유사도를 가진 항목 업데이트
            if similarity > max_similarity:
                max_similarity = similarity
                best_match = {
                    "A_index": index_a,
                    "B_index": index_b,
                    "A_description": desc_a,
                    "B_description": desc_b,
                    "Similarity": max_similarity
                }
        
        # 결과 저장
        if best_match:
            results.append(best_match)
    
    return results

d. 전체 코드 통합

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 1. Excel 파일 읽기
file_a = "A.xlsx"
file_b = "B.xlsx"
column_name = "description"  # 비교할 컬럼명

df_a = pd.read_excel(file_a)
df_b = pd.read_excel(file_b)

# 2. 유사도 계산 및 결과 저장
similarity_results = find_most_similar(df_a, df_b, column_name)

# 3. 결과를 DataFrame으로 변환
if similarity_results:
    result_df = pd.DataFrame(similarity_results)
    print(result_df)

    # 결과를 Excel로 저장
    output_file = "most_similar_results.xlsx"
    result_df.to_excel(output_file, index=False)
    print(f"결과가 {output_file} 파일에 저장되었습니다.")
else:
    print("유사한 항목을 찾을 수 없습니다.")

3. 실행 결과

실행 후 결과는 다음과 같은 형식으로 most_similar_results.xlsx 파일에 저장됩니다.

A_index  B_index A_description  B_description  Similarity
0 2 Example text A1 Example text B2 0.75
1 0 Another example A2 Similar example B1 0.67

결과 파일은 실행 디렉토리에 생성됩니다.


4. 마무리

이번 글에서는 Python을 사용하여 두 개의 Excel 파일 간 특정 컬럼의 문장 유사도를 비교하고, 가장 유사한 값을 찾아내는 과정을 살펴보았습니다.

이 방식은 학습된 모델을 사용하지 않고도 간단한 문자열 비교로 유사도를 계산할 수 있어 비교적 빠르게 동작합니다. 더 높은 정확도를 원한다면 sentence-transformers 같은 사전 학습된 모델을 활용할 수 있습니다.

필요에 따라 다양한 유사도 함수(Levenshtein 거리 등)를 추가하여 개선할 수 있습니다.


참고 자료

  • pandas Documentation
  • scikit-learn Documentation
  • Sentence-Transformers Documentation
반응형

'개발 (Development) > Python' 카테고리의 다른 글

[Python] pandas를 이용한 DataFrame 차집합 구하기  (0) 2025.01.19
[Python] Python을 활용한 서로 다른 데이터베이스 쿼리 결과 비교 및 엑셀 매핑  (0) 2025.01.12
[Python] 엑셀 파일 간 데이터 비교 (여러 시트일 때)  (0) 2025.01.12
[Python] 패키지 설치 SSL Error 해결  (0) 2025.01.05
[Python] 데코레이터  (0) 2024.04.17
'개발 (Development)/Python' 카테고리의 다른 글
  • [Python] pandas를 이용한 DataFrame 차집합 구하기
  • [Python] Python을 활용한 서로 다른 데이터베이스 쿼리 결과 비교 및 엑셀 매핑
  • [Python] 엑셀 파일 간 데이터 비교 (여러 시트일 때)
  • [Python] 패키지 설치 SSL Error 해결
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (234) N
      • 개발 (Development) (167) N
        • Algorithm (1)
        • Angular (1)
        • AWS (7) N
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (32) N
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (12) N
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Kubernetes
    MyBatis
    리눅스 마스터 2급
    백준알고리즘
    Linux master
    deepseek
    AWS
    JPA
    javascript
    docker
    DevOps
    JSON
    백준
    Linux
    ADsP
    리눅스 마스터 2급 2차
    springboot
    파이썬
    timescaledb
    오답노트
    PostgreSQL
    pandas
    java
    자바
    백준온라인저지
    Vue.js
    Kafka
    데이터분석
    python
    백준자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Python] Excel 파일 간 문장 유사도 비교하기
상단으로

티스토리툴바