File size: 3,101 Bytes
1963ca3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import gradio as gr
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import openai
import matplotlib as mpl
import matplotlib.font_manager as fm
import jieba
import jieba.analyse

# 載入停用詞
def load_stopwords(file_path):
    stopwords = set()
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            stopwords.add(line.strip())
    return stopwords

# 加載停用詞
stopwords = load_stopwords("stopwords.txt")

# 使用 OpenAI API 進行情緒分析
def analyze_text(api_key, text):
    try:
        openai.api_key = api_key
        response = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": f"範例輸出:正面情緒。請分析此文本情緒,輸出其主要為正面、負面或中性情緒: {text}"}
            ]
        )
        return response.choices[0].message.content, None  # 返回分析結果
    except Exception as e:
        error_message = f"錯誤發生: {str(e)}"
        print(error_message)
        return None, error_message  # 返回錯誤訊息

# 文本處理函數
def process_text(api_key, text, colormap):
    # 使用 jieba 進行中文分詞並過濾停用詞
    words = [word for word in jieba.cut(text) if word not in stopwords]
    words_filtered = " ".join(words)

    # 生成文字雲
    wordcloud = WordCloud(
        font_path='TaipeiSansTCBeta-Regular.ttf',  # 繁體中文字型
        width=400,
        height=200,
        colormap=colormap,  # 套用選擇的顏色地圖
        background_color='white',
        min_font_size=10,
        max_words=200
    ).generate(words_filtered)

    # 保存圖片
    fig, ax = plt.subplots(figsize=(8, 4))
    ax.imshow(wordcloud, interpolation='bilinear')
    ax.axis('off')
    plt.savefig("wordcloud.png", bbox_inches='tight', pad_inches=0)
    plt.close(fig)

    # 呼叫情緒分析函數
    analysis_result, error = analyze_text(api_key, text)
    return "wordcloud.png", analysis_result

# 加載字型
fm.fontManager.addfont('TaipeiSansTCBeta-Regular.ttf')
mpl.rc('font', family='Taipei Sans TC Beta')

# jieba 設定
jieba.set_dictionary("dict.txt")
jieba.analyse.set_stop_words("stopwords.txt")

# 定義僅限圖片中提供的顏色地圖
color_maps = [
    "Greys", "Purples", "Blues", "Greens", "Oranges", "Reds",
    "YlOrBr", "YlOrRd", "OrRd", "PuRd", "RdPu", "BuPu", "GnBu",
    "PuBu", "YlGnBu", "PuBuGn", "BuGn", "YlGn"
]

# 創建 Gradio 介面
iface = gr.Interface(
    fn=process_text,
    inputs=[
        gr.Textbox(label="請輸入你的 API 金鑰", placeholder="在此輸入 API 金鑰...", type="password"),
        gr.Textbox(label="請輸入文本", placeholder="在此輸入文本...", lines=5),
        gr.Dropdown(label="選擇文字雲風格", choices=color_maps, value="Blues")
    ],
    outputs=[gr.Image(type="filepath"), "text"],
    title="文字雲與情緒分析工具",
    description="輸入中文或英文文本,生成文字雲並分析其情緒(正面、負面或中性)。"
)

# 啟動介面
iface.launch()