Spaces:
Sleeping
Sleeping
import json | |
import os | |
import gradio as gr | |
from textblob import TextBlob | |
from snownlp import SnowNLP | |
def sentiment_analysis(text: str) -> str: | |
''' | |
Analyse the sentiment of the given text | |
Args: | |
text (str): The text to analyse | |
Returns: | |
str: A JSON string containing polarity, subjectivity, and assessment | |
''' | |
blob = TextBlob(text) | |
sentiment = blob.sentiment | |
result = { | |
'polarity': round(sentiment.polarity, 2), # -1 (negative) to 1 (positive) | |
'subjectivity': round(sentiment.subjectivity, 2), # 0 (objective) to 1 (subjective) | |
'assessment': 'positive' if sentiment.polarity > 0 else 'negative' if sentiment.polarity < 0 else 'neutral' | |
} | |
return json.dumps(result) | |
def chinese_sentiment_analysis(text: str) -> str: | |
''' | |
Analyse the sentiment of the given Chinese text | |
Args: | |
text (str): The text to analyse | |
Returns: | |
str: A JSON string containing polarity, subjectivity, and assessment | |
''' | |
s = SnowNLP(text) | |
# SnowNLP 的情感分析返回值範圍是 0 到 1,0 表示負面,1 表示正面 | |
polarity = s.sentiments | |
subjectivity = None # SnowNLP 不提供主觀性評估,可設為 None 或其他值 | |
result = { | |
'polarity': round(polarity, 2), # 0 (negative) to 1 (positive) | |
'subjectivity': subjectivity, # SnowNLP 不提供主觀性評估 | |
'assessment': 'positive' if polarity > 0.5 else 'negative' if polarity < 0.5 else 'neutral' | |
} | |
return json.dumps(result) | |
def batch_sentiment_analysis(file_path: str) -> str: | |
''' | |
Batch process sentiment analysis from JSON file | |
Args: | |
file_path (str): Path to JSON file with {text: ''} format | |
Returns: | |
str: JSON string with analysis results in values | |
''' | |
with open(file_path, 'r', encoding = 'utf-8') as f: | |
data = json.load(f) | |
for key in data: | |
analysis_result = json.loads( sentiment_analysis(key) ) | |
data[key] = analysis_result | |
dir_name = os.path.dirname(file_path) | |
base_name = os.path.basename(file_path) | |
output_path = os.path.join(dir_name, f'processed_{base_name}') | |
with open(output_path, 'w', encoding = 'utf-8') as f: | |
json.dump(data, f, ensure_ascii = False, indent = 2) | |
return output_path | |
def batch_chinese_sentiment_analysis(file_path: str) -> str: | |
''' | |
Batch process Chinese sentiment analysis from JSON file | |
Args: | |
file_path (str): Path to JSON file with {text: ''} format | |
Returns: | |
str: JSON string with analysis results in values | |
''' | |
with open(file_path, 'r', encoding = 'utf-8') as f: | |
data = json.load(f) | |
for key in data: | |
analysis_result = json.loads( chinese_sentiment_analysis(key) ) | |
data[key] = analysis_result | |
dir_name = os.path.dirname(file_path) | |
base_name = os.path.basename(file_path) | |
output_path = os.path.join(dir_name, f'processed_{base_name}') | |
with open(output_path, 'w', encoding = 'utf-8') as f: | |
json.dump(data, f, ensure_ascii = False, indent = 2) | |
return output_path | |
# gradio interface | |
demo = gr.TabbedInterface( | |
[ | |
gr.Interface( | |
fn = sentiment_analysis, | |
inputs = gr.Textbox(placeholder = 'Enter text to analyse...'), | |
outputs = gr.Textbox(), | |
title = 'Text Sentiment Analysis', | |
description = 'Analyse the sentiment of text using TextBlob', | |
api_name = 'sentiment_analysis' | |
), | |
gr.Interface( | |
fn = chinese_sentiment_analysis, | |
inputs = gr.Textbox(placeholder = '要分析的中文...'), | |
outputs = gr.Textbox(), | |
title = '中文情感分析', | |
description = 'Analyse the sentiment of Chinese text using SnowNLP', | |
api_name = 'chinese_sentiment_analysis' | |
), | |
gr.Interface( | |
fn = batch_sentiment_analysis, | |
inputs = gr.File(label = 'Upload JSON File'), | |
outputs = gr.File(label = 'Download Results'), | |
title = 'Batch Sentiment Analysis', | |
description = 'Process JSON file with multiple texts (English)', | |
api_name = 'batch_sentiment_analysis' | |
), | |
gr.Interface( | |
fn = batch_chinese_sentiment_analysis, | |
inputs = gr.File(label = '上傳JSON文件'), | |
outputs = gr.File(label = '下載分析結果'), | |
title = '批量中文情感分析', | |
description = 'Batch process Chinese sentiment analysis from JSON file', | |
api_name = 'batch_chinese_sentiment_analysis' | |
) | |
], | |
[ | |
'sentiment analysis', | |
'中文情感分析', | |
'batch processing', | |
'批次中文情感分析' | |
] | |
) | |
# Launch the interface and MCP server | |
if __name__ == '__main__': | |
demo.launch(mcp_server = True) | |