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()