Files

571 lines
21 KiB
Plaintext
Raw Permalink Normal View History

2026-06-27 07:52:17 +03:30
{
"cells": [
{
"cell_type": "markdown",
"id": "1c94123f",
"metadata": {},
"source": [
"## Score estimation class and implementation"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e1b8267f",
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"#from transformers import pipeline\n",
"import re\n",
"import joblib\n",
"import time\n",
"import numpy as np\n",
"\n",
"# positive\n",
"PERSONALITY = \"\"\"\n",
"\n",
"شما از یک مقیاس ده‌تایی برای اعلام میزان رعایت معیار استفاده می‌کنید.\n",
"سپس عدد انتخاب‌شده را به شکل خروجی پایتون بازمی‌گردانید.\n",
"\n",
"مقیاس رضایت شما به‌صورت زیر تعریف می‌شود:\n",
"9. رضایت کامل از رعایت معیار \n",
"8. رضایت بسیار زیاد \n",
"7. رضایت زیاد \n",
"6. نسبتاً راضی \n",
"5. رضایت متوسط \n",
"4. رضایت اندک \n",
"3. نارضایتی اندک \n",
"2. نسبتاً ناراضی \n",
"1. نارضایتی زیاد \n",
"0. عدم رضایت کامل از رعایت معیار\n",
"\"\"\"\n",
"\n",
"INTRO_QUARY = \"\"\"\n",
"اکنون لطفاً متن زیر را بررسی کن. سپس از مقیاس ده‌تایی برای اعلام میزان رعایت معیار استفاده کن و در نهایت، نتیجه را در قالب یک متغیر پایتونی به نام `satisfaction_index` ارائه بده.\n",
"متن نحلیل :\n",
"\n",
"\"\"\"\n",
" \n",
"QUESTION = \"\"\"\n",
"\n",
"در پایان، پاسخ خود را این‌گونه ارائه بده:\n",
"\n",
"```python\n",
"satisfaction_index = عدد انتخابی از 0 تا 9\n",
"```\n",
"\"\"\"\n",
"\n",
"def extract_senmtiment_score(output):\n",
" # If the output contains a code block, extract the list using regex\n",
" import re\n",
"\n",
" # Get only the code block (text between ```python and ```)\n",
" match = re.search(r\"```python\\n(.*?)```\", output, re.DOTALL)\n",
" if match:\n",
" code = match.group(1)\n",
" exec_globals = {}\n",
" try:\n",
" exec(code, exec_globals) # Be cautious with exec; only use with trusted content\n",
" return exec_globals[\"satisfaction_index\"]/9.\n",
" except: \n",
" print(\"No variables found.\")\n",
" print(code)\n",
" return 0\n",
"\n",
" else:\n",
" print(\"No code block or questions found.\")\n",
" print(match)\n",
" \n",
" return 0\n",
"\n",
"from LLMInterface import LLMInterface\n",
"class ScoreSentimentAnalyser(LLMInterface):\n",
" def __init__(self, personality=PERSONALITY, number_of_jobs=64, number_of_meaures_to_valuate=64):\n",
" super().__init__(personality=personality)\n",
" self.number_of_jobs = number_of_jobs\n",
"\n",
" def convert_to_message(self, query):\n",
" return INTRO_QUARY +'\\n'+ query +'\\n'+ QUESTION\n",
"\n",
" def get_text_analysis(self, list_of_analysis):\n",
" def func(i):\n",
" analysis = list_of_analysis[i]\n",
" query = self.convert_to_message(analysis)\n",
" output = self.get_reponse(query)\n",
" return extract_senmtiment_score(output)\n",
"\n",
" with joblib.parallel_backend(\"threading\"):\n",
" output_analysis = [joblib.Parallel(n_jobs=self.number_of_jobs)(joblib.delayed(func)(i) for i in range(len(list_of_analysis)))]\n",
" return output_analysis"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f10c0a32",
"metadata": {},
"outputs": [],
"source": [
"analyzer = ScoreSentimentAnalyser()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "e3e683d5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Resuming from existing output file: Step3_output_article_response_original_3.json\n",
"Resuming from index 290 (checkpoint found)\n"
]
}
],
"source": [
"import json\n",
"import os\n",
"\n",
"CHECKPOINT_FILE = 'checkpoint_original.txt'\n",
"OUTPUT_FILE = 'Step3_output_article_response_original_3.json'\n",
"\n",
"# 1. Load existing output if it exists (resume)\n",
"if os.path.exists(OUTPUT_FILE):\n",
" with open(OUTPUT_FILE, encoding='utf8') as f:\n",
" article_response = json.load(f)\n",
" print(f\"Resuming from existing output file: {OUTPUT_FILE}\")\n",
"else:\n",
" with open('step2-original.json', encoding='utf8') as f:\n",
" article_response = json.load(f)\n",
" print(\"Starting fresh from step2-original.json\")\n",
"\n",
"# 2. Read last processed index from checkpoint\n",
"start = 0\n",
"if os.path.exists(CHECKPOINT_FILE):\n",
" with open(CHECKPOINT_FILE, 'r') as f:\n",
" start = int(f.read().strip()) + 1\n",
" print(f\"Resuming from index {start} (checkpoint found)\")\n",
"\n",
"end = len(article_response)\n",
"\n",
"# 3. Process from start to end\n",
"for i in range(start, end):\n",
" try:\n",
" text = [l[2] for l in article_response[i]['response'][0]]\n",
" scores = [l[3] for l in article_response[i]['response'][0]] # not used later, but kept\n",
" res = analyzer.get_text_analysis(text)[0] # assumes res is list of same length as text\n",
" \n",
" # Update scores\n",
" for j in range(len(article_response[i]['response'][0])):\n",
" article_response[i]['response'][0][j][3] = res[j]\n",
" \n",
" # Save JSON after each successful update\n",
" with open(OUTPUT_FILE, 'w', encoding='utf8') as f:\n",
" json.dump(article_response, f, ensure_ascii=False)\n",
" \n",
" # Update checkpoint (last processed index)\n",
" with open(CHECKPOINT_FILE, 'w') as f:\n",
" f.write(str(i))\n",
" \n",
" print(f\"Processed and saved index {i}\")\n",
" \n",
" except Exception as e:\n",
" print(f\"Error at index {i}: {e}\")\n",
" # Do not update checkpoint next run will retry this index\n",
" break # stop the loop so you can investigate the error"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "271a77e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Resuming from existing output file: Step3_output_article_response_opposite_2.json\n",
"Processed and saved index 0\n",
"Processed and saved index 1\n",
"Processed and saved index 2\n",
"Processed and saved index 3\n",
"Processed and saved index 4\n",
"Processed and saved index 5\n",
"Processed and saved index 6\n",
"Processed and saved index 7\n",
"Processed and saved index 8\n",
"Processed and saved index 9\n",
"Processed and saved index 10\n",
"Processed and saved index 11\n",
"Processed and saved index 12\n",
"Processed and saved index 13\n",
"Processed and saved index 14\n",
"Processed and saved index 15\n",
"Processed and saved index 16\n",
"Processed and saved index 17\n",
"Processed and saved index 18\n",
"Processed and saved index 19\n",
"Processed and saved index 20\n",
"Processed and saved index 21\n",
"Processed and saved index 22\n",
"Processed and saved index 23\n",
"Processed and saved index 24\n",
"Processed and saved index 25\n",
"Processed and saved index 26\n",
"Processed and saved index 27\n",
"Processed and saved index 28\n",
"Processed and saved index 29\n",
"Processed and saved index 30\n",
"Processed and saved index 31\n",
"Processed and saved index 32\n",
"Processed and saved index 33\n",
"Processed and saved index 34\n",
"Processed and saved index 35\n",
"Processed and saved index 36\n",
"Processed and saved index 37\n",
"Processed and saved index 38\n",
"Processed and saved index 39\n",
"Processed and saved index 40\n",
"Processed and saved index 41\n",
"Processed and saved index 42\n",
"Processed and saved index 43\n",
"Processed and saved index 44\n",
"Processed and saved index 45\n",
"Processed and saved index 46\n",
"Processed and saved index 47\n",
"Processed and saved index 48\n",
"Processed and saved index 49\n",
"Processed and saved index 50\n",
"Processed and saved index 51\n",
"Processed and saved index 52\n",
"Processed and saved index 53\n",
"Processed and saved index 54\n",
"Processed and saved index 55\n",
"Processed and saved index 56\n",
"Processed and saved index 57\n",
"Processed and saved index 58\n",
"Processed and saved index 59\n",
"Processed and saved index 60\n",
"Processed and saved index 61\n",
"Processed and saved index 62\n",
"Processed and saved index 63\n",
"Processed and saved index 64\n",
"Processed and saved index 65\n",
"Processed and saved index 66\n",
"Processed and saved index 67\n",
"Processed and saved index 68\n",
"Processed and saved index 69\n",
"Processed and saved index 70\n",
"Processed and saved index 71\n",
"Processed and saved index 72\n",
"Processed and saved index 73\n",
"No code block or questions found.\n",
"None\n",
"Processed and saved index 74\n",
"Processed and saved index 75\n",
"Processed and saved index 76\n",
"Processed and saved index 77\n",
"Processed and saved index 78\n",
"Processed and saved index 79\n",
"Processed and saved index 80\n",
"Processed and saved index 81\n",
"Processed and saved index 82\n",
"Processed and saved index 83\n",
"Processed and saved index 84\n",
"Processed and saved index 85\n",
"Processed and saved index 86\n",
"Processed and saved index 87\n",
"Processed and saved index 88\n",
"Processed and saved index 89\n",
"Processed and saved index 90\n",
"Processed and saved index 91\n",
"Processed and saved index 92\n",
"Processed and saved index 93\n",
"Processed and saved index 94\n",
"Processed and saved index 95\n",
"Processed and saved index 96\n",
"Processed and saved index 97\n",
"Processed and saved index 98\n",
"Processed and saved index 99\n",
"Processed and saved index 100\n",
"Processed and saved index 101\n",
"Processed and saved index 102\n",
"Processed and saved index 103\n",
"Processed and saved index 104\n",
"Processed and saved index 105\n",
"Processed and saved index 106\n",
"Processed and saved index 107\n",
"Processed and saved index 108\n",
"Processed and saved index 109\n",
"Processed and saved index 110\n",
"Processed and saved index 111\n",
"Processed and saved index 112\n",
"Processed and saved index 113\n",
"Processed and saved index 114\n",
"Processed and saved index 115\n",
"Processed and saved index 116\n",
"Processed and saved index 117\n",
"Processed and saved index 118\n",
"Processed and saved index 119\n",
"Processed and saved index 120\n",
"Processed and saved index 121\n",
"Processed and saved index 122\n",
"Processed and saved index 123\n",
"Processed and saved index 124\n",
"Processed and saved index 125\n",
"Processed and saved index 126\n",
"Processed and saved index 127\n",
"Processed and saved index 128\n",
"Processed and saved index 129\n",
"Processed and saved index 130\n",
"Processed and saved index 131\n",
"Processed and saved index 132\n",
"Processed and saved index 133\n",
"Processed and saved index 134\n",
"Processed and saved index 135\n",
"Processed and saved index 136\n",
"Processed and saved index 137\n",
"Processed and saved index 138\n",
"Processed and saved index 139\n",
"Processed and saved index 140\n",
"Processed and saved index 141\n",
"Processed and saved index 142\n",
"Processed and saved index 143\n",
"Processed and saved index 144\n",
"Processed and saved index 145\n",
"Processed and saved index 146\n",
"Processed and saved index 147\n",
"Processed and saved index 148\n",
"Processed and saved index 149\n",
"Processed and saved index 150\n",
"Processed and saved index 151\n",
"Processed and saved index 152\n",
"Processed and saved index 153\n",
"Processed and saved index 154\n",
"Processed and saved index 155\n",
"Processed and saved index 156\n",
"Processed and saved index 157\n",
"Processed and saved index 158\n",
"Processed and saved index 159\n",
"Processed and saved index 160\n",
"Processed and saved index 161\n",
"Processed and saved index 162\n",
"Processed and saved index 163\n",
"Processed and saved index 164\n",
"Processed and saved index 165\n",
"Processed and saved index 166\n",
"Processed and saved index 167\n",
"Processed and saved index 168\n",
"Processed and saved index 169\n",
"Processed and saved index 170\n",
"Processed and saved index 171\n",
"Processed and saved index 172\n",
"Processed and saved index 173\n",
"Processed and saved index 174\n",
"Processed and saved index 175\n",
"Processed and saved index 176\n",
"Processed and saved index 177\n",
"Processed and saved index 178\n",
"Processed and saved index 179\n",
"Processed and saved index 180\n",
"Processed and saved index 181\n",
"Processed and saved index 182\n",
"Processed and saved index 183\n",
"Processed and saved index 184\n",
"Processed and saved index 185\n",
"Processed and saved index 186\n",
"Processed and saved index 187\n",
"Processed and saved index 188\n",
"Processed and saved index 189\n",
"Processed and saved index 190\n",
"Processed and saved index 191\n",
"Processed and saved index 192\n",
"Processed and saved index 193\n",
"Processed and saved index 194\n",
"Processed and saved index 195\n",
"Processed and saved index 196\n",
"Processed and saved index 197\n",
"Processed and saved index 198\n",
"Processed and saved index 199\n",
"Processed and saved index 200\n",
"Processed and saved index 201\n",
"Processed and saved index 202\n",
"Processed and saved index 203\n",
"Processed and saved index 204\n",
"Processed and saved index 205\n",
"Processed and saved index 206\n",
"Processed and saved index 207\n",
"Processed and saved index 208\n",
"Processed and saved index 209\n",
"Processed and saved index 210\n",
"Processed and saved index 211\n",
"Processed and saved index 212\n",
"Processed and saved index 213\n",
"Processed and saved index 214\n",
"Processed and saved index 215\n",
"Processed and saved index 216\n",
"Processed and saved index 217\n",
"Processed and saved index 218\n",
"Processed and saved index 219\n",
"Processed and saved index 220\n",
"Processed and saved index 221\n",
"Processed and saved index 222\n",
"Processed and saved index 223\n",
"Processed and saved index 224\n",
"Processed and saved index 225\n",
"Processed and saved index 226\n",
"Processed and saved index 227\n",
"Processed and saved index 228\n",
"Processed and saved index 229\n",
"Processed and saved index 230\n",
"Processed and saved index 231\n",
"Processed and saved index 232\n",
"Processed and saved index 233\n",
"Processed and saved index 234\n",
"Processed and saved index 235\n",
"Processed and saved index 236\n",
"Processed and saved index 237\n",
"Processed and saved index 238\n",
"Processed and saved index 239\n",
"Processed and saved index 240\n",
"Processed and saved index 241\n",
"Processed and saved index 242\n",
"Processed and saved index 243\n",
"Processed and saved index 244\n",
"Processed and saved index 245\n",
"Processed and saved index 246\n",
"Processed and saved index 247\n",
"Processed and saved index 248\n",
"Processed and saved index 249\n",
"Processed and saved index 250\n",
"Processed and saved index 251\n",
"Processed and saved index 252\n",
"Processed and saved index 253\n",
"Processed and saved index 254\n",
"Processed and saved index 255\n",
"Processed and saved index 256\n",
"Processed and saved index 257\n",
"Processed and saved index 258\n",
"Processed and saved index 259\n",
"Processed and saved index 260\n",
"Processed and saved index 261\n",
"Processed and saved index 262\n",
"Processed and saved index 263\n",
"Processed and saved index 264\n",
"Processed and saved index 265\n",
"Processed and saved index 266\n",
"Processed and saved index 267\n",
"Processed and saved index 268\n",
"Processed and saved index 269\n",
"Processed and saved index 270\n",
"Processed and saved index 271\n",
"Processed and saved index 272\n",
"Processed and saved index 273\n",
"Processed and saved index 274\n",
"Processed and saved index 275\n",
"Processed and saved index 276\n",
"Processed and saved index 277\n",
"Processed and saved index 278\n",
"Processed and saved index 279\n",
"Processed and saved index 280\n",
"Processed and saved index 281\n",
"Processed and saved index 282\n",
"Processed and saved index 283\n",
"Processed and saved index 284\n",
"Processed and saved index 285\n",
"Processed and saved index 286\n",
"Processed and saved index 287\n",
"Processed and saved index 288\n",
"Processed and saved index 289\n",
"Processed and saved index 290\n",
"Processed and saved index 291\n",
"Processed and saved index 292\n",
"Processed and saved index 293\n",
"Processed and saved index 294\n",
"Processed and saved index 295\n",
"Processed and saved index 296\n",
"Processed and saved index 297\n",
"Processed and saved index 298\n",
"Processed and saved index 299\n"
]
}
],
"source": [
"import json\n",
"import os\n",
"\n",
"CHECKPOINT_FILE = 'checkpoint_opposite.txt'\n",
"OUTPUT_FILE = 'Step3_output_article_response_opposite_2.json'\n",
"\n",
"# 1. Load existing output if it exists (resume)\n",
"if os.path.exists(OUTPUT_FILE):\n",
" with open(OUTPUT_FILE, encoding='utf8') as f:\n",
" article_response = json.load(f)\n",
" print(f\"Resuming from existing output file: {OUTPUT_FILE}\")\n",
"else:\n",
" with open('step2-opposite.json', encoding='utf8') as f:\n",
" article_response = json.load(f)\n",
" print(\"Starting fresh from step2-opposite.json\")\n",
"\n",
"# 2. Read last processed index from checkpoint\n",
"start = 0\n",
"if os.path.exists(CHECKPOINT_FILE):\n",
" with open(CHECKPOINT_FILE, 'r') as f:\n",
" start = int(f.read().strip()) + 1\n",
" print(f\"Resuming from index {start} (checkpoint found)\")\n",
"\n",
"end = len(article_response)\n",
"\n",
"# 3. Process from start to end\n",
"for i in range(start, end):\n",
" try:\n",
" text = [l[2] for l in article_response[i]['response'][0]]\n",
" scores = [l[3] for l in article_response[i]['response'][0]]\n",
" res = analyzer.get_text_analysis(text)[0]\n",
" \n",
" for j in range(len(article_response[i]['response'][0])):\n",
" article_response[i]['response'][0][j][3] = res[j]\n",
" \n",
" # Save JSON incrementally\n",
" with open(OUTPUT_FILE, 'w', encoding='utf8') as f:\n",
" json.dump(article_response, f, ensure_ascii=False)\n",
" \n",
" # Update checkpoint\n",
" with open(CHECKPOINT_FILE, 'w') as f:\n",
" f.write(str(i))\n",
" \n",
" print(f\"Processed and saved index {i}\")\n",
" \n",
" except Exception as e:\n",
" print(f\"Error at index {i}: {e}\")\n",
" break"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}