import gradio as gr import pandas as pd import re from collections import Counter import os from openpyxl import load_workbook from openpyxl.drawing.image import Image def process_excel(file): # 엑셀 파일 읽기 df = pd.read_excel(file.name) # D열의 데이터 추출 product_names = df.iloc[:, 3].dropna() # D열은 0부터 시작하므로 index는 3 # 키워드 추출 및 빈도 계산 all_keywords = [] for name in product_names: # 특수문자 제거 및 공백 기준으로 분할 words = re.sub(r'[^\w\s]', '', name).split() # 중복 제거 unique_words = set(words) all_keywords.extend(unique_words) # 빈도 계산 keyword_counts = Counter(all_keywords) # 결과를 데이터프레임으로 정리 result_df = pd.DataFrame(keyword_counts.items(), columns=['Keyword', 'Frequency']) result_df = result_df.sort_values(by='Frequency', ascending=False).reset_index(drop=True) # 디렉토리 생성 확인 및 파일 저장 output_dir = "output" if not os.path.exists(output_dir): os.makedirs(output_dir) output_file = os.path.join(output_dir, "keyword_counts.xlsx") # 엑셀 파일에 데이터를 A4, B4 셀부터 쓰기 with pd.ExcelWriter(output_file, engine='openpyxl') as writer: result_df.to_excel(writer, index=False, startrow=3) # startrow=3으로 설정하여 4번째 행(A4, B4)부터 시작 # 이미지를 엑셀 파일의 A1 셀에 삽입 wb = load_workbook(output_file) ws = wb.active # ssboost-logo.png 파일을 A1 셀에 삽입 img = Image("ssboost-logo.png") # 이미지 크기 설정 (1.54cm 높이, 5.69cm 너비) img.height = 1.54 * 28.3465 # 1 cm = 28.3465 포인트 img.width = 5.69 * 28.3465 # 1 cm = 28.3465 포인트 ws.add_image(img, "A1") # 수정된 엑셀 파일 저장 wb.save(output_file) return output_file # Gradio 인터페이스 정의 iface = gr.Interface( fn=process_excel, inputs=gr.File(file_types=[".xlsx"]), # 엑셀 파일만 업로드할 수 있게 설정 outputs="file", title="Excel Keyword Extractor with Image", description="엑셀 파일의 D열에서 키워드를 추출하고 빈도를 계산한 후, A1 셀에 이미지를 삽입하여 새로운 엑셀 파일로 출력합니다." ) if __name__ == "__main__": iface.launch()