이번 글에서는 Python을 사용하여 두 개의 Excel 파일(A.xlsx, B.xlsx)에서 특정 컬럼(description)의 각 요소를 비교하고, 가장 유사한 값을 찾아내는 과정을 정리합니다. 유사도 기준은 60~70%로 설정하고, 결과를 Excel 파일로 저장합니다.
주요 목표
- Excel 파일 간 특정 컬럼의 문장 유사도 비교
- A의 각 문장에 대해 B에서 가장 유사한 문장을 찾아내기
- 유사도 결과를 새로운 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 거리 등)를 추가하여 개선할 수 있습니다.
참고 자료
'개발 (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 |