Spaces:
Running
Running
File size: 9,484 Bytes
91d39c6 d47c86c 91d39c6 |
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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
import json
import requests
import os
class TextAnalyzer:
"""
テキストのハラスメント検出と会話評価を行うクラス。
"""
def __init__(self, file_path, keywords):
"""
TextAnalyzer クラスのコンストラクタ。
Args:
file_path (str): 分析するテキストファイルのパス。
keywords (list): ハラスメント検出に使用するキーワードのリスト。
"""
self.file_path = file_path
self.keywords = keywords
self.text_content = None # テキストファイルの内容を格納
self.harassment_detected = False # ハラスメントが検出されたかどうか
self.harassment_keywords = [] # 検出されたハラスメントキーワードのリスト
self.deepseek_analysis = {} # DeepSeek API による分析結果を格納する辞書
self.api_key = None
def load_text(self):
"""
テキストファイルを読み込み、その内容を self.text_content に格納する。
Returns:
bool: ファイルの読み込みに成功した場合は True、失敗した場合は False。
"""
try:
with open(self.file_path, 'r', encoding='utf-8') as file:
self.text_content = file.read()
return True
except Exception as e:
print(f"ファイル読み込みエラー: {e}")
return False
def detect_harassment(self):
"""
テキスト内容からハラスメントを検出する。
Returns:
bool: ハラスメントが検出された場合は True、それ以外は False。
"""
if not self.text_content:
return False
self.harassment_keywords = []
for keyword in self.keywords:
if keyword in self.text_content:
self.harassment_detected = True
self.harassment_keywords.append(keyword)
return self.harassment_detected
def analyze_with_deepseek(self, api_key=None, api_url="https://api.deepseek.com/v1/chat/completions"):
"""
DeepSeek API を使用して会話を分析する。会話レベルやハラスメントの詳細な検出を行う。
Args:
api_key (str, optional): DeepSeek API キー。指定されない場合は環境変数から取得。
api_url (str, optional): DeepSeek API の URL。デフォルトは標準のチャット補完エンドポイント。
Returns:
bool: 分析に成功した場合は True、失敗した場合は False。
"""
if not self.text_content:
return False
# 提供された API キーを使用するか、環境変数から取得する
if api_key:
self.api_key = api_key
else:
self.api_key = os.environ.get("DEEPSEEK_API_KEY")
if not self.api_key:
print("DeepSeek API キーが提供されておらず、環境変数にも見つかりませんでした。")
return False
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_key}"
}
prompt = f"""
以下の会話を分析し、結果を JSON 形式で返してください。1 から 10 のスケールで評価し、10 が最高です。
厳密に評価してください。ハラスメントが存在する場合は、その種類を具体的に記述してください。
評価基準:
1. conversationLevel: 会話のレベル (初心者、中級者、上級者)。
2. harassmentPresent: 会話にハラスメント表現が含まれているかどうか (true/false)。
3. harassmentType: ハラスメントが存在する場合、その種類を具体的に記述。
4. topicAppropriateness: 会話のトピックが適切かどうか。
5. improvementSuggestions: 会話を改善するための具体的な提案。
6. repetition: 同じことがどの程度繰り返されているか。(1-10)
7. pleasantConversation: 会話がどの程度心地よいか。(1-10)
8. blameOrHarassment: 会話がどの程度相手を責めたり、ハラスメントをしているか。(1-10)
会話内容:
{self.text_content}
JSON 形式のみを返してください。
"""
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"response_format": {"type": "json_object"}
}
try:
response = requests.post(api_url, headers=headers, json=data)
response.raise_for_status()
result = response.json()
deepseek_response = json.loads(result["choices"][0]["message"]["content"])
# 指定されたキーを使用して、インスタンス変数に値を割り当てる
self.deepseek_analysis = {
"conversationLevel": deepseek_response.get("conversationLevel"),
"harassmentPresent": deepseek_response.get("harassmentPresent"),
"harassmentType": deepseek_response.get("harassmentType"),
"topicAppropriateness": deepseek_response.get("topicAppropriateness"),
"improvementSuggestions": deepseek_response.get("improvementSuggestions"),
"repetition": deepseek_response.get("repetition"),
"pleasantConversation": deepseek_response.get("pleasantConversation"),
"blameOrHarassment": deepseek_response.get("blameOrHarassment"),
}
return True
except requests.exceptions.RequestException as e:
print(f"DeepSeek API リクエストエラー: {e}")
return False
except json.JSONDecodeError as e:
print(f"DeepSeek API レスポンスの JSON デコードエラー: {e}")
print(f"レスポンス内容: {response.text}")
return False
except KeyError as e:
print(f"DeepSeek API レスポンスのキーエラー: {e}")
print(f"レスポンス内容: {response.text}")
return False
except Exception as e:
print(f"DeepSeek API エラー: {e}")
return False
def get_analysis_results(self):
"""
分析結果を返す。
Returns:
dict: 分析結果を含む辞書。
"""
results = {
"text_content": self.text_content,
"basic_harassment_detection": {
"detected": self.harassment_detected,
"matching_keywords": self.harassment_keywords
},
"deepseek_analysis": self.deepseek_analysis
}
return results
def analyze(self, api_key=None):
"""
すべての分析を実行し、結果を返す。
Args:
api_key (str, optional): DeepSeek API キー。
Returns:
dict: 分析結果またはエラーメッセージを含む辞書。
"""
if not self.load_text():
return {"error": "テキストファイルの読み込みに失敗しました。"}
self.detect_harassment()
if not self.analyze_with_deepseek(api_key):
return {"error": "DeepSeek API 分析に失敗しました。"}
return self.get_analysis_results()
'''
# 使用例
if __name__ == "__main__":
# ハラスメント検出用のキーワード例
harassment_keywords = [
"バカ", "馬鹿", "アホ", "死ね", "クソ", "うざい",
"きもい", "キモい", "ブス", "デブ", "ハゲ",
"セクハラ", "パワハラ", "モラハラ"
]
# 分析インスタンスの作成
analyzer = TextAnalyzer("./2.txt", harassment_keywords)
# DeepSeek API キー (環境変数から取得するか、直接渡す)
# api_key = os.environ.get("DEEPSEEK_API_KEY")
# 分析の実行
results = analyzer.analyze(api_key=api_key)
# 結果の出力
print(json.dumps(results, ensure_ascii=False, indent=2))
# 特定の値へのアクセス例
if "deepseek_analysis" in results and results["deepseek_analysis"]:
deepseek_data = results["deepseek_analysis"]
conversation_level = deepseek_data.get("conversationLevel")
harassment_present = deepseek_data.get("harassmentPresent")
harassment_type = deepseek_data.get("harassmentType")
repetition = deepseek_data.get("repetition")
pleasantConversation = deepseek_data.get("pleasantConversation")
blameOrHarassment = deepseek_data.get("blameOrHarassment")
print("\n--- DeepSeek 分析結果 ---")
print(f"会話レベル: {conversation_level}")
print(f"ハラスメントの有無: {harassment_present}")
print(f"ハラスメントの種類: {harassment_type}")
print(f"繰り返しの程度: {repetition}")
print(f"会話の心地よさ: {pleasantConversation}")
print(f"非難またはハラスメントの程度: {blameOrHarassment}")
''' |