analisi test utente 03-2026
This commit is contained in:
parent
56e5a5a1e5
commit
96c8371c51
|
|
@ -0,0 +1,26 @@
|
|||
#per avere info su modello ollama da cli: ollama show <model-name> (--modelfile)
|
||||
# docker exec -it ollama ollama show gemma3:4b (--modelfile)
|
||||
|
||||
FROM ./gemma3-it-finetuned.gguf
|
||||
ADAPTER ./gemma3-it-visual-finetuned.gguf
|
||||
|
||||
# Set parameters
|
||||
PARAMETER temperature 1
|
||||
PARAMETER top_p 0.95
|
||||
PARAMETER top_k 64
|
||||
PARAMETER stop <end_of_turn>
|
||||
|
||||
# Set the prompt template (adjust based on your model)
|
||||
|
||||
|
||||
TEMPLATE """{{- range $i, $_ := .Messages }}
|
||||
{{- $last := eq (len (slice $.Messages $i)) 1 }}
|
||||
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
|
||||
{{ .Content }}<end_of_turn>
|
||||
{{ if $last }}<start_of_turn>model
|
||||
{{ end }}
|
||||
{{- else if eq .Role "assistant" }}<start_of_turn>model
|
||||
{{ .Content }}{{ if not $last }}<end_of_turn>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}"""
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#per avere info su modello ollama da cli: ollama show <model-name> (--modelfile)
|
||||
# docker exec -it ollama ollama show gemma3:4b (--modelfile)
|
||||
|
||||
FROM ./gemma3-it-finetuned_bf16.gguf
|
||||
ADAPTER ./gemma3-it-visual-finetuned_bf16.gguf
|
||||
|
||||
# Set parameters
|
||||
PARAMETER temperature 1
|
||||
PARAMETER top_p 0.95
|
||||
PARAMETER top_k 64
|
||||
PARAMETER stop <end_of_turn>
|
||||
|
||||
# Set the prompt template (adjust based on your model)
|
||||
|
||||
|
||||
TEMPLATE """{{- range $i, $_ := .Messages }}
|
||||
{{- $last := eq (len (slice $.Messages $i)) 1 }}
|
||||
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
|
||||
{{ .Content }}<end_of_turn>
|
||||
{{ if $last }}<start_of_turn>model
|
||||
{{ end }}
|
||||
{{- else if eq .Role "assistant" }}<start_of_turn>model
|
||||
{{ .Content }}{{ if not $last }}<end_of_turn>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}"""
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#per avere info su modello ollama da cli: ollama show <model-name> (--modelfile)
|
||||
# docker exec -it ollama ollama show gemma3:4b (--modelfile)
|
||||
|
||||
FROM ./gemma3-it-finetuned-siglip.gguf
|
||||
ADAPTER ./gemma3-it-visual-finetuned-siglip.gguf
|
||||
|
||||
# Set parameters
|
||||
PARAMETER temperature 1
|
||||
PARAMETER top_p 0.95
|
||||
PARAMETER top_k 64
|
||||
PARAMETER stop <end_of_turn>
|
||||
|
||||
# Set the prompt template (adjust based on your model)
|
||||
|
||||
|
||||
TEMPLATE """{{- range $i, $_ := .Messages }}
|
||||
{{- $last := eq (len (slice $.Messages $i)) 1 }}
|
||||
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
|
||||
{{ .Content }}<end_of_turn>
|
||||
{{ if $last }}<start_of_turn>model
|
||||
{{ end }}
|
||||
{{- else if eq .Role "assistant" }}<start_of_turn>model
|
||||
{{ .Content }}{{ if not $last }}<end_of_turn>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}"""
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#per avere info su modello ollama da cli: ollama show <model-name> (--modelfile)
|
||||
# docker exec -it ollama ollama show gemma3:4b (--modelfile)
|
||||
|
||||
FROM ./merged_model_google_gemma-3-4b-it
|
||||
|
||||
|
||||
# Set parameters
|
||||
PARAMETER temperature 1
|
||||
PARAMETER top_p 0.95
|
||||
PARAMETER top_k 64
|
||||
PARAMETER stop <end_of_turn>
|
||||
|
||||
# Set the prompt template (adjust based on your model)
|
||||
|
||||
|
||||
TEMPLATE """{{- range $i, $_ := .Messages }}
|
||||
{{- $last := eq (len (slice $.Messages $i)) 1 }}
|
||||
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
|
||||
{{ .Content }}<end_of_turn>
|
||||
{{ if $last }}<start_of_turn>model
|
||||
{{ end }}
|
||||
{{- else if eq .Role "assistant" }}<start_of_turn>model
|
||||
{{ .Content }}{{ if not $last }}<end_of_turn>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}"""
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#per avere info su modello ollama da cli: ollama show <model-name> (--modelfile)
|
||||
# docker exec -it ollama ollama show gemma3:4b (--modelfile)
|
||||
|
||||
FROM ./gemma3-it-finetuned_q8_0.gguf
|
||||
ADAPTER ./gemma3-it-visual-finetuned_q8_0.gguf
|
||||
|
||||
# Set parameters
|
||||
PARAMETER temperature 1
|
||||
PARAMETER top_p 0.95
|
||||
PARAMETER top_k 64
|
||||
PARAMETER stop <end_of_turn>
|
||||
|
||||
# Set the prompt template (adjust based on your model)
|
||||
|
||||
|
||||
TEMPLATE """{{- range $i, $_ := .Messages }}
|
||||
{{- $last := eq (len (slice $.Messages $i)) 1 }}
|
||||
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
|
||||
{{ .Content }}<end_of_turn>
|
||||
{{ if $last }}<start_of_turn>model
|
||||
{{ end }}
|
||||
{{- else if eq .Role "assistant" }}<start_of_turn>model
|
||||
{{ .Content }}{{ if not $last }}<end_of_turn>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}"""
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,441 @@
|
|||
import pandas as pd
|
||||
import json
|
||||
|
||||
|
||||
import json
|
||||
import time
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
import logging
|
||||
import os
|
||||
import requests
|
||||
import base64
|
||||
import re
|
||||
from PIL import Image
|
||||
import io
|
||||
import numpy as np
|
||||
|
||||
|
||||
|
||||
def call_API_urlibrequest(
|
||||
data={},
|
||||
verbose=False,
|
||||
url="",
|
||||
headers=[],
|
||||
method="post",
|
||||
base=2, # number of seconds to wait
|
||||
max_tries=3,
|
||||
):
|
||||
|
||||
if verbose:
|
||||
logging.info("input_data:%s", data)
|
||||
|
||||
# Allow multiple attempts to call the API incase of downtime.
|
||||
# Return provided response to user after 3 failed attempts.
|
||||
wait_seconds = [base**i for i in range(max_tries)]
|
||||
|
||||
for num_tries in range(max_tries):
|
||||
try:
|
||||
|
||||
if method == "get":
|
||||
|
||||
# Encode the parameters and append them to the URL
|
||||
query_string = urllib.parse.urlencode(data)
|
||||
|
||||
url_with_params = f"{url}?{query_string}"
|
||||
request = urllib.request.Request(url_with_params, method="GET")
|
||||
for ele in headers:
|
||||
|
||||
request.add_header(ele[0], ele[1])
|
||||
|
||||
elif method == "post":
|
||||
# Convert the dictionary to a JSON formatted string and encode it to bytes
|
||||
data_to_send = json.dumps(data).encode("utf-8")
|
||||
|
||||
request = urllib.request.Request(url, data=data_to_send, method="POST")
|
||||
for ele in headers:
|
||||
|
||||
request.add_header(ele[0], ele[1])
|
||||
else:
|
||||
return {"error_message": "method_not_allowed"}
|
||||
|
||||
# Send the request and capture the response
|
||||
|
||||
with urllib.request.urlopen(request, timeout=300) as response:
|
||||
# Read and decode the response
|
||||
|
||||
response_json = json.loads(response.read().decode("utf-8"))
|
||||
logging.info("response_json:%s", response_json)
|
||||
|
||||
logging.info("response.status_code:%s", response.getcode())
|
||||
return response_json
|
||||
|
||||
except Exception as e:
|
||||
|
||||
logging.error("error message:%s", e)
|
||||
response_json = {"error": e}
|
||||
|
||||
logging.info("num_tries:%s", num_tries)
|
||||
logging.info(
|
||||
"Waiting %s seconds before automatically trying again.",
|
||||
str(wait_seconds[num_tries]),
|
||||
)
|
||||
time.sleep(wait_seconds[num_tries])
|
||||
|
||||
logging.info(
|
||||
"Tried %s times to make API call to get a valid response object", max_tries
|
||||
)
|
||||
logging.info("Returning provided response")
|
||||
return response_json
|
||||
|
||||
|
||||
def parse_mllm_alt_text_response(mllm_response):
|
||||
"""
|
||||
Parse an MLLM response string and extract key attributes into a JSON object.
|
||||
|
||||
from mllm response like:
|
||||
```json\n{\n\"Original alt-text assessment\"... etc
|
||||
to a structured dictionary.
|
||||
|
||||
Args:
|
||||
mllm_response (str): The raw MLLM response text containing JSON data
|
||||
|
||||
Returns:
|
||||
dict: A dictionary containing the extracted attributes, or None if parsing fails
|
||||
"""
|
||||
try:
|
||||
# Handle NaN or None values
|
||||
if mllm_response is None or mllm_response == "":
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
# Extract JSON content between ```json and ``` markers
|
||||
json_match = re.search(r'```json\s*(.*?)\s*```', mllm_response, re.DOTALL)
|
||||
|
||||
if not json_match:
|
||||
# Try to find JSON without markdown code blocks
|
||||
json_match = re.search(r'\{.*\}', mllm_response, re.DOTALL)
|
||||
|
||||
if not json_match:
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
json_str = json_match.group(1) if '```json' in mllm_response else json_match.group(0)
|
||||
|
||||
# Parse the JSON string
|
||||
parsed_data = json.loads(json_str)
|
||||
|
||||
# Create a structured output with the key attributes
|
||||
result = {
|
||||
"original_alt_text_assessment": parsed_data.get("Original alt-text assessment", ""),
|
||||
"assessment": parsed_data.get("Assessment", ""),
|
||||
"evaluation_result": parsed_data.get("EvaluationResult", ""),
|
||||
"new_alt_text": parsed_data.get("New alt-text", "")
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"JSON parsing error: {e}")
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"Error parsing MLLM response: {e}")
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
def encode_image_from_url(image_url):
|
||||
response = requests.get(image_url)
|
||||
|
||||
# Open image and convert to RGB
|
||||
image = Image.open(io.BytesIO(response.content))
|
||||
|
||||
# Convert to RGB (handles RGBA, grayscale, etc.)
|
||||
if image.mode != 'RGB':
|
||||
image = image.convert('RGB')
|
||||
|
||||
# Save to bytes buffer
|
||||
buffer = io.BytesIO()
|
||||
image.save(buffer, format='PNG') # or 'JPEG'
|
||||
buffer.seek(0)
|
||||
|
||||
# Encode to base64
|
||||
return base64.b64encode(buffer.getvalue()).decode("utf-8")
|
||||
|
||||
|
||||
|
||||
|
||||
def encode_image_from_url_image_norm(image_url):
|
||||
response = requests.get(image_url)
|
||||
# Open image and convert to RGB
|
||||
image = Image.open(io.BytesIO(response.content))
|
||||
|
||||
# Convert to RGB (handles RGBA, grayscale, etc.)
|
||||
if image.mode != 'RGB':
|
||||
image = image.convert('RGB')
|
||||
|
||||
# 1. Resize to the model's native size (896x896)
|
||||
image = image.resize((896, 896), Image.Resampling.LANCZOS)
|
||||
|
||||
# 2. Convert to numpy and normalize to [-1, 1]
|
||||
# (pixel - 127.5) / 127.5 is the same as (pixel/255 - 0.5) / 0.5
|
||||
img_array = np.array(image).astype(np.float32)
|
||||
normalized_img = (img_array - 127.5) / 127.5
|
||||
|
||||
# 3. Convert back to an image to encode for base64
|
||||
# Note: We shift back to 0-255 because base64 expects standard image bytes
|
||||
# But by doing the resize/prep ourselves, we minimize Ollama's auto-processing
|
||||
final_img = Image.fromarray(((normalized_img + 1) * 127.5).astype(np.uint8))
|
||||
|
||||
buffer = io.BytesIO()
|
||||
final_img.save(buffer, format='PNG')
|
||||
#buffer.seek(0) No need to seek since we are using getvalue() which reads the entire buffer content
|
||||
return base64.b64encode(buffer.getvalue()).decode("utf-8")
|
||||
|
||||
|
||||
|
||||
#df_esercitazione = pd.read_csv("esercitazione_12_2025/dataset_esercitazione.csv",sep=";")
|
||||
df_esercitazione = pd.read_csv("DBtest_03_2026.csv",sep=";")
|
||||
# se voglio escludere utenti outlier
|
||||
import json
|
||||
#{"username": "EleonoraGalesso"}
|
||||
#{"username": "silviafajardo"}
|
||||
df_esercitazione =df_esercitazione[~df_esercitazione['user'].apply(lambda x: json.loads(x).get('username') in ['EleonoraGalesso', 'silviafajardo',None])]
|
||||
|
||||
|
||||
|
||||
openai_model=False
|
||||
openai_model_reasoning=False
|
||||
if openai_model:
|
||||
mllm_end_point = "https://hiis-accessibility-fonderia.cognitiveservices.azure.com/openai/deployments/gpt-4.1/chat/completions?api-version=2025-01-01-preview"#"https://hiis-accessibility-fonderia.cognitiveservices.azure.com/openai/deployments/gpt-4o-mini/chat/completions?api-version=2025-01-01-preview"#"https://hiis-accessibility-fonderia.cognitiveservices.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2025-01-01-preview"
|
||||
mllm_api_key = "4lwGUwrx7jsqdxESGBpN9wYYyLNsxzC2s8ZLQlZPCQUayDWuDo3NJQQJ99BKACfhMk5XJ3w3AAAAACOGs2uw"#"4lwGUwrx7jsqdxESGBpN9wYYyLNsxzC2s8ZLQlZPCQUayDWuDo3NJQQJ99BKACfhMk5XJ3w3AAAAACOGs2uw"#"4lwGUwrx7jsqdxESGBpN9wYYyLNsxzC2s8ZLQlZPCQUayDWuDo3NJQQJ99BKACfhMk5XJ3w3AAAAACOGs2uw"
|
||||
mllm_model_id = "gtp-4o"#"gpt-4.1"#"gpt-4o-mini"
|
||||
|
||||
elif openai_model_reasoning:
|
||||
mllm_end_point = "https://hiis-accessibility-fonderia.cognitiveservices.azure.com/openai/responses?api-version=2025-04-01-preview"
|
||||
mllm_api_key = "4lwGUwrx7jsqdxESGBpN9wYYyLNsxzC2s8ZLQlZPCQUayDWuDo3NJQQJ99BKACfhMk5XJ3w3AAAAACOGs2uw"
|
||||
mllm_model_id = "gpt-5-mini"#"o1"#"gpt-4.1"#"gpt-4o-mini"
|
||||
|
||||
else:
|
||||
mllm_end_point = "https://vgpu.hiis.cloud.isti.cnr.it/api/chat"
|
||||
mllm_api_key = "7122746edd8e53398ce4be0b08a822ef7ab5a4deeab54b5c7aa5e2fcf3766131"
|
||||
mllm_model_id ="gemma3:4b-it-fp16" #gemma3:4b-bf16-wcag"#"gemma3:4b-bf16-wcag-siglip"# #"gemma3:4b-wcag-hf" #"gemma3:4b-wcag"#"gemma3:4b-bf16-wcag"#"gemma3:4b-wcag" #"gemma3:4b-q8_0-wcag"#"gemma3:12b"
|
||||
|
||||
system_prompt = """You are a web accessibility evaluation tool. Your task is to evaluate if alterative text for
|
||||
images on webpages are appropriate according to WCAG guidelines. The alt-text should serve the same purpose and present
|
||||
the same information as the original image content. As a result, it is possible to remove the image content and replace it with the text alternative and no functionality or information would be lost. This text alternative should not necessarily describe the image content.
|
||||
It should serve the same purpose and convey the same information. This may sometimes result in a text alternative that looks like a description of the image content. But this would only be true if that was the best way to serve the same purpose.
|
||||
If possible, the short text alternative should completely convey the purpose and information. If it is not possible to do this in a short phrase or sentence, then the short text alternative should provide a brief overview of the information.
|
||||
The text alternative should be able to substitute for the image content. If the image content were removed from the page and substituted with the text, the page would still provide the same function and information. The text alternative would be brief but as informative as possible.
|
||||
In deciding what text to include in the alternative, it is often a good idea to consider the following questions:
|
||||
Why is this image content here?
|
||||
What information is it presenting?
|
||||
What purpose does it fulfill?
|
||||
If I could not use the image content, what words would I use to convey the same function and/or information?
|
||||
|
||||
When image content contains words that are important to understanding the content, the alt text should include those words.
|
||||
Decorative images don’t add information to the content of a page. For example, the information provided by the image might already be given using adjacent text, or the image might be included to make the website more visually attractive.
|
||||
In these cases, a null (empty) alt text should be provided (alt="") so that they can be ignored by assistive technologies, such as screen readers.
|
||||
|
||||
Follow these instructions carefully:
|
||||
1. You will be provided as input with the following:
|
||||
- The image found on the webpage.
|
||||
- The associated alternative text. When the alt-text is empty or absent, you will be explicitly informed.
|
||||
- The surrounding context of the image.
|
||||
- The page title, headings and the content of the “keywords” and “description” <meta> tag, if found.
|
||||
|
||||
2. Determine the function and purpose of the image by analyzing these elements. Take into account the purpose and function
|
||||
of the associated image by considering the page context. Check also if the image is, or is associated with, a link or a button,
|
||||
and consider this in your judgement. If the image contains text use that as part of the context.
|
||||
|
||||
3. Provide a final assessment judgment based on the following:
|
||||
- 'success' if you can assess with 'sufficient certainty' the alt-text is appropriate in relation to the image purpose,
|
||||
- 'failure' if you can assess with 'sufficient certainty' that the alt-text is NOT appropriate,
|
||||
- 'warning' if you cannot determine with 'sufficient certainty'.
|
||||
where the level of certainty goes from 1 to 100 and 'sufficient certainty' means > 80
|
||||
|
||||
4. The original alt-text assessment on a scale from 1 to 5, where 5 is the best score. Use an integer number only.
|
||||
|
||||
5. Provide a brief reasoning for your judgment. If the image contains text, write it verbatim.
|
||||
|
||||
6. Keep your response within 150 words.
|
||||
|
||||
7. Generate the new most appropriate alt-text given the context and the steps before. Keep this within 30 words. Use the same natural language (e.g., English, Spanish, Italian) as the original alt-text.
|
||||
|
||||
8. Here is the JSON format the results must have:
|
||||
```json{"Original alt-text assessment" : "*your original alt-text assessment*", "Assessment" : "*your assessment judgment*", "EvaluationResult": "*your response*", "New alt-text":"*new alt-text*"}```
|
||||
You MUST respond with ONLY a valid JSON array. No explanations, no comments, no markdown text outside the code block."""
|
||||
|
||||
|
||||
def call_llm_alt_text_assessment(mllm_end_point,original_alt_text,image_url,html_context,page_title,page_description,page_keywords,openai_model,system_prompt):
|
||||
|
||||
try:
|
||||
|
||||
if original_alt_text ==None or pd.isna(original_alt_text) :
|
||||
print("original_alt_text was nan:",original_alt_text)
|
||||
original_alt_text=''#'No alt-text found'
|
||||
alt_text = "Here is the alt-text of the image: " + original_alt_text
|
||||
image_URL = image_url
|
||||
HTML_context = (
|
||||
"Here is the surrounding HTML context of the element: "
|
||||
+ html_context
|
||||
)
|
||||
page_text = "Here is the content of the page: Title of the page: " + str(
|
||||
page_title
|
||||
)
|
||||
page_text = (
|
||||
page_text
|
||||
+ ", content of the <meta name='description'> tag: "
|
||||
+ str(page_description)
|
||||
)
|
||||
page_text = (
|
||||
page_text
|
||||
+ ", content of the <meta name='keywords'> tag: "
|
||||
+ str(page_keywords)
|
||||
)
|
||||
except Exception as e:
|
||||
print("exception on html context management:",e)
|
||||
if openai_model:# or openai_model_reasoning:
|
||||
user_prompt = [
|
||||
{"type": "text", "text": alt_text},
|
||||
{"type": "image_url", "image_url": {"url": image_URL}},
|
||||
{"type": "text", "text": HTML_context},
|
||||
{"type": "text", "text": page_text},
|
||||
]
|
||||
elif openai_model_reasoning:
|
||||
user_prompt = [
|
||||
{"type": "input_text", "text": alt_text},
|
||||
{"type": "input_image", "image_url": image_URL},
|
||||
{"type": "input_text", "text": HTML_context},
|
||||
{"type": "input_text", "text": page_text},
|
||||
]
|
||||
else:
|
||||
user_prompt = {
|
||||
"user_prompt": alt_text + " " + HTML_context + " " + page_text,
|
||||
#"image_base64": encode_image_from_url(image_URL), # commentato se non passo immagine
|
||||
}
|
||||
#print("user prompt:",user_prompt)
|
||||
if openai_model:
|
||||
print("Creating OpenAI format payload")
|
||||
payload = {
|
||||
"messages": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt},
|
||||
],
|
||||
"temperature": 0.7,
|
||||
"top_p": 0.95,
|
||||
"frequency_penalty": 0,
|
||||
"presence_penalty": 0,
|
||||
"max_tokens": 800,
|
||||
"stop": None,
|
||||
}
|
||||
elif openai_model_reasoning:
|
||||
print("Creating OpenAI reasoning format payload")
|
||||
payload = {
|
||||
"input": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt},
|
||||
],
|
||||
"model":mllm_model_id,
|
||||
"max_output_tokens": 800,
|
||||
"reasoning": {
|
||||
"effort": "low"}
|
||||
}
|
||||
|
||||
else: # ollama format
|
||||
model_id=mllm_model_id
|
||||
print("Creating alternative LLM format payload")
|
||||
payload = {
|
||||
"model": model_id,
|
||||
"stream": False,
|
||||
"messages": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{
|
||||
"role": "user",
|
||||
"content": user_prompt["user_prompt"],
|
||||
#"images": [user_prompt["image_base64"]], # commentato se non passo immagine
|
||||
},
|
||||
],
|
||||
"options": {
|
||||
#"seed": 123,
|
||||
"temperature": 0.7,
|
||||
"num_ctx": 8192, # max input token
|
||||
"num_predict": 800, # max output tokens
|
||||
"top_p": 0.95,
|
||||
#'top_k': -1, # ← Disable top_k filtering (match HF behavior)
|
||||
#'stop': ['<end_of_turn>','</s>'] #(match HF behavior)
|
||||
},
|
||||
}
|
||||
|
||||
headers = [
|
||||
["Content-Type", "application/json"],
|
||||
["Authorization", f"Bearer {mllm_api_key}"],
|
||||
]
|
||||
response = call_API_urlibrequest(
|
||||
url=mllm_end_point , headers=headers, data=payload
|
||||
)
|
||||
try:
|
||||
if openai_model:
|
||||
|
||||
model_response = response["choices"][0]["message"]["content"]
|
||||
elif openai_model_reasoning:
|
||||
model_response = response["output"][1]["content"][0]["text"]
|
||||
else:
|
||||
model_response = response["message"]["content"]
|
||||
|
||||
except Exception as e:
|
||||
print("Error getting model response:", e)
|
||||
model_response = {}
|
||||
parsed_resp = parse_mllm_alt_text_response(model_response)
|
||||
parsed_resp["model_id"]=mllm_model_id
|
||||
return parsed_resp
|
||||
|
||||
def process_row_safe(row):
|
||||
try:
|
||||
result = call_llm_alt_text_assessment(
|
||||
mllm_end_point=mllm_end_point,
|
||||
original_alt_text=row["original_alt_text"],
|
||||
image_url=row["image_url"],
|
||||
html_context=row["html_context"],
|
||||
page_title=row["page_title"],
|
||||
page_description=row["page_description"],
|
||||
page_keywords=row["page_keywords"],
|
||||
openai_model=openai_model,
|
||||
system_prompt=system_prompt
|
||||
)
|
||||
return pd.Series(result)
|
||||
except Exception as e:
|
||||
print(f"Error processing row {row.name}: {e}")
|
||||
return pd.Series({
|
||||
'original_alt_text_assessment': None,
|
||||
'assessment': None,
|
||||
'evaluation_result': None,
|
||||
'new_alt_text': None,
|
||||
'model_id':None
|
||||
})
|
||||
|
||||
# Apply and assign to new column names with prefix
|
||||
#df_esercitazione[['llm_assessment_3', 'llm_judgment_3', 'llm_evaluation_result_3', 'llm_alt_text_3','llm_model_3']] = df_esercitazione.head(5).apply(process_row_safe, axis=1)
|
||||
|
||||
df_esercitazione[['llm_assessment_3', 'llm_judgment_3', 'llm_evaluation_result_3', 'llm_alt_text_3','llm_model_3']] = df_esercitazione.apply(process_row_safe, axis=1)
|
||||
|
||||
df_esercitazione.to_csv("dataset_esercitazione_"+mllm_model_id.replace(":","_")+"_user_test_03_2026.csv",sep=";",index=False)
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,206 @@
|
|||
image_url;0
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/11++B3A2NEL._SS200_.png;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/51mF3c-BLpL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/51tjDtDQdWL._AC_UL320_.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61AwsD8HRNL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61VjM8Sd6kL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61W3TWy1saL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61ZdhggeA2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/718vjcPUeVL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/719IIjUk7OL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71B8kNOY6QL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71BOLmVEzVL._AC_SR322,134_CB1169409_QL70_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71DQLgstHML._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71F7R1VxgsL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71OtpMMoioL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71R794p1P1L._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71WLd1QvY6L._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71XnZF-ttkL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71jRRqvUsoL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71uADhIeHQL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71uq-Tvf8tL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71yRdxcWDrL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71z+szwVS1L._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71zlIHa43JL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/813ooP3m0cL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/815LMYMYgXL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/817Gjz-KM2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81FX07lfydL._AC_UL320_.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81HRFBWdOBL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81ID1sfFZxL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81Mda72AYOL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81W173Q69NL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81YrWAbNK2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81aJwmOgYSL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81eTAADrD4L._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81gjQpdliyL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81lrEj+5CPL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81yik1sHkcL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81yxyjNlCDL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91+XVxt0qhL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91Gd6Tf3ZwL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91rjiaOyWML._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/008-008-ap26059717007628.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117567-clean-reliantrobinlondoncapetown-vrtc-00-00-00-12-still001.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117871-minelayersstriaghofhormuz-clean-00-00-00-00-still001.jpg;16
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117887-joerogan-trump-iran-thumb-clean.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117894-dissentcrackdown-thumb.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117917-tischnygiants-thumb-clean0.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/2026-03-10t150127z-1377402233-rc2s9o8ka4ft-rtrmadp-3-iran-crisis-leader.JPG;11
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/260310-ati-robertirwin1-clean-thumb.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26067484115759-20260311143008704.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26069507892459.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26070848263445.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/arraydeployment.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/atlantis-hires-024-flat-edit-v2-copy-1.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-1433614455.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-2265466601.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-2265924275.jpg;10
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-1434807928.jpg;7
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-1848662716.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2160812639.jpg;13
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2168856012.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2177651050.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2198782453.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2219529296-20260311210338982.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2226239770-20260303221718957.jpg;17
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2234059973-20260311214538952.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2234190560.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2255435511.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2259341238-20260311200559984.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2263930943.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2265287549.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2265777714.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-622913572.jpg;10
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ghostelephants-36-courtesy-of-the-wilderness-project-archive.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/mixed.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/screenshot-2026-03-10-at-6-51-53-pm.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/screenshot-2026-03-11-at-3-40-55-pm.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/sr2-courtesy-of-tom-welsh-for-the-pritzker-architecture-prize.jpg;9
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/thumb-3-20260225204059793.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/thumbnail-kim-guns-nk-1-vrtc.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/vert-1-20260312090808081.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/NEWSLETTER_LIFESTYLE_LOGO-532x120.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/acq-2.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/airport-meal-voucher-drama-food-drink-1.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/americas-most-expensive-pizza-chains-2.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/bartender-wine-industry-downturn.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/bourbon-trump-tariffs.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/budapest-hungary-ancient-roman-pizza-food-drink-2.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/burger-king-patty-ai-1.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/chick-fil-a-sandwich-fries-chicken.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/coffee-shop-female-customer.gif;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/cruise-passenger-drinking.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-and-drink-bg-1280.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-drink-black-cherries-breast-cancer-study-mice-2.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-drink-cancer-preventing-healthy-foods-what-to-know-2.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/foodie.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/garden-hoe.gif;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(1).jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(2).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(3).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(4).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(5).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/jfk-jr-carolyn-bessette-kennedy-marriage1.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/jj-watt-houston-texans-tipping-debate.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/maine-avenue-fish-market-potomac-oysters.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/moe-momtazi-looks-up.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/rfk-sugary-cofffee-drinks-dunkin-starbucks-food-drink-1.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/steph-grasso-split-cooked-salmon.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/suzy-karadsheh-olive-oil-split.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/tipping-jar.gif;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/vaccine-marty-makary.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/woman-holding-hot-mug-tea.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/woman-putting-spinach-smoothie.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/2UB55n8WFnhcdcFQqzYQub-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/3iLiUVFx8sncQEnzFPD8hE-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/5BdJ4FkXHuit3LMYwmiNxB-450-80.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/7MsncjgVUQpPKLgeG7xoa9-450-80.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/7kJDueUYJVYTkJH38UuHPo-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/AAJ59DMXnNpt7mpWmh4Dzm-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/Dvf2V5cUHtcV6sf7m38HSQ-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/NJ5Hd675vr5zvWxpuZ2rvJ-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/RDEr3MZzWVDnXRKbFzLhPE-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/gKU9oNsfCUXydiKQFZn5yC-450-80.jpeg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/gwVZfGDoH4gbHJC74NxAka-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/o4HHzvcNZSRbjXpWMHzmJ6-415-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/pxWUkgwqmnQhYiRZUQPai6-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/sTenoWjZtGXYvD6uVwDYEZ-450-80.jpg;7
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/u43eWTJn8DpGki9c8QSSrN-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/u6iYoHMYax5KaGypJm5xVa-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/ue7MRnMbdy9Hoku8RZeahJ-450-80.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/xNWjTGpcHmjuaY35taLAij-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/xg9ByKvedo58ek7ACaewgW-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/13-nike-tennis-gifts-for-players-of-all-levels.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/8-best-yoga-gifts-by-nike.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+DF+WVN+GAME+JKT.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+DF+WVN+GAME+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+TF+SI+BRSH+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+TF+SI+BRSH+PO+HD.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+ACG+DFADV+SCNDSNRSE+5BF+SHRT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+ACG+SFADV+PHANTAZMA+JKT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+CLUB+ALUMNI+FT+SHORT.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+CLUB+WVN+CARGO+PANT+UF.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+COF+JSY+LS+FR+SP26.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+PAR+SHRT+AT+KNEE.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+STRDE+REALTREE+5BFSHRT.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+STRIDE+REALTREE+JKT.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+TCH+WVN+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+VLCTY+POLO+LS+SOLID.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DFADV+STRIDE+NVLTY+SS+TOP.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+TCH+FLC+JGGR+AMD+2K26.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+TCH+FLC+WR+FZ+JKT+AMD+26.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NP+DFADV+NPT+6+IN+SHORT.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NP+DFADV+NPT+SS+TOP.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+AIR+MAX+95+WVN+JKT.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+AIR+MAX+95+WVN+PANT.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+SS+MAX+90+TEE+FR+SP26.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+SS+MAX90+TEE+KGJ2.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/image.png;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-11-best-nike-gifts-for-cyclists.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-basketball-hoodies-to-shop-now.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-beach-gifts.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-gifts-for-triathletes.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-running-jackets-and-vests.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-winter-running-gear-by-nike-to-shop-now.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/what-should-men-wear-for-yoga.jpg;1
|
||||
https://media.wired.com/photos/68e030e70657e0c2fe68a56d/16:9/w_720%2Cc_limit/WIRED-AI-as_RELIGION_RED_ALT.jpg;3
|
||||
https://media.wired.com/photos/6938a1462c86f578e7dfdbb7/16:9/w_720%2Cc_limit/WTE%2520brain%2520gear.jpg;2
|
||||
https://media.wired.com/photos/696770c527e4d5dcaa4ce890/16:9/w_720%2Cc_limit/Pluribus_Photo_010804.jpg;1
|
||||
https://media.wired.com/photos/6967dd15f33351a63c751f1c/16:9/w_720%2Cc_limit/procrastinacion.jpg;1
|
||||
https://media.wired.com/photos/69690ee78f59220ea2e720b9/16:9/w_720%2Cc_limit/sci-openai-2220468498.jpg;2
|
||||
https://media.wired.com/photos/696a9c4d03c4086371484c67/16:9/w_720%2Cc_limit/WIRED-He-Jiankui-1.jpg;1
|
||||
https://media.wired.com/photos/6978ac336b7b849513b4eefc/16:9/w_720%2Cc_limit/012726_Right-Whales.jpg;1
|
||||
https://media.wired.com/photos/697b169865447f8ad5aa29e7/16:9/w_720%2Cc_limit/ScienceSourceImages_2524088_WebRes.jpg;1
|
||||
https://media.wired.com/photos/697cc8c5fec825eea30870e5/3:2/w_720%2Cc_limit/GettyImages-2257424044.jpg;2
|
||||
https://media.wired.com/photos/697d39dd288c1dafebd263ee/16:9/w_720%2Cc_limit/Using-Physics-to-Escape-Ice-Bowl-Science-2248980379.jpg;3
|
||||
https://media.wired.com/photos/698514546f54668694781045/16:9/w_720%2Cc_limit/sci-earth-magneticfield-1349223076.jpg;2
|
||||
https://media.wired.com/photos/6985ffc322e26927f08c23c1/16:9/w_720%2Cc_limit/sci-ny-datacenters-2163725750.jpg;1
|
||||
https://media.wired.com/photos/698b0ff7c15205b11b18c615/16:9/w_720%2Cc_limit/GettyImages-2260809279.jpg;2
|
||||
https://media.wired.com/photos/698bcacf1cd27f239f17a259/16:9/w_720%2Cc_limit/monje.jpg;2
|
||||
https://media.wired.com/photos/698dbacfd6bc30e8fe7c79aa/16:9/w_720%2Cc_limit/Zero%2520Point%2520Energy%2520cr-TK-Default.jpg;1
|
||||
https://media.wired.com/photos/6994a673e3c49810b386ab2d/16:9/w_720%2Cc_limit/021726_Data-Emissions-False.jpg;2
|
||||
https://media.wired.com/photos/69961d8b368f665536b3bb24/16:9/w_720%2Cc_limit/homepage-space-station.gif;3
|
||||
https://media.wired.com/photos/69977b3aacabb32f3cbd37c7/16:9/w_720%2Cc_limit/sci-space-data-1648725322.jpg;2
|
||||
https://media.wired.com/photos/69979d9efbb807f5f0a47e5c/16:9/w_720%2Cc_limit/Will-CDC-Ever-Get-a-Director-Science-2221384890.jpg;1
|
||||
https://media.wired.com/photos/6998701dc31375ebca5a4cab/16:9/w_720%2Cc_limit/GettyImages-2191227367.jpg;2
|
||||
https://media.wired.com/photos/699872684fbc7cc192b292e0/3:2/w_720%2Cc_limit/GettyImages-1345490899.jpg;4
|
||||
https://media.wired.com/photos/6998bf70862552e1c49a5c6c/3:2/w_720%2Cc_limit/GettyImages-2190593436.jpg;3
|
||||
https://media.wired.com/photos/699c2f4a78972f77e910da08/3:2/w_720%2Cc_limit/GettyImages-2258921729.jpg;4
|
||||
https://media.wired.com/photos/699c832687b4ddbea4d1c67a/16:9/w_720%2Cc_limit/022326_Science-UFO-Files-Dissapointment.jpg;1
|
||||
https://media.wired.com/photos/699dc7921ed484eb6c093656/16:9/w_720%2Cc_limit/GettyImages-622590238.jpg;1
|
||||
https://media.wired.com/photos/699f79c89c1839834b2d7742/16:9/w_720%2Cc_limit/Arctic-Circle-Next-Frontier-In-AI-Infrastructure-Wars-Business-2163338735.jpg;1
|
||||
https://media.wired.com/photos/69a058f77da3e019b30e91a8/16:9/w_1600%2Cc_limit/ScienceSourceImages_1730789.jpg;2
|
||||
https://media.wired.com/photos/69a1c00663d7023723a168ed/16:9/w_720%2Cc_limit/Rodney%2520Gorhman31%2520(2).jpg;1
|
||||
https://media.wired.com/photos/69a1fc5ccd255f245e966b8e/16:9/w_720%2Cc_limit/sci-artemis2-2256758081.jpg;2
|
||||
https://media.wired.com/photos/69a5818dfb8b2b3db6442eed/16:9/w_720%2Cc_limit/GettyImages-1250649650.jpg;2
|
||||
https://media.wired.com/photos/69a83a275e392b566b9b14c3/16:9/w_720%2Cc_limit/GettyImages-1339909058.jpg;1
|
||||
https://media.wired.com/photos/69a8428b8a849494479d35f1/16:9/w_720%2Cc_limit/GettyImages-629409489.jpg;3
|
||||
https://media.wired.com/photos/69a87016c7816c1e1584e8ee/3:2/w_720%2Cc_limit/Big-Tech-Signs-Nonbinding-White-House-Pledge-To-Protect-Consumers-From-Data-Centers-Science-2250991059.jpg;5
|
||||
https://media.wired.com/photos/69aa1cf123fe0f2f8bea6e65/16:9/w_720%2Cc_limit/Why-Can-a-Single-Train-Locomotives-Pull-So-Much-Weight_-Science-1865711837.jpg;2
|
||||
https://media.wired.com/photos/69ab02c4ae15bcb547e25ca5/16:9/w_720%2Cc_limit/GettyImages-1253877737.jpg;5
|
||||
https://media.wired.com/photos/69ab5a2715dae1d56d0bffb8/16:9/w_720%2Cc_limit/Why-MAHA-Is-Obsessed-With-Shared-Decision-Making-Science-2210910497.jpg;4
|
||||
https://media.wired.com/photos/69aebbb0ad83313d7f9d7cf9/16:9/w_640%2Ch_360%2Cc_limit/030926_Science-Sleep-Apnea-Tech.jpg;4
|
||||
https://media.wired.com/photos/69b00c9e772e2c790732bbac/16:9/w_720%2Cc_limit/GettyImages-183097875.jpg;1
|
||||
https://media.wired.com/photos/69b06741afd392d14ab2c8ea/16:9/w_640%2Ch_360%2Cc_limit/science_measles_GettyImages-2259641016.jpg;4
|
||||
|
|
|
@ -0,0 +1,206 @@
|
|||
page_url;image_url;0
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/11++B3A2NEL._SS200_.png;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/51mF3c-BLpL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/51tjDtDQdWL._AC_UL320_.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61AwsD8HRNL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61VjM8Sd6kL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61W3TWy1saL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/61ZdhggeA2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/718vjcPUeVL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/719IIjUk7OL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71B8kNOY6QL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71BOLmVEzVL._AC_SR322,134_CB1169409_QL70_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71DQLgstHML._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71F7R1VxgsL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71OtpMMoioL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71R794p1P1L._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71WLd1QvY6L._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71XnZF-ttkL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71jRRqvUsoL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71uADhIeHQL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71uq-Tvf8tL._AC_UL320_.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71yRdxcWDrL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71z+szwVS1L._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/71zlIHa43JL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/813ooP3m0cL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/815LMYMYgXL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/817Gjz-KM2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81FX07lfydL._AC_UL320_.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81HRFBWdOBL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81ID1sfFZxL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81Mda72AYOL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81W173Q69NL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81YrWAbNK2L._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81aJwmOgYSL._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81eTAADrD4L._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81gjQpdliyL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81lrEj+5CPL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81yik1sHkcL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/81yxyjNlCDL._AC_UL320_.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91+XVxt0qhL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91Gd6Tf3ZwL._AC_UL320_.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test.html;https://giove.isti.cnr.it/users/leonardi/Amazon_kitchen_user_test_files/91rjiaOyWML._AC_UL320_.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/008-008-ap26059717007628.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117567-clean-reliantrobinlondoncapetown-vrtc-00-00-00-12-still001.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117871-minelayersstriaghofhormuz-clean-00-00-00-00-still001.jpg;16
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117887-joerogan-trump-iran-thumb-clean.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117894-dissentcrackdown-thumb.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/117917-tischnygiants-thumb-clean0.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/2026-03-10t150127z-1377402233-rc2s9o8ka4ft-rtrmadp-3-iran-crisis-leader.JPG;11
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/260310-ati-robertirwin1-clean-thumb.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26067484115759-20260311143008704.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26069507892459.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ap26070848263445.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/arraydeployment.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/atlantis-hires-024-flat-edit-v2-copy-1.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-1433614455.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-2265466601.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/c-gettyimages-2265924275.jpg;10
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-1434807928.jpg;7
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-1848662716.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2160812639.jpg;13
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2168856012.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2177651050.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2198782453.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2219529296-20260311210338982.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2226239770-20260303221718957.jpg;17
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2234059973-20260311214538952.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2234190560.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2255435511.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2259341238-20260311200559984.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2263930943.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2265287549.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-2265777714.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/gettyimages-622913572.jpg;10
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/ghostelephants-36-courtesy-of-the-wilderness-project-archive.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/mixed.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/screenshot-2026-03-10-at-6-51-53-pm.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/screenshot-2026-03-11-at-3-40-55-pm.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/sr2-courtesy-of-tom-welsh-for-the-pritzker-architecture-prize.jpg;9
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/thumb-3-20260225204059793.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/thumbnail-kim-guns-nk-1-vrtc.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test.html;https://giove.isti.cnr.it/users/leonardi/CNN_Home_user_test_files/vert-1-20260312090808081.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/NEWSLETTER_LIFESTYLE_LOGO-532x120.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/acq-2.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/airport-meal-voucher-drama-food-drink-1.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/americas-most-expensive-pizza-chains-2.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/bartender-wine-industry-downturn.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/bourbon-trump-tariffs.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/budapest-hungary-ancient-roman-pizza-food-drink-2.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/burger-king-patty-ai-1.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/chick-fil-a-sandwich-fries-chicken.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/coffee-shop-female-customer.gif;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/cruise-passenger-drinking.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-and-drink-bg-1280.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-drink-black-cherries-breast-cancer-study-mice-2.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/food-drink-cancer-preventing-healthy-foods-what-to-know-2.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/foodie.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/garden-hoe.gif;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(1).jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(2).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(3).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(4).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image(5).jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/image.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/jfk-jr-carolyn-bessette-kennedy-marriage1.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/jj-watt-houston-texans-tipping-debate.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/maine-avenue-fish-market-potomac-oysters.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/moe-momtazi-looks-up.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/rfk-sugary-cofffee-drinks-dunkin-starbucks-food-drink-1.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/steph-grasso-split-cooked-salmon.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/suzy-karadsheh-olive-oil-split.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/tipping-jar.gif;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/vaccine-marty-makary.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/woman-holding-hot-mug-tea.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test.html;https://giove.isti.cnr.it/users/leonardi/Fox_News_user_test_files/woman-putting-spinach-smoothie.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/2UB55n8WFnhcdcFQqzYQub-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/3iLiUVFx8sncQEnzFPD8hE-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/5BdJ4FkXHuit3LMYwmiNxB-450-80.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/7MsncjgVUQpPKLgeG7xoa9-450-80.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/7kJDueUYJVYTkJH38UuHPo-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/AAJ59DMXnNpt7mpWmh4Dzm-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/Dvf2V5cUHtcV6sf7m38HSQ-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/NJ5Hd675vr5zvWxpuZ2rvJ-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/RDEr3MZzWVDnXRKbFzLhPE-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/gKU9oNsfCUXydiKQFZn5yC-450-80.jpeg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/gwVZfGDoH4gbHJC74NxAka-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/o4HHzvcNZSRbjXpWMHzmJ6-415-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/pxWUkgwqmnQhYiRZUQPai6-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/sTenoWjZtGXYvD6uVwDYEZ-450-80.jpg;7
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/u43eWTJn8DpGki9c8QSSrN-450-80.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/u6iYoHMYax5KaGypJm5xVa-450-80.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/ue7MRnMbdy9Hoku8RZeahJ-450-80.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/xNWjTGpcHmjuaY35taLAij-450-80.jpg;6
|
||||
https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test.html;https://giove.isti.cnr.it/users/leonardi/LiveScience_user_test_files/xg9ByKvedo58ek7ACaewgW-450-80.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/13-nike-tennis-gifts-for-players-of-all-levels.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/8-best-yoga-gifts-by-nike.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+DF+WVN+GAME+JKT.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+DF+WVN+GAME+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+TF+SI+BRSH+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/DB+M+NK+TF+SI+BRSH+PO+HD.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+ACG+DFADV+SCNDSNRSE+5BF+SHRT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+ACG+SFADV+PHANTAZMA+JKT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+CLUB+ALUMNI+FT+SHORT.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+CLUB+WVN+CARGO+PANT+UF.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+COF+JSY+LS+FR+SP26.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+PAR+SHRT+AT+KNEE.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+STRDE+REALTREE+5BFSHRT.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+STRIDE+REALTREE+JKT.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+TCH+WVN+PANT.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DF+VLCTY+POLO+LS+SOLID.png;6
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+DFADV+STRIDE+NVLTY+SS+TOP.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+TCH+FLC+JGGR+AMD+2K26.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NK+TCH+FLC+WR+FZ+JKT+AMD+26.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NP+DFADV+NPT+6+IN+SHORT.png;5
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NP+DFADV+NPT+SS+TOP.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+AIR+MAX+95+WVN+JKT.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+AIR+MAX+95+WVN+PANT.png;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+SS+MAX+90+TEE+FR+SP26.png;3
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/M+NSW+SS+MAX90+TEE+KGJ2.png;4
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/image.png;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-11-best-nike-gifts-for-cyclists.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-basketball-hoodies-to-shop-now.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-beach-gifts.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-gifts-for-triathletes.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-nike-running-jackets-and-vests.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/the-best-winter-running-gear-by-nike-to-shop-now.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test.html;https://giove.isti.cnr.it/users/leonardi/Nike_men_user_test_files/what-should-men-wear-for-yoga.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/68e030e70657e0c2fe68a56d/16:9/w_720%2Cc_limit/WIRED-AI-as_RELIGION_RED_ALT.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6938a1462c86f578e7dfdbb7/16:9/w_720%2Cc_limit/WTE%2520brain%2520gear.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/696770c527e4d5dcaa4ce890/16:9/w_720%2Cc_limit/Pluribus_Photo_010804.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6967dd15f33351a63c751f1c/16:9/w_720%2Cc_limit/procrastinacion.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69690ee78f59220ea2e720b9/16:9/w_720%2Cc_limit/sci-openai-2220468498.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/696a9c4d03c4086371484c67/16:9/w_720%2Cc_limit/WIRED-He-Jiankui-1.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6978ac336b7b849513b4eefc/16:9/w_720%2Cc_limit/012726_Right-Whales.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/697b169865447f8ad5aa29e7/16:9/w_720%2Cc_limit/ScienceSourceImages_2524088_WebRes.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/697cc8c5fec825eea30870e5/3:2/w_720%2Cc_limit/GettyImages-2257424044.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/697d39dd288c1dafebd263ee/16:9/w_720%2Cc_limit/Using-Physics-to-Escape-Ice-Bowl-Science-2248980379.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/698514546f54668694781045/16:9/w_720%2Cc_limit/sci-earth-magneticfield-1349223076.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6985ffc322e26927f08c23c1/16:9/w_720%2Cc_limit/sci-ny-datacenters-2163725750.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/698b0ff7c15205b11b18c615/16:9/w_720%2Cc_limit/GettyImages-2260809279.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/698bcacf1cd27f239f17a259/16:9/w_720%2Cc_limit/monje.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/698dbacfd6bc30e8fe7c79aa/16:9/w_720%2Cc_limit/Zero%2520Point%2520Energy%2520cr-TK-Default.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6994a673e3c49810b386ab2d/16:9/w_720%2Cc_limit/021726_Data-Emissions-False.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69961d8b368f665536b3bb24/16:9/w_720%2Cc_limit/homepage-space-station.gif;3
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69977b3aacabb32f3cbd37c7/16:9/w_720%2Cc_limit/sci-space-data-1648725322.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69979d9efbb807f5f0a47e5c/16:9/w_720%2Cc_limit/Will-CDC-Ever-Get-a-Director-Science-2221384890.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6998701dc31375ebca5a4cab/16:9/w_720%2Cc_limit/GettyImages-2191227367.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/699872684fbc7cc192b292e0/3:2/w_720%2Cc_limit/GettyImages-1345490899.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/6998bf70862552e1c49a5c6c/3:2/w_720%2Cc_limit/GettyImages-2190593436.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/699c2f4a78972f77e910da08/3:2/w_720%2Cc_limit/GettyImages-2258921729.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/699c832687b4ddbea4d1c67a/16:9/w_720%2Cc_limit/022326_Science-UFO-Files-Dissapointment.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/699dc7921ed484eb6c093656/16:9/w_720%2Cc_limit/GettyImages-622590238.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/699f79c89c1839834b2d7742/16:9/w_720%2Cc_limit/Arctic-Circle-Next-Frontier-In-AI-Infrastructure-Wars-Business-2163338735.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a058f77da3e019b30e91a8/16:9/w_1600%2Cc_limit/ScienceSourceImages_1730789.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a1c00663d7023723a168ed/16:9/w_720%2Cc_limit/Rodney%2520Gorhman31%2520(2).jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a1fc5ccd255f245e966b8e/16:9/w_720%2Cc_limit/sci-artemis2-2256758081.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a5818dfb8b2b3db6442eed/16:9/w_720%2Cc_limit/GettyImages-1250649650.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a83a275e392b566b9b14c3/16:9/w_720%2Cc_limit/GettyImages-1339909058.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a8428b8a849494479d35f1/16:9/w_720%2Cc_limit/GettyImages-629409489.jpg;3
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69a87016c7816c1e1584e8ee/3:2/w_720%2Cc_limit/Big-Tech-Signs-Nonbinding-White-House-Pledge-To-Protect-Consumers-From-Data-Centers-Science-2250991059.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69aa1cf123fe0f2f8bea6e65/16:9/w_720%2Cc_limit/Why-Can-a-Single-Train-Locomotives-Pull-So-Much-Weight_-Science-1865711837.jpg;2
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69ab02c4ae15bcb547e25ca5/16:9/w_720%2Cc_limit/GettyImages-1253877737.jpg;5
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69ab5a2715dae1d56d0bffb8/16:9/w_720%2Cc_limit/Why-MAHA-Is-Obsessed-With-Shared-Decision-Making-Science-2210910497.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69aebbb0ad83313d7f9d7cf9/16:9/w_640%2Ch_360%2Cc_limit/030926_Science-Sleep-Apnea-Tech.jpg;4
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69b00c9e772e2c790732bbac/16:9/w_720%2Cc_limit/GettyImages-183097875.jpg;1
|
||||
https://giove.isti.cnr.it/users/leonardi/WIRED_science_user_test.html;https://media.wired.com/photos/69b06741afd392d14ab2c8ea/16:9/w_640%2Ch_360%2Cc_limit/science_measles_GettyImages-2259641016.jpg;4
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,184 @@
|
|||
import json
|
||||
import time
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
import logging
|
||||
import os
|
||||
import requests
|
||||
import base64
|
||||
import re
|
||||
from PIL import Image
|
||||
import io
|
||||
|
||||
|
||||
|
||||
|
||||
def call_API_urlibrequest(
|
||||
data={},
|
||||
verbose=False,
|
||||
url="",
|
||||
headers=[],
|
||||
method="post",
|
||||
base=2, # number of seconds to wait
|
||||
max_tries=3,
|
||||
):
|
||||
|
||||
if verbose:
|
||||
logging.info("input_data:%s", data)
|
||||
|
||||
# Allow multiple attempts to call the API incase of downtime.
|
||||
# Return provided response to user after 3 failed attempts.
|
||||
wait_seconds = [base**i for i in range(max_tries)]
|
||||
|
||||
for num_tries in range(max_tries):
|
||||
try:
|
||||
|
||||
if method == "get":
|
||||
|
||||
# Encode the parameters and append them to the URL
|
||||
query_string = urllib.parse.urlencode(data)
|
||||
|
||||
url_with_params = f"{url}?{query_string}"
|
||||
request = urllib.request.Request(url_with_params, method="GET")
|
||||
for ele in headers:
|
||||
|
||||
request.add_header(ele[0], ele[1])
|
||||
|
||||
elif method == "post":
|
||||
# Convert the dictionary to a JSON formatted string and encode it to bytes
|
||||
data_to_send = json.dumps(data).encode("utf-8")
|
||||
|
||||
request = urllib.request.Request(url, data=data_to_send, method="POST")
|
||||
for ele in headers:
|
||||
|
||||
request.add_header(ele[0], ele[1])
|
||||
else:
|
||||
return {"error_message": "method_not_allowed"}
|
||||
|
||||
# Send the request and capture the response
|
||||
|
||||
with urllib.request.urlopen(request, timeout=300) as response:
|
||||
# Read and decode the response
|
||||
|
||||
response_json = json.loads(response.read().decode("utf-8"))
|
||||
logging.info("response_json:%s", response_json)
|
||||
|
||||
logging.info("response.status_code:%s", response.getcode())
|
||||
return response_json
|
||||
|
||||
except Exception as e:
|
||||
|
||||
logging.error("error message:%s", e)
|
||||
response_json = {"error": e}
|
||||
|
||||
logging.info("num_tries:%s", num_tries)
|
||||
logging.info(
|
||||
"Waiting %s seconds before automatically trying again.",
|
||||
str(wait_seconds[num_tries]),
|
||||
)
|
||||
time.sleep(wait_seconds[num_tries])
|
||||
|
||||
logging.info(
|
||||
"Tried %s times to make API call to get a valid response object", max_tries
|
||||
)
|
||||
logging.info("Returning provided response")
|
||||
return response_json
|
||||
|
||||
|
||||
def parse_mllm_alt_text_response(mllm_response):
|
||||
"""
|
||||
Parse an MLLM response string and extract key attributes into a JSON object.
|
||||
|
||||
from mllm response like:
|
||||
```json\n{\n\"Original alt-text assessment\"... etc
|
||||
to a structured dictionary.
|
||||
|
||||
Args:
|
||||
mllm_response (str): The raw MLLM response text containing JSON data
|
||||
|
||||
Returns:
|
||||
dict: A dictionary containing the extracted attributes, or None if parsing fails
|
||||
"""
|
||||
try:
|
||||
# Handle NaN or None values
|
||||
if mllm_response is None or mllm_response == "":
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
# Extract JSON content between ```json and ``` markers
|
||||
json_match = re.search(r'```json\s*(.*?)\s*```', mllm_response, re.DOTALL)
|
||||
|
||||
if not json_match:
|
||||
# Try to find JSON without markdown code blocks
|
||||
json_match = re.search(r'\{.*\}', mllm_response, re.DOTALL)
|
||||
|
||||
if not json_match:
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
json_str = json_match.group(1) if '```json' in mllm_response else json_match.group(0)
|
||||
|
||||
# Parse the JSON string
|
||||
parsed_data = json.loads(json_str)
|
||||
|
||||
# Create a structured output with the key attributes
|
||||
result = {
|
||||
"original_alt_text_assessment": parsed_data.get("Original alt-text assessment", ""),
|
||||
"assessment": parsed_data.get("Assessment", ""),
|
||||
"evaluation_result": parsed_data.get("EvaluationResult", ""),
|
||||
"new_alt_text": parsed_data.get("New alt-text", "")
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"JSON parsing error: {e}")
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"Error parsing MLLM response: {e}")
|
||||
return {
|
||||
"original_alt_text_assessment": None,
|
||||
"assessment": None,
|
||||
"evaluation_result": None,
|
||||
"new_alt_text": None
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def encode_image_from_url(image_url):
|
||||
response = requests.get(image_url)
|
||||
|
||||
# Open image and convert to RGB
|
||||
image = Image.open(io.BytesIO(response.content))
|
||||
|
||||
# Convert to RGB (handles RGBA, grayscale, etc.)
|
||||
if image.mode != 'RGB':
|
||||
image = image.convert('RGB')
|
||||
|
||||
# Save to bytes buffer
|
||||
buffer = io.BytesIO()
|
||||
image.save(buffer, format='PNG') # or 'JPEG'
|
||||
buffer.seek(0)
|
||||
|
||||
# Encode to base64
|
||||
return base64.b64encode(buffer.getvalue()).decode("utf-8")
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,290 @@
|
|||
import re
|
||||
from collections import Counter
|
||||
|
||||
"""
|
||||
For English texts:
|
||||
|
||||
Flesch Reading Ease score
|
||||
Flesch-Kincaid Grade Level
|
||||
Gunning Fog Index
|
||||
|
||||
For Italian texts:
|
||||
|
||||
Flesch Reading Ease (adapted for Italian with Flesch-Vacca formula)
|
||||
Gulpease Index (specifically designed for Italian)
|
||||
Gunning Fog Index
|
||||
|
||||
Basic statistics for both:
|
||||
|
||||
Sentence count
|
||||
Word count
|
||||
Syllable count
|
||||
Complex words (3+ syllables)
|
||||
Average words per sentence
|
||||
Average syllables per word
|
||||
"""
|
||||
|
||||
class ReadabilityAnalyzer:
|
||||
"""Analyze text readability for English and Italian"""
|
||||
|
||||
def __init__(self, text, language='en'):
|
||||
self.text = text
|
||||
self.language = language.lower()
|
||||
self.sentences = self._count_sentences()
|
||||
self.words = self._count_words()
|
||||
self.syllables = self._count_syllables()
|
||||
self.complex_words = self._count_complex_words()
|
||||
self.characters = len(re.sub(r'\s', '', text))
|
||||
|
||||
def _count_sentences(self):
|
||||
"""Count sentences in text"""
|
||||
sentences = re.split(r'[.!?]+', self.text)
|
||||
return len([s for s in sentences if s.strip()])
|
||||
|
||||
def _count_words(self):
|
||||
"""Count words in text"""
|
||||
words = re.findall(r'\b[a-zA-ZàèéìòùÀÈÉÌÒÙáíóúýÁÍÓÚÝâêîôûÂÊÎÔÛäëïöüÄËÏÖÜ]+\b', self.text)
|
||||
return len(words)
|
||||
|
||||
def _count_syllables(self):
|
||||
"""Count syllables in text (approximation for both languages)"""
|
||||
words = re.findall(r'\b[a-zA-ZàèéìòùÀÈÉÌÒÙáíóúýÁÍÓÚÝâêîôûÂÊÎÔÛäëïöüÄËÏÖÜ]+\b', self.text.lower())
|
||||
total_syllables = 0
|
||||
|
||||
for word in words:
|
||||
if self.language == 'it':
|
||||
syllables = self._count_syllables_italian(word)
|
||||
else:
|
||||
syllables = self._count_syllables_english(word)
|
||||
total_syllables += syllables
|
||||
|
||||
return total_syllables
|
||||
|
||||
def _count_syllables_english(self, word):
|
||||
"""Count syllables in English word"""
|
||||
word = word.lower()
|
||||
vowels = 'aeiouy'
|
||||
syllables = 0
|
||||
previous_was_vowel = False
|
||||
|
||||
for char in word:
|
||||
is_vowel = char in vowels
|
||||
if is_vowel and not previous_was_vowel:
|
||||
syllables += 1
|
||||
previous_was_vowel = is_vowel
|
||||
|
||||
# Adjust for silent e
|
||||
if word.endswith('e'):
|
||||
syllables -= 1
|
||||
|
||||
# Ensure at least 1 syllable
|
||||
if syllables == 0:
|
||||
syllables = 1
|
||||
|
||||
return syllables
|
||||
|
||||
def _count_syllables_italian(self, word):
|
||||
"""Count syllables in Italian word"""
|
||||
word = word.lower()
|
||||
vowels = 'aeiouàèéìòùáíóúý'
|
||||
syllables = 0
|
||||
previous_was_vowel = False
|
||||
|
||||
for char in word:
|
||||
is_vowel = char in vowels
|
||||
if is_vowel and not previous_was_vowel:
|
||||
syllables += 1
|
||||
previous_was_vowel = is_vowel
|
||||
|
||||
# Ensure at least 1 syllable
|
||||
if syllables == 0:
|
||||
syllables = 1
|
||||
|
||||
return syllables
|
||||
|
||||
def _count_complex_words(self):
|
||||
"""Count words with 3+ syllables"""
|
||||
words = re.findall(r'\b[a-zA-ZàèéìòùÀÈÉÌÒÙáíóúýÁÍÓÚÝâêîôûÂÊÎÔÛäëïöüÄËÏÖÜ]+\b', self.text.lower())
|
||||
complex_count = 0
|
||||
|
||||
for word in words:
|
||||
if self.language == 'it':
|
||||
syllables = self._count_syllables_italian(word)
|
||||
else:
|
||||
syllables = self._count_syllables_english(word)
|
||||
|
||||
if syllables >= 3:
|
||||
complex_count += 1
|
||||
|
||||
return complex_count
|
||||
|
||||
def flesch_reading_ease(self):
|
||||
"""Calculate Flesch Reading Ease score"""
|
||||
if self.words == 0 or self.sentences == 0:
|
||||
return 0
|
||||
|
||||
if self.language == 'it':
|
||||
# Flesch-Vacca formula for Italian
|
||||
score = 206.835 - 1.3 * (self.words / self.sentences) - 60.1 * (self.syllables / self.words)
|
||||
else:
|
||||
# Standard Flesch formula for English
|
||||
score = 206.835 - 1.015 * (self.words / self.sentences) - 84.6 * (self.syllables / self.words)
|
||||
|
||||
return round(score, 2)
|
||||
|
||||
def flesch_kincaid_grade(self):
|
||||
"""Calculate Flesch-Kincaid Grade Level (primarily for English)"""
|
||||
if self.words == 0 or self.sentences == 0:
|
||||
return 0
|
||||
|
||||
grade = 0.39 * (self.words / self.sentences) + 11.8 * (self.syllables / self.words) - 15.59
|
||||
return round(grade, 2)
|
||||
|
||||
def gunning_fog_index(self):
|
||||
"""Calculate Gunning Fog Index"""
|
||||
if self.words == 0 or self.sentences == 0:
|
||||
return 0
|
||||
|
||||
fog = 0.4 * ((self.words / self.sentences) + 100 * (self.complex_words / self.words))
|
||||
return round(fog, 2)
|
||||
|
||||
def gulpease_index(self):
|
||||
"""Calculate Gulpease Index (for Italian)"""
|
||||
if self.words == 0:
|
||||
return 0
|
||||
|
||||
gulpease = 89 - (self.characters / self.words * 10) + (self.sentences / self.words * 300)
|
||||
return round(gulpease, 2)
|
||||
|
||||
def get_all_scores(self):
|
||||
"""Get all readability scores"""
|
||||
scores = {
|
||||
'basic_stats': {
|
||||
'sentences': self.sentences,
|
||||
'words': self.words,
|
||||
'syllables': self.syllables,
|
||||
'complex_words': self.complex_words,
|
||||
'characters': self.characters,
|
||||
'avg_words_per_sentence': round(self.words / self.sentences, 2) if self.sentences > 0 else 0,
|
||||
'avg_syllables_per_word': round(self.syllables / self.words, 2) if self.words > 0 else 0
|
||||
},
|
||||
'readability_scores': {}
|
||||
}
|
||||
|
||||
# Add appropriate scores based on language
|
||||
if self.language == 'it':
|
||||
scores['readability_scores']['flesch_reading_ease_it'] = self.flesch_reading_ease()
|
||||
scores['readability_scores']['gulpease_index'] = self.gulpease_index()
|
||||
scores['readability_scores']['gunning_fog_index'] = self.gunning_fog_index()
|
||||
else:
|
||||
scores['readability_scores']['flesch_reading_ease'] = self.flesch_reading_ease()
|
||||
scores['readability_scores']['flesch_kincaid_grade'] = self.flesch_kincaid_grade()
|
||||
scores['readability_scores']['gunning_fog_index'] = self.gunning_fog_index()
|
||||
|
||||
return scores
|
||||
|
||||
def interpret_scores(self):
|
||||
"""Provide interpretation of readability scores"""
|
||||
scores = self.get_all_scores()
|
||||
interpretation = []
|
||||
|
||||
if self.language == 'it':
|
||||
# Flesch Reading Ease (Italian)
|
||||
fre = scores['readability_scores']['flesch_reading_ease_it']
|
||||
if fre >= 80:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Molto facile (Very easy)")
|
||||
elif fre >= 60:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Facile (Easy)")
|
||||
elif fre >= 50:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Abbastanza facile (Fairly easy)")
|
||||
elif fre >= 40:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Normale (Normal)")
|
||||
elif fre >= 30:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Abbastanza difficile (Fairly difficult)")
|
||||
else:
|
||||
interpretation.append(f"Flesch Reading Ease (IT): {fre} - Difficile (Difficult)")
|
||||
|
||||
# Gulpease Index
|
||||
gulpease = scores['readability_scores']['gulpease_index']
|
||||
if gulpease >= 80:
|
||||
interpretation.append(f"Gulpease Index: {gulpease} - Elementare (Elementary school)")
|
||||
elif gulpease >= 60:
|
||||
interpretation.append(f"Gulpease Index: {gulpease} - Media inferiore (Middle school)")
|
||||
elif gulpease >= 40:
|
||||
interpretation.append(f"Gulpease Index: {gulpease} - Media superiore (High school)")
|
||||
else:
|
||||
interpretation.append(f"Gulpease Index: {gulpease} - Universitario (University)")
|
||||
else:
|
||||
# Flesch Reading Ease (English)
|
||||
fre = scores['readability_scores']['flesch_reading_ease']
|
||||
if fre >= 90:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Very easy (5th grade)")
|
||||
elif fre >= 80:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Easy (6th grade)")
|
||||
elif fre >= 70:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Fairly easy (7th grade)")
|
||||
elif fre >= 60:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Standard (8th-9th grade)")
|
||||
elif fre >= 50:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Fairly difficult (10th-12th grade)")
|
||||
elif fre >= 30:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Difficult (College)")
|
||||
else:
|
||||
interpretation.append(f"Flesch Reading Ease: {fre} - Very difficult (College graduate)")
|
||||
|
||||
# Flesch-Kincaid Grade
|
||||
fkg = scores['readability_scores']['flesch_kincaid_grade']
|
||||
interpretation.append(f"Flesch-Kincaid Grade: {fkg} (US grade level)")
|
||||
|
||||
# Gunning Fog Index (both languages)
|
||||
fog = scores['readability_scores']['gunning_fog_index']
|
||||
interpretation.append(f"Gunning Fog Index: {fog} (years of education needed)")
|
||||
|
||||
return '\n'.join(interpretation)
|
||||
|
||||
|
||||
# Example usage
|
||||
if __name__ == "__main__":
|
||||
# English example
|
||||
english_text = """
|
||||
The quick brown fox jumps over the lazy dog. This is a simple sentence.
|
||||
However, more complicated sentences with multisyllabic words can significantly
|
||||
increase the complexity of the text and make it harder to read.
|
||||
"""
|
||||
|
||||
print("=== ENGLISH TEXT ANALYSIS ===")
|
||||
analyzer_en = ReadabilityAnalyzer(english_text, language='en')
|
||||
scores_en = analyzer_en.get_all_scores()
|
||||
|
||||
print("\nBasic Statistics:")
|
||||
for key, value in scores_en['basic_stats'].items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
print("\nReadability Scores:")
|
||||
for key, value in scores_en['readability_scores'].items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
print("\nInterpretation:")
|
||||
print(analyzer_en.interpret_scores())
|
||||
|
||||
# Italian example
|
||||
italian_text = """
|
||||
Il veloce cane marrone salta sopra il cane pigro. Questa è una frase semplice.
|
||||
Tuttavia, frasi più complicate con parole polisillabiche possono aumentare
|
||||
significativamente la complessità del testo e renderlo più difficile da leggere.
|
||||
"""
|
||||
|
||||
print("\n\n=== ITALIAN TEXT ANALYSIS ===")
|
||||
analyzer_it = ReadabilityAnalyzer(italian_text, language='it')
|
||||
scores_it = analyzer_it.get_all_scores()
|
||||
|
||||
print("\nBasic Statistics:")
|
||||
for key, value in scores_it['basic_stats'].items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
print("\nReadability Scores:")
|
||||
for key, value in scores_it['readability_scores'].items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
print("\nInterpretation:")
|
||||
print(analyzer_it.interpret_scores())
|
||||
Loading…
Reference in New Issue