wcag_AI_validation/scripts/manage_mllm_response.ipynb

1433 lines
75 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "61ea49f8",
"metadata": {},
"source": [
"# 1) semantic, sparse, bertscore, lexical similarity between LLM on new_alt_text proposal "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d50c12ab",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\nicola\\anaconda3\\envs\\accessibility\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n"
]
}
],
"source": [
"import torch\n",
"import numpy as np\n",
"from transformers import BertTokenizer, BertModel\n",
"\n",
"def cosine_similarity(a, b):\n",
" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))\n",
"\n",
"\n",
"#funziona meglio che sentence_embeddings perchè il tokenizer skippa token speciali\n",
"def bert_score(reference, candidate, return_similarity_matrix=False):\n",
" \n",
" # Load the BERT tokenizer and model\n",
" tokenizer = BertTokenizer.from_pretrained(\"bert-base-uncased\")\n",
" model = BertModel.from_pretrained(\"bert-base-uncased\")\n",
" \n",
" # Tokenize the input text\n",
" ref_tokens = tokenizer(reference, return_tensors=\"pt\", add_special_tokens=False)#add_special_tokens=False mi evita codifica dei caratteri speciali\n",
" can_tokens = tokenizer(candidate, return_tensors=\"pt\", add_special_tokens=False)\n",
" print(\"ref_tokens:\",ref_tokens)\n",
" print(\"can_tokens:\",can_tokens)\n",
"\n",
" # Get the BERT embeddings\n",
" model.eval()\n",
" with torch.no_grad():\n",
" ref_outputs = model(**ref_tokens)\n",
" ref_embeddings = ref_outputs.last_hidden_state[0]\n",
"\n",
" can_outputs = model(**can_tokens)\n",
" can_embeddings = can_outputs.last_hidden_state[0]\n",
" #print(\"can_embeddings:\",can_embeddings,can_embeddings.shape)\n",
" \n",
" # Compute cosine similarities\n",
" cosine_similarities = np.zeros((can_embeddings.shape[0], ref_embeddings.shape[0]))\n",
" for i, c in enumerate(can_embeddings):\n",
" for j, r in enumerate(ref_embeddings):\n",
" cosine_similarities[i, j] = cosine_similarity(c, r)\n",
" \n",
"\n",
" # Align cosine similarities\n",
" max_similarities = cosine_similarities.max(axis=1)\n",
"\n",
" # Average similarity scores\n",
" bertscore = max_similarities.mean()\n",
"\n",
" if return_similarity_matrix:\n",
" return bertscore, cosine_similarities\n",
" else:\n",
" return bertscore"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "83aeef57",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"def preprocess_text(text):\n",
" # Lowercase the text\n",
" text = text.lower()\n",
" # Remove punctuation\n",
" text = re.sub(r'[^\\w\\s]', '', text)\n",
" return text"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a14006c3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ref_tokens: {'input_ids': tensor([[3899]]), 'token_type_ids': tensor([[0]]), 'attention_mask': tensor([[1]])}\n",
"can_tokens: {'input_ids': tensor([[29145]]), 'token_type_ids': tensor([[0]]), 'attention_mask': tensor([[1]])}\n",
"0.4610232412815094\n",
"[[0.46102324]]\n",
"(1, 1)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\nicola\\AppData\\Local\\Temp\\ipykernel_20916\\1344219625.py:6: DeprecationWarning: __array__ implementation doesn't accept a copy keyword, so passing copy=False failed. __array__ must implement 'dtype' and 'copy' keyword arguments. To learn more, see the migration guide https://numpy.org/devdocs/numpy_2_0_migration_guide.html#adapting-to-changes-in-the-copy-keyword\n",
" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))\n"
]
}
],
"source": [
"#just a test\n",
"bertscore, sim_matrix=bert_score(\"dog\", \"zebra\",return_similarity_matrix=True)\n",
"print(bertscore)\n",
"print(sim_matrix)\n",
"print(sim_matrix.shape)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "239aa298",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "cf109d62",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>image_url</th>\n",
" <th>alt_text</th>\n",
" <th>mllm_response</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/fd...</td>\n",
" <td>A shot through a window of a wasteland in Pokr...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/72...</td>\n",
" <td>A man in a Caracas market speaks while holding...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>https://ichef.bbci.co.uk/ace/standard/480/cpsp...</td>\n",
" <td>A man stands in a pile of rubble with a damage...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>A collage showing a man in a suit with a newsp...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/2b...</td>\n",
" <td>A composite image of Rupert Grint as an adult,...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>The Global Story, The Global Story, Is there a...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>https://ichef.bbci.co.uk/news/1024/cpsprodpb/3...</td>\n",
" <td>The pink facade of the Saudades art deco-style...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/66...</td>\n",
" <td>Lando Norris speaking to Max Verstappen after ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/10...</td>\n",
" <td>The Northern Lights snake across the curvature...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/e1...</td>\n",
" <td>A woman cries as she holds her injured child, ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" image_url \\\n",
"0 https://ichef.bbci.co.uk/news/480/cpsprodpb/fd... \n",
"1 https://ichef.bbci.co.uk/news/480/cpsprodpb/72... \n",
"2 https://ichef.bbci.co.uk/ace/standard/480/cpsp... \n",
"3 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"4 https://ichef.bbci.co.uk/news/480/cpsprodpb/2b... \n",
"5 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"6 https://ichef.bbci.co.uk/news/1024/cpsprodpb/3... \n",
"7 https://ichef.bbci.co.uk/news/480/cpsprodpb/66... \n",
"8 https://ichef.bbci.co.uk/news/480/cpsprodpb/10... \n",
"9 https://ichef.bbci.co.uk/news/480/cpsprodpb/e1... \n",
"\n",
" alt_text \\\n",
"0 A shot through a window of a wasteland in Pokr... \n",
"1 A man in a Caracas market speaks while holding... \n",
"2 A man stands in a pile of rubble with a damage... \n",
"3 A collage showing a man in a suit with a newsp... \n",
"4 A composite image of Rupert Grint as an adult,... \n",
"5 The Global Story, The Global Story, Is there a... \n",
"6 The pink facade of the Saudades art deco-style... \n",
"7 Lando Norris speaking to Max Verstappen after ... \n",
"8 The Northern Lights snake across the curvature... \n",
"9 A woman cries as she holds her injured child, ... \n",
"\n",
" mllm_response \n",
"0 {'original_alt_text_assessment': '4', 'assessm... \n",
"1 {'original_alt_text_assessment': '4', 'assessm... \n",
"2 {'original_alt_text_assessment': '4', 'assessm... \n",
"3 {'original_alt_text_assessment': '4', 'assessm... \n",
"4 {'original_alt_text_assessment': '3', 'assessm... \n",
"5 {'original_alt_text_assessment': '3', 'assessm... \n",
"6 {'original_alt_text_assessment': '2', 'assessm... \n",
"7 {'original_alt_text_assessment': '4', 'assessm... \n",
"8 {'original_alt_text_assessment': '4', 'assessm... \n",
"9 {'original_alt_text_assessment': '4', 'assessm... "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_mllm_response=pd.read_json(\"C:\\cartella_condivisa\\MachineLearning\\HIISlab\\\\accessibility\\\\notebook_miei\\LLM_accessibility_validator\\outputs\\https_www.bbc.com_gemma3-4b_2025_11_23-09_45_08\\mllm_alttext_assessments.json\")\n",
"df_mllm_response"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "42e9a488",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'original_alt_text_assessment': '4',\n",
" 'assessment': 'failure',\n",
" 'evaluation_result': \"The alt-text accurately describes the image content but lacks context. While 'A shot through a window of a wasteland in Pokrovsk' is technically correct, it doesn't convey the significance of the image within the article. The image depicts the devastation caused by the conflict in Pokrovsk, highlighting the ongoing war and the challenges faced by Ukrainian troops. The alt-text should reflect this broader context. Its a descriptive caption, not an informative alt-text.\",\n",
" 'new_alt_text': 'Devastation in Pokrovsk, Ukraine - a city under siege during the ongoing conflict.'}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_mllm_response.iloc[0]['mllm_response']"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "15ae0f66",
"metadata": {},
"outputs": [],
"source": [
"def apply_parser_to_dataframe(df, column_name='mllm_response'):\n",
" \"\"\"\n",
" Apply the MLLM response parser to a dataframe column and expand results into separate columns.\n",
" \n",
" Args:\n",
" df (pd.DataFrame): The input dataframe\n",
" column_name (str): Name of the column containing MLLM responses\n",
" \n",
" Returns:\n",
" pd.DataFrame: Dataframe with additional columns for parsed attributes\n",
" \"\"\"\n",
" # Apply the parsing function to each row\n",
" #parsed_results = df[column_name].apply(parse_mllm_alt_text_response) #skipped because already parsed\n",
" parsed_results = df[column_name]\n",
" \n",
" # Convert the list of dictionaries to a DataFrame\n",
" parsed_df = pd.DataFrame(parsed_results.tolist())\n",
" \n",
" # Concatenate with the original dataframe\n",
" result_df = pd.concat([df, parsed_df], axis=1)\n",
" \n",
" return result_df"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "2639f30a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>image_url</th>\n",
" <th>alt_text</th>\n",
" <th>mllm_response</th>\n",
" <th>original_alt_text_assessment</th>\n",
" <th>assessment</th>\n",
" <th>evaluation_result</th>\n",
" <th>new_alt_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/fd...</td>\n",
" <td>A shot through a window of a wasteland in Pokr...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text accurately describes the image co...</td>\n",
" <td>Devastation in Pokrovsk, Ukraine - a city unde...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/72...</td>\n",
" <td>A man in a Caracas market speaks while holding...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text accurately describes the image co...</td>\n",
" <td>Man in Caracas market speaks about rising food...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>https://ichef.bbci.co.uk/ace/standard/480/cpsp...</td>\n",
" <td>A man stands in a pile of rubble with a damage...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text describes the scene accurately bu...</td>\n",
" <td>Ukraine: Man surveys damage after missile stri...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>A collage showing a man in a suit with a newsp...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is not appropriate. The image dep...</td>\n",
" <td>Satirical depiction of information overload an...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/2b...</td>\n",
" <td>A composite image of Rupert Grint as an adult,...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>failure</td>\n",
" <td>The alt-text A composite image of Rupert Grin...</td>\n",
" <td>Rupert Grint: Ron Weasley adult and child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>The Global Story, The Global Story, Is there a...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is overly verbose and doesn't acc...</td>\n",
" <td>Protest demonstration.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>https://ichef.bbci.co.uk/news/1024/cpsprodpb/3...</td>\n",
" <td>The pink facade of the Saudades art deco-style...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" <td>2</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is inappropriate. The image depic...</td>\n",
" <td>Art Deco building facade in Mumbai, India.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/66...</td>\n",
" <td>Lando Norris speaking to Max Verstappen after ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is overly specific and doesn't ac...</td>\n",
" <td>Lando Norris speaking to Max Verstappen after ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/10...</td>\n",
" <td>The Northern Lights snake across the curvature...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is not appropriate. While it desc...</td>\n",
" <td>NASA astronaut's footage of the Northern Light...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/e1...</td>\n",
" <td>A woman cries as she holds her injured child, ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is overly descriptive and verbose...</td>\n",
" <td>Israeli strikes in Gaza a woman holds her cr...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" image_url \\\n",
"0 https://ichef.bbci.co.uk/news/480/cpsprodpb/fd... \n",
"1 https://ichef.bbci.co.uk/news/480/cpsprodpb/72... \n",
"2 https://ichef.bbci.co.uk/ace/standard/480/cpsp... \n",
"3 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"4 https://ichef.bbci.co.uk/news/480/cpsprodpb/2b... \n",
"5 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"6 https://ichef.bbci.co.uk/news/1024/cpsprodpb/3... \n",
"7 https://ichef.bbci.co.uk/news/480/cpsprodpb/66... \n",
"8 https://ichef.bbci.co.uk/news/480/cpsprodpb/10... \n",
"9 https://ichef.bbci.co.uk/news/480/cpsprodpb/e1... \n",
"\n",
" alt_text \\\n",
"0 A shot through a window of a wasteland in Pokr... \n",
"1 A man in a Caracas market speaks while holding... \n",
"2 A man stands in a pile of rubble with a damage... \n",
"3 A collage showing a man in a suit with a newsp... \n",
"4 A composite image of Rupert Grint as an adult,... \n",
"5 The Global Story, The Global Story, Is there a... \n",
"6 The pink facade of the Saudades art deco-style... \n",
"7 Lando Norris speaking to Max Verstappen after ... \n",
"8 The Northern Lights snake across the curvature... \n",
"9 A woman cries as she holds her injured child, ... \n",
"\n",
" mllm_response \\\n",
"0 {'original_alt_text_assessment': '4', 'assessm... \n",
"1 {'original_alt_text_assessment': '4', 'assessm... \n",
"2 {'original_alt_text_assessment': '4', 'assessm... \n",
"3 {'original_alt_text_assessment': '4', 'assessm... \n",
"4 {'original_alt_text_assessment': '3', 'assessm... \n",
"5 {'original_alt_text_assessment': '3', 'assessm... \n",
"6 {'original_alt_text_assessment': '2', 'assessm... \n",
"7 {'original_alt_text_assessment': '4', 'assessm... \n",
"8 {'original_alt_text_assessment': '4', 'assessm... \n",
"9 {'original_alt_text_assessment': '4', 'assessm... \n",
"\n",
" original_alt_text_assessment assessment \\\n",
"0 4 failure \n",
"1 4 failure \n",
"2 4 failure \n",
"3 4 failure \n",
"4 3 failure \n",
"5 3 failure \n",
"6 2 failure \n",
"7 4 failure \n",
"8 4 failure \n",
"9 4 failure \n",
"\n",
" evaluation_result \\\n",
"0 The alt-text accurately describes the image co... \n",
"1 The alt-text accurately describes the image co... \n",
"2 The alt-text describes the scene accurately bu... \n",
"3 The alt-text is not appropriate. The image dep... \n",
"4 The alt-text A composite image of Rupert Grin... \n",
"5 The alt-text is overly verbose and doesn't acc... \n",
"6 The alt-text is inappropriate. The image depic... \n",
"7 The alt-text is overly specific and doesn't ac... \n",
"8 The alt-text is not appropriate. While it desc... \n",
"9 The alt-text is overly descriptive and verbose... \n",
"\n",
" new_alt_text \n",
"0 Devastation in Pokrovsk, Ukraine - a city unde... \n",
"1 Man in Caracas market speaks about rising food... \n",
"2 Ukraine: Man surveys damage after missile stri... \n",
"3 Satirical depiction of information overload an... \n",
"4 Rupert Grint: Ron Weasley adult and child \n",
"5 Protest demonstration. \n",
"6 Art Deco building facade in Mumbai, India. \n",
"7 Lando Norris speaking to Max Verstappen after ... \n",
"8 NASA astronaut's footage of the Northern Light... \n",
"9 Israeli strikes in Gaza a woman holds her cr... "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_mllm_response_parsed=apply_parser_to_dataframe(df_mllm_response)\n",
"df_mllm_response_parsed"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "3a69075e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>image_url</th>\n",
" <th>alt_text</th>\n",
" <th>mllm_response</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/fd...</td>\n",
" <td>A shot through a window of a wasteland in Pokr...</td>\n",
" <td>{'original_alt_text_assessment': '5', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/72...</td>\n",
" <td>A man in a Caracas market speaks while holding...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>https://ichef.bbci.co.uk/ace/standard/480/cpsp...</td>\n",
" <td>A man stands in a pile of rubble with a damage...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>A collage showing a man in a suit with a newsp...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/2b...</td>\n",
" <td>A composite image of Rupert Grint as an adult,...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>The Global Story, The Global Story, Is there a...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>https://ichef.bbci.co.uk/news/1024/cpsprodpb/3...</td>\n",
" <td>The pink facade of the Saudades art deco-style...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/66...</td>\n",
" <td>Lando Norris speaking to Max Verstappen after ...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/10...</td>\n",
" <td>The Northern Lights snake across the curvature...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/e1...</td>\n",
" <td>A woman cries as she holds her injured child, ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" image_url \\\n",
"0 https://ichef.bbci.co.uk/news/480/cpsprodpb/fd... \n",
"1 https://ichef.bbci.co.uk/news/480/cpsprodpb/72... \n",
"2 https://ichef.bbci.co.uk/ace/standard/480/cpsp... \n",
"3 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"4 https://ichef.bbci.co.uk/news/480/cpsprodpb/2b... \n",
"5 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"6 https://ichef.bbci.co.uk/news/1024/cpsprodpb/3... \n",
"7 https://ichef.bbci.co.uk/news/480/cpsprodpb/66... \n",
"8 https://ichef.bbci.co.uk/news/480/cpsprodpb/10... \n",
"9 https://ichef.bbci.co.uk/news/480/cpsprodpb/e1... \n",
"\n",
" alt_text \\\n",
"0 A shot through a window of a wasteland in Pokr... \n",
"1 A man in a Caracas market speaks while holding... \n",
"2 A man stands in a pile of rubble with a damage... \n",
"3 A collage showing a man in a suit with a newsp... \n",
"4 A composite image of Rupert Grint as an adult,... \n",
"5 The Global Story, The Global Story, Is there a... \n",
"6 The pink facade of the Saudades art deco-style... \n",
"7 Lando Norris speaking to Max Verstappen after ... \n",
"8 The Northern Lights snake across the curvature... \n",
"9 A woman cries as she holds her injured child, ... \n",
"\n",
" mllm_response \n",
"0 {'original_alt_text_assessment': '5', 'assessm... \n",
"1 {'original_alt_text_assessment': '3', 'assessm... \n",
"2 {'original_alt_text_assessment': '3', 'assessm... \n",
"3 {'original_alt_text_assessment': '3', 'assessm... \n",
"4 {'original_alt_text_assessment': '4', 'assessm... \n",
"5 {'original_alt_text_assessment': '2', 'assessm... \n",
"6 {'original_alt_text_assessment': '2', 'assessm... \n",
"7 {'original_alt_text_assessment': '3', 'assessm... \n",
"8 {'original_alt_text_assessment': '4', 'assessm... \n",
"9 {'original_alt_text_assessment': '4', 'assessm... "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_mllm_response_1=pd.read_json(\"C:\\cartella_condivisa\\MachineLearning\\HIISlab\\\\accessibility\\\\notebook_miei\\LLM_accessibility_validator\\outputs\\https_www.bbc.com_gpt-4o_2025_11_23-09_47_49\\mllm_alttext_assessments.json\")\n",
"df_mllm_response_1"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "158aaea9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>image_url</th>\n",
" <th>alt_text</th>\n",
" <th>mllm_response</th>\n",
" <th>original_alt_text_assessment</th>\n",
" <th>assessment</th>\n",
" <th>evaluation_result</th>\n",
" <th>new_alt_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/fd...</td>\n",
" <td>A shot through a window of a wasteland in Pokr...</td>\n",
" <td>{'original_alt_text_assessment': '5', 'assessm...</td>\n",
" <td>5</td>\n",
" <td>success</td>\n",
" <td>The alt-text is appropriate as it provides a d...</td>\n",
" <td>Damaged homes and wasteland in Pokrovsk, Ukrai...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/72...</td>\n",
" <td>A man in a Caracas market speaks while holding...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>warning</td>\n",
" <td>The alt-text partially describes the image but...</td>\n",
" <td>Man in Caracas market holding coffee, represen...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>https://ichef.bbci.co.uk/ace/standard/480/cpsp...</td>\n",
" <td>A man stands in a pile of rubble with a damage...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>warning</td>\n",
" <td>The original alt-text provides descriptive det...</td>\n",
" <td>Destruction in Ukraine: rubble, burnt car, and...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>A collage showing a man in a suit with a newsp...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>warning</td>\n",
" <td>The alt-text describes the image but doesn't c...</td>\n",
" <td>Metaphor for restricted words on social media,...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/2b...</td>\n",
" <td>A composite image of Rupert Grint as an adult,...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>success</td>\n",
" <td>The alt-text appropriately identifies the imag...</td>\n",
" <td>Rupert Grint as an adult and child, reflecting...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>https://ichef.bbci.co.uk/images/ic/480x270/p0m...</td>\n",
" <td>The Global Story, The Global Story, Is there a...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" <td>2</td>\n",
" <td>failure</td>\n",
" <td>The original alt-text does not directly descri...</td>\n",
" <td>Protesters holding 'Trump Help!' and 'Refuge P...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>https://ichef.bbci.co.uk/news/1024/cpsprodpb/3...</td>\n",
" <td>The pink facade of the Saudades art deco-style...</td>\n",
" <td>{'original_alt_text_assessment': '2', 'assessm...</td>\n",
" <td>2</td>\n",
" <td>failure</td>\n",
" <td>The alt-text is inaccurate and does not match ...</td>\n",
" <td>Yellow art deco-style building in Mumbai's Ban...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/66...</td>\n",
" <td>Lando Norris speaking to Max Verstappen after ...</td>\n",
" <td>{'original_alt_text_assessment': '3', 'assessm...</td>\n",
" <td>3</td>\n",
" <td>warning</td>\n",
" <td>The alt-text describes the image content direc...</td>\n",
" <td>Lando Norris discussing post-race matters afte...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/10...</td>\n",
" <td>The Northern Lights snake across the curvature...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>success</td>\n",
" <td>The alt-text describes the image content effec...</td>\n",
" <td>Northern Lights over Earths curvature filmed ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>https://ichef.bbci.co.uk/news/480/cpsprodpb/e1...</td>\n",
" <td>A woman cries as she holds her injured child, ...</td>\n",
" <td>{'original_alt_text_assessment': '4', 'assessm...</td>\n",
" <td>4</td>\n",
" <td>success</td>\n",
" <td>The alt-text appropriately describes the emoti...</td>\n",
" <td>A crying mother holds her injured child in a G...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" image_url \\\n",
"0 https://ichef.bbci.co.uk/news/480/cpsprodpb/fd... \n",
"1 https://ichef.bbci.co.uk/news/480/cpsprodpb/72... \n",
"2 https://ichef.bbci.co.uk/ace/standard/480/cpsp... \n",
"3 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"4 https://ichef.bbci.co.uk/news/480/cpsprodpb/2b... \n",
"5 https://ichef.bbci.co.uk/images/ic/480x270/p0m... \n",
"6 https://ichef.bbci.co.uk/news/1024/cpsprodpb/3... \n",
"7 https://ichef.bbci.co.uk/news/480/cpsprodpb/66... \n",
"8 https://ichef.bbci.co.uk/news/480/cpsprodpb/10... \n",
"9 https://ichef.bbci.co.uk/news/480/cpsprodpb/e1... \n",
"\n",
" alt_text \\\n",
"0 A shot through a window of a wasteland in Pokr... \n",
"1 A man in a Caracas market speaks while holding... \n",
"2 A man stands in a pile of rubble with a damage... \n",
"3 A collage showing a man in a suit with a newsp... \n",
"4 A composite image of Rupert Grint as an adult,... \n",
"5 The Global Story, The Global Story, Is there a... \n",
"6 The pink facade of the Saudades art deco-style... \n",
"7 Lando Norris speaking to Max Verstappen after ... \n",
"8 The Northern Lights snake across the curvature... \n",
"9 A woman cries as she holds her injured child, ... \n",
"\n",
" mllm_response \\\n",
"0 {'original_alt_text_assessment': '5', 'assessm... \n",
"1 {'original_alt_text_assessment': '3', 'assessm... \n",
"2 {'original_alt_text_assessment': '3', 'assessm... \n",
"3 {'original_alt_text_assessment': '3', 'assessm... \n",
"4 {'original_alt_text_assessment': '4', 'assessm... \n",
"5 {'original_alt_text_assessment': '2', 'assessm... \n",
"6 {'original_alt_text_assessment': '2', 'assessm... \n",
"7 {'original_alt_text_assessment': '3', 'assessm... \n",
"8 {'original_alt_text_assessment': '4', 'assessm... \n",
"9 {'original_alt_text_assessment': '4', 'assessm... \n",
"\n",
" original_alt_text_assessment assessment \\\n",
"0 5 success \n",
"1 3 warning \n",
"2 3 warning \n",
"3 3 warning \n",
"4 4 success \n",
"5 2 failure \n",
"6 2 failure \n",
"7 3 warning \n",
"8 4 success \n",
"9 4 success \n",
"\n",
" evaluation_result \\\n",
"0 The alt-text is appropriate as it provides a d... \n",
"1 The alt-text partially describes the image but... \n",
"2 The original alt-text provides descriptive det... \n",
"3 The alt-text describes the image but doesn't c... \n",
"4 The alt-text appropriately identifies the imag... \n",
"5 The original alt-text does not directly descri... \n",
"6 The alt-text is inaccurate and does not match ... \n",
"7 The alt-text describes the image content direc... \n",
"8 The alt-text describes the image content effec... \n",
"9 The alt-text appropriately describes the emoti... \n",
"\n",
" new_alt_text \n",
"0 Damaged homes and wasteland in Pokrovsk, Ukrai... \n",
"1 Man in Caracas market holding coffee, represen... \n",
"2 Destruction in Ukraine: rubble, burnt car, and... \n",
"3 Metaphor for restricted words on social media,... \n",
"4 Rupert Grint as an adult and child, reflecting... \n",
"5 Protesters holding 'Trump Help!' and 'Refuge P... \n",
"6 Yellow art deco-style building in Mumbai's Ban... \n",
"7 Lando Norris discussing post-race matters afte... \n",
"8 Northern Lights over Earths curvature filmed ... \n",
"9 A crying mother holds her injured child in a G... "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_mllm_response_parsed_1=apply_parser_to_dataframe(df_mllm_response_1)\n",
"df_mllm_response_parsed_1"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "3992a33f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('Devastation in Pokrovsk, Ukraine - a city under siege during the ongoing conflict.',\n",
" \"Damaged homes and wasteland in Pokrovsk, Ukraine with smoke rising, highlighting war's impact on the city.\")"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reference=df_mllm_response_parsed[\"new_alt_text\"].iloc[0]\n",
"candidate=df_mllm_response_parsed_1[\"new_alt_text\"].iloc[0]\n",
"reference,candidate"
]
},
{
"cell_type": "markdown",
"id": "a72020fc",
"metadata": {},
"source": [
"# semantic similarity (bertscore)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c1dad7b8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ref_tokens: {'input_ids': tensor([[25594, 1999, 13433, 21638, 4492, 6711, 1010, 5924, 1011, 1037,\n",
" 2103, 2104, 6859, 2076, 1996, 7552, 4736, 1012]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}\n",
"can_tokens: {'input_ids': tensor([[ 5591, 5014, 1998, 5949, 3122, 1999, 13433, 21638, 4492, 6711,\n",
" 1010, 5924, 2007, 5610, 4803, 1010, 20655, 2162, 1005, 1055,\n",
" 4254, 2006, 1996, 2103, 1012]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1]])}\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\nicola\\AppData\\Local\\Temp\\ipykernel_20916\\1344219625.py:6: DeprecationWarning: __array__ implementation doesn't accept a copy keyword, so passing copy=False failed. __array__ must implement 'dtype' and 'copy' keyword arguments. To learn more, see the migration guide https://numpy.org/devdocs/numpy_2_0_migration_guide.html#adapting-to-changes-in-the-copy-keyword\n",
" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))\n"
]
},
{
"data": {
"text/plain": [
"np.float64(0.5812176442146302)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bertscore =bert_score(reference, candidate,return_similarity_matrix=False)\n",
"bertscore"
]
},
{
"cell_type": "markdown",
"id": "e901f280",
"metadata": {},
"source": [
"## lexical similarity"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "1c2d1cff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1. , 0.70703788],\n",
" [0.70703788, 1. ]])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics.pairwise import cosine_similarity as cosine_similarity_sklearn\n",
"text=[reference,candidate]\n",
"# Vectorize the text data\n",
"vectorizer = TfidfVectorizer(stop_words=None, analyzer='char', ngram_range=(1, 3))\n",
"tfidf_matrix = vectorizer.fit_transform(text)\n",
"# Compute cosine similarity between each pair of entries\n",
"cos_sim_matrix = cosine_similarity_sklearn(tfidf_matrix)\n",
"cos_sim_matrix"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "f2304218",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 278)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tfidf_matrix.shape"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d4afb728",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(0.7070378833564678)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cos_sim_lexical = cosine_similarity(tfidf_matrix[0].toarray().flatten(),tfidf_matrix[1].toarray().flatten())\n",
"cos_sim_lexical"
]
},
{
"cell_type": "markdown",
"id": "1bc19425",
"metadata": {},
"source": [
"## semantic similarity embeddings"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b6ff8518",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 768)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sentence_transformers import SentenceTransformer\n",
"model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')\n",
"embeddings = model.encode([reference, candidate],output_value=\"sentence_embedding\")# comando per estrarre un embedding solo media di tutti gli embedding delle parole\n",
" # \"token_embeddings\" comando per estrarre un embedding per ogni parola\n",
"embeddings.shape"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "6310f4b2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"None\n"
]
}
],
"source": [
"# per capire se usa default prompt_name per differenziare i task come modelli avanzati come gemma\n",
"print(model.default_prompt_name )"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "2eb31bbb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.9999995 , 0.82111526],\n",
" [0.82111526, 1. ]], dtype=float32)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cos_sim_matrix_emb = cosine_similarity_sklearn(embeddings)\n",
"cos_sim_matrix_emb"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "93a846e4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float32(0.8211156)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cos_sim_emb = cosine_similarity(embeddings[0],embeddings[1])\n",
"cos_sim_emb"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "a7cf3288",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor([[1.0000, 0.8211],\n",
" [0.8211, 1.0000]]),\n",
" 'cosine')"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# USING MODEL SIMILARITY METHOD\n",
"similarities = model.similarity(embeddings, embeddings)\n",
"similarities,model.similarity_fn_name"
]
},
{
"cell_type": "markdown",
"id": "2cfe315e",
"metadata": {},
"source": [
"## sparse encoder"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "a457ad0a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch.Size([2, 30522])\n",
"tensor([[1.0000, 0.6181],\n",
" [0.6181, 1.0000]])\n",
"Sparsity: 99.62%\n",
"Avg non-zero dimensions per embedding: 116.50\n"
]
}
],
"source": [
"from sentence_transformers import SparseEncoder\n",
"\n",
"# 1. Load a pretrained SparseEncoder model\n",
"model = SparseEncoder(\"naver/splade-cocondenser-ensembledistil\")\n",
"model.similarity_fn_name = \"cosine\" # set similarity function to cosine default is dot product\n",
"\n",
"# The sentences to encode\n",
"sentences = [reference, candidate]\n",
"\n",
"# 2. Calculate sparse embeddings by calling model.encode()\n",
"embeddings = model.encode(sentences)\n",
"print(embeddings.shape)\n",
"# [#, 30522] - sparse representation with vocabulary size dimensions\n",
"\n",
"# 3. Calculate the embedding similarities (using dot product by default)\n",
"similarities = model.similarity(embeddings, embeddings)\n",
"print(similarities)\n",
"# tensor()\n",
"\n",
"# 4. Check sparsity statistics\n",
"stats = SparseEncoder.sparsity(embeddings)\n",
"print(f\"Sparsity: {stats['sparsity_ratio']:.2%}\") # Typically >99% zeros\n",
"print(f\"Avg non-zero dimensions per embedding: {stats['active_dims']:.2f}\")"
]
},
{
"cell_type": "markdown",
"id": "326230d3",
"metadata": {},
"source": [
"# 2) Correlation analysis between LLM assessment response pairs"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "37b4d56b",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "75f16536",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([4, 4, 4, 4, 3, 3, 2, 4, 4, 4], [5, 3, 3, 3, 4, 2, 2, 3, 4, 4])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list1=df_mllm_response_parsed[\"original_alt_text_assessment\"].astype(int).tolist()\n",
"list2=df_mllm_response_parsed_1[\"original_alt_text_assessment\"].astype(int).tolist()\n",
"list1,list2"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "fa2837db",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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z549plOnTpn++c9/mhISEnSVfUVFhc0f36JFi0xfffWV6cSJE6YDBw6YHnvsMZOnp6fp8OHDNvcetuT46gwbNsz06KOP3jRuS++fovZdzf5S+6K+1+q5k5OT6euvvzbEOdjc47On86+lx2hP52BLjs/ezsFbuXG2lK2eh4SbW31TRG75sFyLQL3BasqepU8++cR077336h9A/fr10+sfWFJT4F566SVTUFCQnvY2atQovTaCvRxjRETELT9H/eNV1C/WMWPGmLp27ar/Mavtn3322ZvWqbDV45s3b55eK0a9f+o9UmvHJCcn2+R72NJ/o8eOHdPb1f3wtWRL75/yy1/+Uu+Dej/UPqnvteV+2/s52Nzjs6fzr6XHaE/nYEv/jdrTOdiUcGOr56GT+k/rXQcCAACwLmpuAACAoRBuAACAoRBuAACAoRBuAACAoRBuAACAoRBuAACAoRBuAACAoRBuAACAoRBuAOAuODk5yaZNm/geAjaEcAMATaA6casgM2/ePL5fgI0j3ADAHezbt09WrVolsbGxfK8AO0C4AdBqysrK5PHHHxcvLy8JCQmRt99+W0aOHGm+2lFZWSnPP/+8hIWF6W0GDRok27dvN3/+2rVrpXPnzrJlyxaJjIyUjh07yn/8x3/I5cuX5cMPP5QePXqIn5+f/O53v5Pq6mrz56nx//qv/5KZM2dKp06dJCIiQj777DMpKiqSKVOm6DEVTPbv32/+nOLiYpkxY4beF/X39O/fXz7++OObjqm8vFwf0+rVq/XffSt5eXkyfvx46dChg/Tq1Us+/fRT/lUBVkS4AdBq/vCHP8h3332ng0VSUpL861//kuTkZPPrc+bMkT179sj69evl0KFD8tOf/lTGjRsnx48fN2+jgsw777yjt9m6dasOP9OmTZMvvvhCP/7v//5PX0W5MUCoIPXggw9KSkqKTJw4UX7xi1/osPPEE0/ofbjnnnv087pewRUVFTJw4ED5/PPPJT09XX71q1/pz9m7d2+Drzt79mz99UaPHt3ocb/00kvy7//+73Lw4EEdhB577DE5evQo/7IAa2nVHuMAHFZpaanJzc3NtGHDBvPYxYsXTR07djTNnTvXdObMGZOLi4spJyenweeNGjXKNH/+fP3xmjVrVPIwZWZmml//9a9/rb9GWVmZeWzs2LF6vE5ERITpiSeeMD/Py8vTX+ell14yj+3Zs0ePqdcaM3HiRNMf//hH8/OPP/7YFBMTY7py5Yp+PmLECH0sltTX/M1vftNgbNCgQabnnnvujt8zAG3D1WqpCoChnDx5UqqqquSBBx4wj/n6+urbS0paWpq+lXTvvfc2+Dx1qyogIMD8XN0iUldZ6gQFBenbTurWkuVYYWFhg69jWQ+jXlfUraYbx9TnBQcH6315/fXX5ZNPPpGcnBy5evWq3hf19ytZWVkyd+5cfQXK09Pztsc+ZMiQm56npqbe4TsGoK0QbgC0C1W74uLiIgcOHNB/WrIMLm5ubg1eUzOUbjVWU1PTYMxyG/V6Y2N1n7ds2TJZsWKF/OlPf9IhSNUAqdogFXIUtZ8qCCUkJJi/hgpEO3fulHfffVcHoRuPA4BtINwAaBWqkFaFCTWzqHv37nqspKREfvzxR3nooYckPj5ehwMVGIYPH27177qqDVLFxqompy70qH2Njo7Wz0eNGqWvNll6+umnpW/fvvLiiy82CDbff/+9ruexfK6OF4B1EG4AtApvb2958skn5YUXXhB/f38JDAyUV155RZydnfVVE3U7ShXbqhCwfPly/ctfzWbatm2bvqWkinbbU58+fXRR8u7du/UsqP/5n/+RgoICc7hRxxMTE9Pgc9TVHXUL7cbxDRs2yH333SfDhg2Tv//977oo+f3332/X4wFQj9lSAFqNCgiq3mTSpEl6dpGavRQVFWWuWVmzZo0ON3/84x91Lc7UqVMbXOlpTwsXLtS3nMaOHaunq6s6HLU/LbFo0SI9u0uFtL/97W96SnldSALQ/pxUVbEV/l4ADuDSpUt6HRl1pWbWrFnW3h0ADoLbUgBajVpj5tixY3rGlKq3ee211/S4qm0BgPZCuAHQqt566y3JyMgQd3d3vUieWsivS5cufJcBtBtuSwEAAEOhoBgAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAABgK4QYAAIiR/H+IgsMl69rwLQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(list1, list2)\n",
"plt.plot(\n",
" np.unique(list1),\n",
" np.poly1d(np.polyfit(list1, list2, 1))(np.unique(list1))\n",
"\n",
")\n",
"plt.xlabel(\"gemma4b\")\n",
"plt.ylabel(\"gtp-4o\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "f5576a0a",
"metadata": {},
"source": [
"### Correlation Coefficients"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "51ad4f42",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Pearson</th>\n",
" <th>Spearman</th>\n",
" <th>Kendall Tau</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Results</th>\n",
" <td>0.53602</td>\n",
" <td>0.48319</td>\n",
" <td>0.422944</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Pearson Spearman Kendall Tau\n",
"Results 0.53602 0.48319 0.422944"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"from scipy.stats import spearmanr, kendalltau\n",
"\n",
"pearson_correlation = np.corrcoef(list1, list2)[0, 1]\n",
"spearman_correlation, _ = spearmanr(list1, list2)\n",
"kendall_tau_correlation, _ = kendalltau(list1, list2)\n",
"\n",
"correlation_table = pd.DataFrame({\n",
" \"Pearson\": [pearson_correlation],\n",
" \"Spearman\": [spearman_correlation],\n",
" \"Kendall Tau\": [kendall_tau_correlation]\n",
"}, index=['Results'])\n",
"\n",
"correlation_table"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "accessibility",
"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.10.19"
}
},
"nbformat": 4,
"nbformat_minor": 5
}