Spaces:
Sleeping
Sleeping
File size: 5,823 Bytes
38f8736 6c05acd 38f8736 351552e 90e70e9 38f8736 e556acc 3818f5a 7eaf1c3 3d3f8f8 7eaf1c3 3818f5a 3d3f8f8 1ab68b7 3d3f8f8 b474dc5 5141faf b474dc5 a90468d b474dc5 3d3f8f8 7eaf1c3 3d3f8f8 7eaf1c3 6288997 7eaf1c3 3d3f8f8 3818f5a 3d3f8f8 1833979 3d3f8f8 56adc9e 5141faf 56adc9e 3d3f8f8 56adc9e 3d3f8f8 56adc9e 3d3f8f8 56adc9e 3d3f8f8 56adc9e 3d3f8f8 56adc9e 3d3f8f8 56adc9e 3d3f8f8 3818f5a 3d3f8f8 56adc9e ed1dd60 56adc9e 3d3f8f8 56adc9e 3818f5a ed1dd60 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
import os
import spacy
import gradio as gr
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import zipfile
import re
print("Directory corrente:", os.getcwd())
zip_path = "en_core_web_lg-3.8.0.zip" # Carica il file ZIP nella cartella del progetto
extraction_dir = "./extracted_models" # Scegli una sottocartella per l'estrazione
test_dir = "./extracted_models/en_core_web_lg-3.8.0" # Cartella dopo l'estrazione
# Verifica se la cartella esiste già
if not os.path.exists(test_dir):
# Se la cartella non esiste, decomprimi il file ZIP
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(extraction_dir)
print(f"Modello estratto correttamente nella cartella {extraction_dir}")
# Percorso del file zip caricato
zip_path = "images.zip" # Assicurati che il file sia stato caricato su Hugging Face
extract_to = "images" # Directory di destinazione per le immagini
# Controlla se la directory esiste già
if not os.path.exists(extract_to):
os.makedirs(extract_to) # Crea la directory
# Estrai il file zip
if os.path.exists(zip_path): # Controlla che il file zip esista
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(extract_to)
print(f"Immagini estratte nella directory: {extract_to}")
print("Contenuto della directory images:", os.listdir(extract_to))
else:
print(f"File {zip_path} non trovato. Assicurati di caricarlo nello Space.")
# Percorso della cartella estratta
model_path = os.path.join(extraction_dir, "en_core_web_lg-3.8.0") # Assicurati che sia corretto
# Carica il modello
nlp = spacy.load(model_path)
# Carica il modello SentenceTransformer
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-mpnet-base-v2', device='cpu')
# Preprocessamento manuale (carica il manuale da un file o base di dati)
with open('testo.txt', 'r', encoding='utf-8') as file:
text = file.read()
# Tokenizza il testo in frasi usando SpaCy
doc = nlp(text)
sentences = [sent.text for sent in doc.sents] # Estrarre frasi dal testo
# Crea gli embedding per il manuale
embeddings = model.encode(sentences, batch_size=8, show_progress_bar=True)
# Percorso della cartella delle immagini
image_folder = "images"
def extract_figure_numbers(text):
"""Estrae tutti i numeri delle figure da una frase."""
matches = re.findall(r"\(Figure (\d+)\)", text, re.IGNORECASE)
if matches:
return matches # Restituisce una lista di numeri di figure
return []
def generate_figure_mapping(folder):
"""Genera la mappatura delle figure dal nome dei file immagini."""
mapping = {}
for file_name in os.listdir(folder):
if file_name.lower().endswith((".jpg", ".png", ".jpeg")):
figure_reference = file_name.split(".")[0].replace("_", " ")
mapping[figure_reference] = file_name
return mapping
figure_mapping = generate_figure_mapping(image_folder)
#print("Generated figure mapping:", figure_mapping)
def format_sentences(sentences):
"""
Converte la lista in una stringa, sostituendo i delimitatori '|' con un a capo senza aggiungere spazi extra.
Interrompe il processo se trova '.end'.
"""
# Uniamo la lista in una singola stringa
sentences_str = " ".join(sentences)
# Interrompiamo al primo '.end'
if ".end" in sentences_str:
sentences_str = sentences_str.split(".end")[0]
# Sostituiamo il delimitatore '|' con un a capo
formatted_response = sentences_str.replace(" |", "\n").replace("|", "\n")
return formatted_response
def find_relevant_sentences(query, threshold=0.2, top_n=6):
"""Trova le frasi più rilevanti e le immagini collegate."""
global sentences
query_embedding = model.encode([query])
similarities = cosine_similarity(query_embedding, embeddings).flatten()
filtered_results = [(idx, sim) for idx, sim in enumerate(similarities) if sim >= threshold]
filtered_results.sort(key=lambda x: x[1], reverse=True)
if not filtered_results:
return "**RESPONSE:**\nNo relevant sentences found for your query.", None
relevant_sentences = [sentences[idx] for idx, _ in filtered_results[:top_n]]
relevant_images = set() # Usa un set per evitare duplicati
for sent in relevant_sentences:
figure_numbers = extract_figure_numbers(sent) # Restituisce una lista di figure
for figure_number in figure_numbers:
if figure_number in figure_mapping:
image_path = os.path.join(image_folder, figure_mapping[figure_number])
if os.path.exists(image_path):
relevant_images.add(image_path) # Aggiunge al set
# Formatta le frasi senza categorizzazione
formatted_response = "****\n" + format_sentences(relevant_sentences)
return formatted_response, list(relevant_images) # Converte il set in lista
# Interfaccia Gradio
examples = [
["irresponsible use of the machine?"],
["If I have a problem how can I get help?"],
["precautions when using the cutting machine"],
["How do I DRILL BIT REPLACEMENT ?"],
["instructions for changing the knife"],
["lubrication for the knife holder cylinder"]
]
iface = gr.Interface(
fn=find_relevant_sentences,
inputs=gr.Textbox(label="Insert your query"),
outputs=[
gr.Textbox(label="Relevant sentences"),
gr.Gallery(label="Relevant figures", value=[os.path.join(image_folder, "4b.jpg")]) # Anteprima immagine iniziale
],
examples=examples,
title="Manual Querying System",
description="Enter a question about the machine, and this tool will find the most relevant sentences and associated figures from the manual.",
)
iface.launch() |