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()