File size: 3,286 Bytes
7cfcd5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
import gradio as gr
from datetime import datetime

# 엑셀 데이터 읽기 함수
def read_excel_data(file):
    df = pd.read_excel(file, usecols="A, B, C, D, E", skiprows=1,
                       names=["ID", "Review Date", "Option", "Review", "ReviewScore"], engine='openpyxl')
    df['Review Date'] = pd.to_datetime(df['Review Date']).dt.tz_localize(None).dt.date
    df['Year'] = df['Review Date'].astype(str).str.slice(0, 4)
    df['Option1'] = df['Option'].astype(str).str.split(" / ").str[0]  # 1차 옵션 추출
    df['Review Length'] = df['Review'].str.len()  # 리뷰 길이 계산
    return df

# 긍정적인 리뷰를 반환하는 함수
def get_positive_reviews(df):
    # 리뷰 점수가 4 이상인 긍정 리뷰 필터링
    positive_reviews = df[df['ReviewScore'] >= 4].sort_values(by='Review Length', ascending=False)
    positive_reviews = positive_reviews.head(20)  # 상위 20개 리뷰 선택

    positive_reviews.reset_index(drop=True, inplace=True)
    positive_reviews.index += 1
    positive_reviews['순번'] = positive_reviews.index

    # 리뷰 형식 지정
    positive_output = "\n\n".join(positive_reviews.apply(
        lambda x: f"{x['순번']}. **{x['Review Date']} / {x['ID']} / {x['Option']}**\n\n{x['Review']}", axis=1))
    return positive_output

# 부정적인 리뷰를 반환하는 함수
def get_negative_reviews(df):
    # 리뷰 점수가 2 이하인 부정 리뷰 필터링
    negative_reviews = df[df['ReviewScore'] <= 2].sort_values(by='Review Length', ascending=False)
    negative_reviews = negative_reviews.head(30)  # 상위 30개 리뷰 선택

    negative_reviews.reset_index(drop=True, inplace=True)
    negative_reviews.index += 1
    negative_reviews['순번'] = negative_reviews.index

    # 리뷰 형식 지정
    negative_output = "\n\n".join(negative_reviews.apply(
        lambda x: f"{x['순번']}. **{x['Review Date']} / {x['ID']} / {x['Option']}**\n\n{x['Review']}", axis=1))
    return negative_output

# 리뷰 데이터를 처리하여 긍정 및 부정 리뷰를 추출하는 함수
def process_reviews(file):
    df = read_excel_data(file)
    positive_reviews = get_positive_reviews(df)
    negative_reviews = get_negative_reviews(df)
    return positive_reviews, negative_reviews

# Gradio 인터페이스 구성
def create_interface():
    with gr.Blocks() as demo:
        gr.Markdown("### 리뷰 데이터 업로드")
        file_input = gr.File(label="엑셀 파일 업로드", file_types=[".xlsx"])
        analyze_button = gr.Button("리뷰 추출하기")
        
        with gr.Column():
            gr.Markdown("### 긍정적인 주요 리뷰 (최대 20개)")
            positive_reviews_output = gr.Textbox(label="긍정적인 주요 리뷰", interactive=False, lines=20)
            
            gr.Markdown("### 부정적인 주요 리뷰 (최대 30개)")
            negative_reviews_output = gr.Textbox(label="부정적인 주요 리뷰", interactive=False, lines=30)
        
        analyze_button.click(
            fn=process_reviews,
            inputs=[file_input],
            outputs=[positive_reviews_output, negative_reviews_output]
        )
    
    return demo

if __name__ == "__main__":
    interface = create_interface()
    interface.launch()