Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,6 +1,26 @@
|
|
|
|
|
|
1 |
import pandas as pd
|
2 |
import gradio as gr
|
3 |
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
# 엑셀 데이터 읽기 함수
|
6 |
def read_excel_data(file):
|
@@ -42,31 +62,106 @@ def get_negative_reviews(df):
|
|
42 |
lambda x: f"{x['순번']}. **{x['Review Date']} / {x['ID']} / {x['Option']}**\n\n{x['Review']}", axis=1))
|
43 |
return negative_output
|
44 |
|
45 |
-
# 리뷰 데이터를 처리하여 긍정 및 부정 리뷰를
|
46 |
def process_reviews(file):
|
47 |
df = read_excel_data(file)
|
48 |
positive_reviews = get_positive_reviews(df)
|
49 |
negative_reviews = get_negative_reviews(df)
|
50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
|
52 |
# Gradio 인터페이스 구성
|
53 |
def create_interface():
|
54 |
with gr.Blocks() as demo:
|
55 |
gr.Markdown("### 리뷰 데이터 업로드")
|
56 |
file_input = gr.File(label="엑셀 파일 업로드", file_types=[".xlsx"])
|
57 |
-
analyze_button = gr.Button("
|
58 |
|
59 |
with gr.Column():
|
60 |
gr.Markdown("### 긍정적인 주요 리뷰 (최대 20개)")
|
61 |
positive_reviews_output = gr.Textbox(label="긍정적인 주요 리뷰", interactive=False, lines=20)
|
62 |
|
|
|
|
|
|
|
63 |
gr.Markdown("### 부정적인 주요 리뷰 (최대 30개)")
|
64 |
negative_reviews_output = gr.Textbox(label="부정적인 주요 리뷰", interactive=False, lines=30)
|
|
|
|
|
|
|
65 |
|
66 |
analyze_button.click(
|
67 |
fn=process_reviews,
|
68 |
inputs=[file_input],
|
69 |
-
outputs=[positive_reviews_output, negative_reviews_output]
|
70 |
)
|
71 |
|
72 |
return demo
|
|
|
1 |
+
# app.py
|
2 |
+
import os
|
3 |
import pandas as pd
|
4 |
import gradio as gr
|
5 |
from datetime import datetime
|
6 |
+
import openai
|
7 |
+
|
8 |
+
# OpenAI API 클라이언트 설정
|
9 |
+
openai.api_key = os.getenv("OPENAI_API_KEY")
|
10 |
+
|
11 |
+
# LLM 호출 함수
|
12 |
+
def call_api(content, system_message, max_tokens=2000, temperature=0.5, top_p=1.0):
|
13 |
+
response = openai.ChatCompletion.create(
|
14 |
+
model="gpt-4o-mini",
|
15 |
+
messages=[
|
16 |
+
{"role": "system", "content": system_message},
|
17 |
+
{"role": "user", "content": content},
|
18 |
+
],
|
19 |
+
max_tokens=max_tokens,
|
20 |
+
temperature=temperature,
|
21 |
+
top_p=top_p,
|
22 |
+
)
|
23 |
+
return response.choices[0].message['content']
|
24 |
|
25 |
# 엑셀 데이터 읽기 함수
|
26 |
def read_excel_data(file):
|
|
|
62 |
lambda x: f"{x['순번']}. **{x['Review Date']} / {x['ID']} / {x['Option']}**\n\n{x['Review']}", axis=1))
|
63 |
return negative_output
|
64 |
|
65 |
+
# 리뷰 데이터를 처리하여 긍정 및 부정 리뷰를 추출하고 분석하는 함수
|
66 |
def process_reviews(file):
|
67 |
df = read_excel_data(file)
|
68 |
positive_reviews = get_positive_reviews(df)
|
69 |
negative_reviews = get_negative_reviews(df)
|
70 |
+
|
71 |
+
# 긍정적인 리뷰 분석 프롬프트
|
72 |
+
positive_prompt = """[중요 규칙]
|
73 |
+
1. 반드시 한글(한국어)로 출력하라.
|
74 |
+
2. 너는 리뷰 데이터를 분석하는 빅데이터 분석가이다.
|
75 |
+
3. 고객의 리뷰 데이터를 바탕으로 긍정적인 의견의 데이터만 분석하라.
|
76 |
+
4. 반드시 제공된 리뷰 데이터에서만 분석하라.
|
77 |
+
5. 너의 생각을 포함하지 말 것.
|
78 |
+
[분석 조건]
|
79 |
+
1. 총 20개의 리뷰데이터를 제공한다.
|
80 |
+
2. 각 리뷰 데이터의 둘째줄 부터의 실제 고객리뷰를 반영하라.
|
81 |
+
3. 반드시 긍정적인 의견만을 분석하라. 부정적인 의견은 제외하라.
|
82 |
+
4. 기능과 성능의 부분, 감성적인 부분, 실제 사용 측면의 부분, 배송의 부분, 타겟별 부분의 관점으로 분석하라.
|
83 |
+
5. 4번의 조건에 포함되지 않는 긍정적인 리뷰를 별도로 출력하라.
|
84 |
+
6. 마케팅적인 요소로 사용할 수 있는 고객의 실제 리뷰를 반영하라.
|
85 |
+
[출력 형태 조건]
|
86 |
+
1. 각각의 제목 앞에 '📝'이모지를 출력하라,'#', '##'은 출력하지 말것.
|
87 |
+
2. 가장 마지막에 종합 의견을 작성하라, "🏆종합의견"의 제목형태를 사용하라.
|
88 |
+
[종합의견의 출력 조건 시작]
|
89 |
+
('종합의견'이 아닌 다른 부분에 이 출력 조건을 반영하지 말 것.
|
90 |
+
- 항목별 제목을 제외하라.
|
91 |
+
- 종합의견에는 항목별 제목을 제외하고 서술식 문장으로 작성하라.
|
92 |
+
- 매출을 극대화 할 수 있는 고객의 실제 리뷰 포인트를 제시하라.
|
93 |
+
[SWOT분석 조건]
|
94 |
+
1. '종합의견' 다음 내용으로 SWOT분석 의견을 출력하라.
|
95 |
+
2. SWOT분석 중 '강점'의견과 '기회'의 의견을 출력하라.
|
96 |
+
3. 반드시 '종합의견'의 내용을 기반으로 작성하라.
|
97 |
+
4. 제목은 '🏹 강점', '🏹 기회'으로 출력하라.
|
98 |
+
[종합의견의 출력 조건 끝]
|
99 |
+
3. 실제 고객의 리뷰 데이터에서 사용된 단어를 포함하라.
|
100 |
+
4. 너의 생각을 임의로 넣지 말 것.
|
101 |
+
"""
|
102 |
+
|
103 |
+
# 부정적인 리뷰 분석 프롬프트
|
104 |
+
negative_prompt = """[중요 규칙]
|
105 |
+
1. 반드시 한글(한국어)로 출력하라.
|
106 |
+
2. 너는 리뷰 데이터를 분석하는 빅데이터 분석가이다.
|
107 |
+
3. 고객의 리뷰 데이터를 바탕으로 부정적인 의견의 데이터만 분석하라.
|
108 |
+
4. 반드시 제공된 리뷰 데이터에서만 분석하라.
|
109 |
+
5. 너의 생각을 포함하지 말 것.
|
110 |
+
[분석 조건]
|
111 |
+
1. 총 30개의 리뷰데이터를 제공한다.
|
112 |
+
2. 각 리뷰 데이터의 둘째줄 부터의 실제 고객리뷰를 반영하라.
|
113 |
+
3. 부정적인 의견만을 분석하라.
|
114 |
+
4. 기능과 성능의 부분, 감성적인 부분, 실제 사용 측면의 부분, 배송의 부분, 고객의 분노 부분의 관점으로 분석하라.
|
115 |
+
5. 4번의 조건에 포함되지 않는 부정적인 리뷰를 별도로 출력하라.
|
116 |
+
6. 부정적인 리뷰 분석 결과를 바탕으로 '개선할 점'을 출력하라.
|
117 |
+
[출력 형태 조건]
|
118 |
+
1. 각각의 제목 앞에 '📝'이모지를 출력하라,'#', '##'은 출력하지 말것.
|
119 |
+
2. 가장 마지막에 '개선할 점'을 출력하라("📢개선할 점"의 제목형태를 사용하라.)
|
120 |
+
[개선할 점의 출력 조건 시작]
|
121 |
+
('개선할 점'이 아닌 다른 부분에 이 출력 조건을 반영하지 말 것.
|
122 |
+
- 항목별 제목을 제외하라.
|
123 |
+
- 주요 항목별로 개선할 점을 출력하라.
|
124 |
+
- 전문적이고, 분석적이며, 제안하는 형태의 공손한 어투를 사용하라.(단답형 표현 금지)
|
125 |
+
[SWOT분석 조건]
|
126 |
+
1. '종합의견' 다음 내용으로 SWOT분석 의견을 출력하라.
|
127 |
+
2. SWOT분석 중 '약점'의견��� '위협'의 의견을 출력하라.
|
128 |
+
3. 반드시 '개선할 점'의 내용을 기반으로 작성하라.
|
129 |
+
4. 제목은 '💉 약점', '💉 위협'으로 출력하라.
|
130 |
+
[개선할 점의 출력 조건 끝]
|
131 |
+
3. 실제 고객의 리뷰 데이터에서 사용된 단어를 포함하라.
|
132 |
+
4. 너의 생각을 임의로 넣지 말 것.
|
133 |
+
"""
|
134 |
+
|
135 |
+
# LLM을 사용하여 리뷰 분석
|
136 |
+
positive_analysis = call_api(positive_reviews, system_message=positive_prompt)
|
137 |
+
negative_analysis = call_api(negative_reviews, system_message=negative_prompt)
|
138 |
+
|
139 |
+
return positive_reviews, negative_reviews, positive_analysis, negative_analysis
|
140 |
|
141 |
# Gradio 인터페이스 구성
|
142 |
def create_interface():
|
143 |
with gr.Blocks() as demo:
|
144 |
gr.Markdown("### 리뷰 데이터 업로드")
|
145 |
file_input = gr.File(label="엑셀 파일 업로드", file_types=[".xlsx"])
|
146 |
+
analyze_button = gr.Button("리뷰분석")
|
147 |
|
148 |
with gr.Column():
|
149 |
gr.Markdown("### 긍정적인 주요 리뷰 (최대 20개)")
|
150 |
positive_reviews_output = gr.Textbox(label="긍정적인 주요 리뷰", interactive=False, lines=20)
|
151 |
|
152 |
+
gr.Markdown("### 긍정 리뷰 분석 결과")
|
153 |
+
positive_analysis_output = gr.Textbox(label="긍정 리뷰 분석", interactive=False, lines=30)
|
154 |
+
|
155 |
gr.Markdown("### 부정적인 주요 리뷰 (최대 30개)")
|
156 |
negative_reviews_output = gr.Textbox(label="부정적인 주요 리뷰", interactive=False, lines=30)
|
157 |
+
|
158 |
+
gr.Markdown("### 부정 리뷰 분석 결과")
|
159 |
+
negative_analysis_output = gr.Textbox(label="부정 리뷰 분석", interactive=False, lines=30)
|
160 |
|
161 |
analyze_button.click(
|
162 |
fn=process_reviews,
|
163 |
inputs=[file_input],
|
164 |
+
outputs=[positive_reviews_output, negative_reviews_output, positive_analysis_output, negative_analysis_output]
|
165 |
)
|
166 |
|
167 |
return demo
|