571 lines
21 KiB
Plaintext
571 lines
21 KiB
Plaintext
{
|
||
"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
|
||
}
|