File size: 3,625 Bytes
da3ce18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import gradio as gr
import pandas as pd
import re
from io import BytesIO

def process_excel(file_bytes):
    """
    μ—…λ‘œλ“œλœ μ—‘μ…€ νŒŒμΌμ—μ„œ D4μ…€λΆ€ν„° Dμ—΄μ˜ μƒν’ˆλͺ…을 μΆ”μΆœν•˜μ—¬,
    각 μ…€μ—μ„œ 특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
    ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜κ³ , 전체 셀에 λŒ€ν•΄
    ν‚€μ›Œλ“œμ˜ λΉˆλ„λ₯Ό κ³„μ‚°ν•˜μ—¬ μ—‘μ…€ 파일둜 μ €μž₯ν•©λ‹ˆλ‹€.
    """
    try:
        # μ—…λ‘œλ“œλœ νŒŒμΌμ„ μ½μ–΄μ˜΅λ‹ˆλ‹€. 헀더가 μ—†λŠ” μƒνƒœλ‘œ 전체 데이터λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
        df = pd.read_excel(BytesIO(file_bytes), header=None, engine="openpyxl")
    except Exception as e:
        return "μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)

    # μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯Έμ§€ 확인 (μ΅œμ†Œ 4μ—΄, μ΅œμ†Œ 4ν–‰)
    if df.shape[1] < 4 or df.shape[0] < 4:
        return "μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."

    # Dμ—΄(4번째 μ—΄, 인덱슀 3)μ—μ„œ 4ν–‰(인덱슀 3)λΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
    product_names_series = df.iloc[3:, 3]
    product_names_series = product_names_series.dropna()

    keyword_counts = {}
    for cell in product_names_series:
        # λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 경우 λ¬Έμžμ—΄λ‘œ λ³€ν™˜
        if not isinstance(cell, str):
            cell = str(cell)
        # 특수문자 제거 (숫자, 영문, ν•œκΈ€, 곡백을 μ œμ™Έν•œ λͺ¨λ“  문자 제거)
        cleaned = re.sub(r'[^0-9a-zA-Zκ°€-힣\s]', '', cell)
        # 곡백 κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ ν‚€μ›Œλ“œ μΆ”μΆœ
        keywords = cleaned.split()
        # ν•˜λ‚˜μ˜ μ…€μ—μ„œλŠ” 쀑볡 ν‚€μ›Œλ“œλ₯Ό 제거
        unique_keywords = set(keywords)
        for keyword in unique_keywords:
            keyword_counts[keyword] = keyword_counts.get(keyword, 0) + 1

    # ν‚€μ›Œλ“œλ₯Ό λΉˆλ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ (λΉˆλ„κ°€ κ°™μœΌλ©΄ ν‚€μ›Œλ“œ μ˜€λ¦„μ°¨μˆœ)
    sorted_keywords = sorted(keyword_counts.items(), key=lambda x: (-x[1], x[0]))

    # κ²°κ³Όλ₯Ό DataFrame으둜 생성 (A1μ…€: ν‚€μ›Œλ“œ, B1μ…€: λΉˆλ„)
    result_df = pd.DataFrame(sorted_keywords, columns=["ν‚€μ›Œλ“œ", "λΉˆλ„"])

    # μ—‘μ…€ 파일둜 κ²°κ³Όλ₯Ό 좜λ ₯ (A1, B1 셀에 헀더 μΆ”κ°€)
    output = BytesIO()
    try:
        with pd.ExcelWriter(output, engine="openpyxl") as writer:
            # 헀더 없이 A2μ…€λΆ€ν„° 데이터 μ €μž₯
            result_df.to_excel(writer, index=False, startrow=1, header=False)
            worksheet = writer.sheets["Sheet1"]
            # A1μ…€κ³Ό B1셀에 헀더 μž‘μ„±
            worksheet.cell(row=1, column=1, value="ν‚€μ›Œλ“œ")
            worksheet.cell(row=1, column=2, value="λΉˆλ„")
        output.seek(0)
    except Exception as e:
        return "μ—‘μ…€ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)

    # μƒμ„±λœ μ—‘μ…€ 파일의 λ°”μ΄νŠΈ 데이터λ₯Ό λ°˜ν™˜ (λ‹€μš΄λ‘œλ“œ κ°€λŠ₯)
    return output.getvalue()

# κ·ΈλΌλ””μ˜€ μΈν„°νŽ˜μ΄μŠ€ 생성
iface = gr.Interface(
    fn=process_excel,
    inputs=gr.File(label="μ—‘μ…€ 파일 μ—…λ‘œλ“œ"),
    outputs=gr.File(label="κ²°κ³Ό μ—‘μ…€ 파일"),
    title="μ—‘μ…€ μƒν’ˆλͺ… ν‚€μ›Œλ“œ μΆ”μΆœ 및 λΉˆλ„ 뢄석",
    description=(
        "μ—‘μ…€ 파일의 D4μ…€λΆ€ν„° D열에 μžˆλŠ” μƒν’ˆλͺ… 데이터λ₯Ό λΆ„μ„ν•˜μ—¬, "
        "특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. "
        "ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ ν‚€μ›Œλ“œμ™€ λΉˆλ„λ₯Ό "
        "λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ¦¬ν•œ κ²°κ³Όλ₯Ό μ—‘μ…€ 파일둜 좜λ ₯ν•©λ‹ˆλ‹€."
    )
)

iface.launch()