aliceblue11 commited on
Commit
4a9c94b
·
verified ·
1 Parent(s): e0a5028

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -4
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
- return positive_reviews, negative_reviews
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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