Spaces:
Sleeping
Sleeping
import os | |
import pandas as pd | |
import gradio as gr | |
import openai | |
from datetime import datetime | |
# OpenAI API ํด๋ผ์ด์ธํธ ์ค์ | |
openai.api_key = os.getenv("OPENAI_API_KEY") | |
# LLM ํธ์ถ ํจ์ | |
def call_api(content, system_message, max_tokens=2000, temperature=0.7, top_p=0.9): | |
response = openai.ChatCompletion.create( | |
model="gpt-4o-mini", | |
messages=[ | |
{"role": "system", "content": system_message}, | |
{"role": "user", "content": content}, | |
], | |
max_tokens=max_tokens, | |
temperature=temperature, | |
top_p=top_p, | |
) | |
return response.choices[0].message['content'] | |
# ์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ ํจ์ | |
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] | |
df['Review Length'] = df['Review'].str.len() | |
return df | |
# ๊ธ์ ์ ์ธ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐํํ๋ ํจ์ | |
def get_positive_reviews(df): | |
positive_reviews = df[df['ReviewScore'] >= 4].sort_values(by='Review Length', ascending=False) | |
positive_reviews = positive_reviews.head(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)) | |
system_message = """[์ค์ ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ธ(ํ๊ตญ์ด)๋ก ์ถ๋ ฅํ๋ผ. | |
2. ๋๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋น ๋ฐ์ดํฐ ๋ถ์๊ฐ์ด๋ค. | |
3. ๊ณ ๊ฐ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๊ธ์ ์ ์ธ ์๊ฒฌ์ ๋ฐ์ดํฐ๋ง ๋ถ์ํ๋ผ. | |
4. ๋ฐ๋์ ์ ๊ณต๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์๋ง ๋ถ์ํ๋ผ. | |
5. ๋์ ์๊ฐ์ ํฌํจํ์ง ๋ง ๊ฒ. | |
[๋ถ์ ์กฐ๊ฑด] | |
1. ์ด 20๊ฐ์ ๋ฆฌ๋ทฐ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. | |
2. ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ ๋์งธ์ค ๋ถํฐ์ ์ค์ ๊ณ ๊ฐ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ๋ผ. | |
3. ๋ฐ๋์ ๊ธ์ ์ ์ธ ์๊ฒฌ๋ง์ ๋ถ์ํ๋ผ. ๋ถ์ ์ ์ธ ์๊ฒฌ์ ์ ์ธํ๋ผ. | |
4. ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ์ ๋ถ๋ถ, ๊ฐ์ฑ์ ์ธ ๋ถ๋ถ, ์ค์ ์ฌ์ฉ ์ธก๋ฉด์ ๋ถ๋ถ, ๋ฐฐ์ก์ ๋ถ๋ถ, ํ๊ฒ๋ณ ๋ถ๋ถ์ ๊ด์ ์ผ๋ก ๋ถ์ํ๋ผ. | |
5. 4๋ฒ์ ์กฐ๊ฑด์ ํฌํจ๋์ง ์๋ ๊ธ์ ์ ์ธ ๋ฆฌ๋ทฐ๋ฅผ ๋ณ๋๋ก ์ถ๋ ฅํ๋ผ. | |
6. ๋ง์ผํ ์ ์ธ ์์๋ก ์ฌ์ฉํ ์ ์๋ ๊ณ ๊ฐ์ ์ค์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ๋ผ. | |
[์ถ๋ ฅ ํํ ์กฐ๊ฑด] | |
1. ๊ฐ๊ฐ์ ์ ๋ชฉ ์์ '๐'์ด๋ชจ์ง๋ฅผ ์ถ๋ ฅํ๋ผ,'#', '##'์ ์ถ๋ ฅํ์ง ๋ง๊ฒ. | |
2. ๊ฐ์ฅ ๋ง์ง๋ง์ ์ข ํฉ ์๊ฒฌ์ ์์ฑํ๋ผ, "๐์ข ํฉ์๊ฒฌ"์ ์ ๋ชฉํํ๋ฅผ ์ฌ์ฉํ๋ผ. | |
[์ข ํฉ์๊ฒฌ์ ์ถ๋ ฅ ์กฐ๊ฑด ์์] | |
('์ข ํฉ์๊ฒฌ'์ด ์๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด ์ถ๋ ฅ ์กฐ๊ฑด์ ๋ฐ์ํ์ง ๋ง ๊ฒ. | |
- ํญ๋ชฉ๋ณ ์ ๋ชฉ์ ์ ์ธํ๋ผ. | |
- ์ข ํฉ์๊ฒฌ์๋ ํญ๋ชฉ๋ณ ์ ๋ชฉ์ ์ ์ธํ๊ณ ์์ ์ ๋ฌธ์ฅ์ผ๋ก ์์ฑํ๋ผ. | |
- ๋งค์ถ์ ๊ทน๋ํ ํ ์ ์๋ ๊ณ ๊ฐ์ ์ค์ ๋ฆฌ๋ทฐ ํฌ์ธํธ๋ฅผ ์ ์ํ๋ผ. | |
[SWOT๋ถ์ ์กฐ๊ฑด] | |
1. '์ข ํฉ์๊ฒฌ' ๋ค์ ๋ด์ฉ์ผ๋ก SWOT๋ถ์ ์๊ฒฌ์ ์ถ๋ ฅํ๋ผ. | |
2. SWOT๋ถ์ ์ค '๊ฐ์ '์๊ฒฌ๊ณผ '๊ธฐํ'์ ์๊ฒฌ์ ์ถ๋ ฅํ๋ผ. | |
3. ๋ฐ๋์ '์ข ํฉ์๊ฒฌ'์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ผ. | |
4. ์ ๋ชฉ์ '๐น ๊ฐ์ ', '๐น ๊ธฐํ'์ผ๋ก ์ถ๋ ฅํ๋ผ. | |
[์ข ํฉ์๊ฒฌ์ ์ถ๋ ฅ ์กฐ๊ฑด ๋] | |
3. ์ค์ ๊ณ ๊ฐ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ ์ฌ์ฉ๋ ๋จ์ด๋ฅผ ํฌํจํ๋ผ. | |
4. ๋์ ์๊ฐ์ ์์๋ก ๋ฃ์ง ๋ง ๊ฒ. | |
""" | |
analysis = call_api(positive_output, system_message=system_message) | |
return positive_output, analysis | |
# ๋ถ์ ์ ์ธ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐํํ๋ ํจ์ | |
def get_negative_reviews(df): | |
negative_reviews = df[df['ReviewScore'] <= 2].sort_values(by='Review Length', ascending=False) | |
negative_reviews = negative_reviews.head(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)) | |
system_message = """[์ค์ ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ธ(ํ๊ตญ์ด)๋ก ์ถ๋ ฅํ๋ผ. | |
2. ๋๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋น ๋ฐ์ดํฐ ๋ถ์๊ฐ์ด๋ค. | |
3. ๊ณ ๊ฐ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ถ์ ์ ์ธ ์๊ฒฌ์ ๋ฐ์ดํฐ๋ง ๋ถ์ํ๋ผ. | |
4. ๋ฐ๋์ ์ ๊ณต๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์๋ง ๋ถ์ํ๋ผ. | |
5. ๋์ ์๊ฐ์ ํฌํจํ์ง ๋ง ๊ฒ. | |
[๋ถ์ ์กฐ๊ฑด] | |
1. ์ด 30๊ฐ์ ๋ฆฌ๋ทฐ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. | |
2. ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ ๋์งธ์ค ๋ถํฐ์ ์ค์ ๊ณ ๊ฐ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ๋ผ. | |
3. ๋ถ์ ์ ์ธ ์๊ฒฌ๋ง์ ๋ถ์ํ๋ผ. | |
4. ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ์ ๋ถ๋ถ, ๊ฐ์ฑ์ ์ธ ๋ถ๋ถ, ์ค์ ์ฌ์ฉ ์ธก๋ฉด์ ๋ถ๋ถ, ๋ฐฐ์ก์ ๋ถ๋ถ, ๊ณ ๊ฐ์ ๋ถ๋ ธ ๋ถ๋ถ์ ๊ด์ ์ผ๋ก ๋ถ์ํ๋ผ. | |
5. 4๋ฒ์ ์กฐ๊ฑด์ ํฌํจ๋์ง ์๋ ๋ถ์ ์ ์ธ ๋ฆฌ๋ทฐ๋ฅผ ๋ณ๋๋ก ์ถ๋ ฅํ๋ผ. | |
6. ๋ถ์ ์ ์ธ ๋ฆฌ๋ทฐ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก '๊ฐ์ ํ ์ '์ ์ถ๋ ฅํ๋ผ. | |
[์ถ๋ ฅ ํํ ์กฐ๊ฑด] | |
1. ๊ฐ๊ฐ์ ์ ๋ชฉ ์์ '๐'์ด๋ชจ์ง๋ฅผ ์ถ๋ ฅํ๋ผ,'#', '##'์ ์ถ๋ ฅํ์ง ๋ง๊ฒ. | |
2. ๊ฐ์ฅ ๋ง์ง๋ง์ '๊ฐ์ ํ ์ '์ ์ถ๋ ฅํ๋ผ("๐ข๊ฐ์ ํ ์ "์ ์ ๋ชฉํํ๋ฅผ ์ฌ์ฉํ๋ผ.) | |
[๊ฐ์ ํ ์ ์ ์ถ๋ ฅ ์กฐ๊ฑด ์์] | |
('๊ฐ์ ํ ์ '์ด ์๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด ์ถ๋ ฅ ์กฐ๊ฑด์ ๋ฐ์ํ์ง ๋ง ๊ฒ. | |
- ํญ๋ชฉ๋ณ ์ ๋ชฉ์ ์ ์ธํ๋ผ. | |
- ์ฃผ์ ํญ๋ชฉ๋ณ๋ก ๊ฐ์ ํ ์ ์ ์ถ๋ ฅํ๋ผ. | |
- ์ ๋ฌธ์ ์ด๊ณ , ๋ถ์์ ์ด๋ฉฐ, ์ ์ํ๋ ํํ์ ๊ณต์ํ ์ดํฌ๋ฅผ ์ฌ์ฉํ๋ผ.(๋จ๋ตํ ํํ ๊ธ์ง) | |
[SWOT๋ถ์ ์กฐ๊ฑด] | |
1. '์ข ํฉ์๊ฒฌ' ๋ค์ ๋ด์ฉ์ผ๋ก SWOT๋ถ์ ์๊ฒฌ์ ์ถ๋ ฅํ๋ผ. | |
2. SWOT๋ถ์ ์ค '์ฝ์ '์๊ฒฌ๊ณผ '์ํ'์ ์๊ฒฌ์ ์ถ๋ ฅํ๋ผ. | |
3. ๋ฐ๋์ '๊ฐ์ ํ ์ '์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ผ. | |
4. ์ ๋ชฉ์ '๐ ์ฝ์ ', '๐ ์ํ'์ผ๋ก ์ถ๋ ฅํ๋ผ. | |
[๊ฐ์ ํ ์ ์ ์ถ๋ ฅ ์กฐ๊ฑด ๋] | |
3. ์ค์ ๊ณ ๊ฐ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ ์ฌ์ฉ๋ ๋จ์ด๋ฅผ ํฌํจํ๋ผ. | |
4. ๋์ ์๊ฐ์ ์์๋ก ๋ฃ์ง ๋ง ๊ฒ. | |
""" | |
analysis = call_api(negative_output, system_message=system_message) | |
return negative_output, analysis | |
# ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ์ถ์ถํ๋ ํจ์ | |
def process_reviews(file): | |
df = read_excel_data(file) | |
positive_reviews, positive_analysis = get_positive_reviews(df) | |
negative_reviews, negative_analysis = get_negative_reviews(df) | |
return positive_reviews, positive_analysis, negative_reviews, negative_analysis | |
# 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) | |
positive_analysis_output = gr.Textbox(label="๊ธ์ ๋ฆฌ๋ทฐ ๋ถ์ ๊ฒฐ๊ณผ", interactive=False, lines=10) | |
gr.Markdown("### ๋ถ์ ์ ์ธ ์ฃผ์ ๋ฆฌ๋ทฐ (์ต๋ 30๊ฐ)") | |
negative_reviews_output = gr.Textbox(label="๋ถ์ ์ ์ธ ์ฃผ์ ๋ฆฌ๋ทฐ", interactive=False, lines=30) | |
negative_analysis_output = gr.Textbox(label="๋ถ์ ๋ฆฌ๋ทฐ ๋ถ์ ๊ฒฐ๊ณผ", interactive=False, lines=10) | |
analyze_button.click( | |
fn=process_reviews, | |
inputs=[file_input], | |
outputs=[positive_reviews_output, positive_analysis_output, negative_reviews_output, negative_analysis_output] | |
) | |
return demo | |
if __name__ == "__main__": | |
interface = create_interface() | |
interface.launch() | |