ManfredAabye commited on
Commit
7c7d442
1 Parent(s): 259ddbd

Version 0.0.4

Browse files
Files changed (2) hide show
  1. main_GPU_V004.py +243 -0
  2. main_Testing_V004.py +156 -0
main_GPU_V004.py ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import sqlite3
4
+ from datasets import Dataset
5
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification, TFAutoModelForSequenceClassification, Trainer, TrainingArguments
6
+ from bs4 import BeautifulSoup
7
+ import xml.etree.ElementTree as ET
8
+ import pyth.plugins.rtf15.reader as rtf15_reader
9
+ import pyth.plugins.plaintext.writer as plaintext_writer
10
+
11
+ SUPPORTED_FILE_TYPES = ['.sh', '.bat', '.ps1', '.cs', '.c', '.cpp', '.h', '.cmake', '.py', '.git', '.sql', '.csv', '.sqlite', '.lsl', '.html', '.xml', '.rtf']
12
+
13
+ def extrahiere_parameter(file_path):
14
+ try:
15
+ with open(file_path, 'r', encoding='utf-8') as file:
16
+ lines = file.readlines()
17
+ anzahl_zeilen = len(lines)
18
+ anzahl_zeichen = sum(len(line) for line in lines)
19
+ long_text_mode = anzahl_zeilen > 1000
20
+ dimensionalität = 1 # Beispielwert, kann angepasst werden
21
+ return {
22
+ "text": file_path,
23
+ "anzahl_zeilen": anzahl_zeilen,
24
+ "anzahl_zeichen": anzahl_zeichen,
25
+ "long_text_mode": long_text_mode,
26
+ "dimensionalität": dimensionalität
27
+ }
28
+ except UnicodeDecodeError as e:
29
+ print(f"Fehler beim Lesen der Datei {file_path}: {e}")
30
+ return None
31
+ except Exception as e:
32
+ print(f"Allgemeiner Fehler beim Lesen der Datei {file_path}: {e}")
33
+ return None
34
+
35
+ def extrahiere_parameter_html(file_path):
36
+ try:
37
+ with open(file_path, 'r', encoding='utf-8') as file:
38
+ content = file.read()
39
+ soup = BeautifulSoup(content, 'html.parser')
40
+ text = soup.get_text()
41
+ anzahl_zeilen = text.count('\n')
42
+ anzahl_zeichen = len(text)
43
+ long_text_mode = anzahl_zeilen > 1000
44
+ dimensionalität = 1
45
+ return {
46
+ "text": text,
47
+ "anzahl_zeilen": anzahl_zeilen,
48
+ "anzahl_zeichen": anzahl_zeichen,
49
+ "long_text_mode": long_text_mode,
50
+ "dimensionalität": dimensionalität
51
+ }
52
+ except Exception as e:
53
+ print(f"Fehler beim Lesen der HTML-Datei {file_path}: {e}")
54
+ return None
55
+
56
+ def extrahiere_parameter_xml(file_path):
57
+ try:
58
+ tree = ET.parse(file_path)
59
+ root = tree.getroot()
60
+ text = ET.tostring(root, encoding='unicode', method='text')
61
+ anzahl_zeilen = text.count('\n')
62
+ anzahl_zeichen = len(text)
63
+ long_text_mode = anzahl_zeilen > 1000
64
+ dimensionalität = 1
65
+ return {
66
+ "text": text,
67
+ "anzahl_zeilen": anzahl_zeilen,
68
+ "anzahl_zeichen": anzahl_zeichen,
69
+ "long_text_mode": long_text_mode,
70
+ "dimensionalität": dimensionalität
71
+ }
72
+ except Exception as e:
73
+ print(f"Fehler beim Lesen der XML-Datei {file_path}: {e}")
74
+ return None
75
+
76
+ def extrahiere_parameter_rtf(file_path):
77
+ try:
78
+ with open(file_path, 'rb') as file:
79
+ doc = rtf15_reader.read(file)
80
+ text = plaintext_writer.write(doc).getvalue()
81
+ anzahl_zeilen = text.count('\n')
82
+ anzahl_zeichen = len(text)
83
+ long_text_mode = anzahl_zeilen > 1000
84
+ dimensionalität = 1
85
+ return {
86
+ "text": text,
87
+ "anzahl_zeilen": anzahl_zeilen,
88
+ "anzahl_zeichen": anzahl_zeichen,
89
+ "long_text_mode": long_text_mode,
90
+ "dimensionalität": dimensionalität
91
+ }
92
+ except Exception as e:
93
+ print(f"Fehler beim Lesen der RTF-Datei {file_path}: {e}")
94
+ return None
95
+
96
+ def durchsuchen_und_extrahieren(root_dir, db_pfad):
97
+ try:
98
+ with sqlite3.connect(db_pfad) as conn:
99
+ cursor = conn.cursor()
100
+ cursor.execute('''CREATE TABLE IF NOT EXISTS dateiparameter
101
+ (id INTEGER PRIMARY KEY,
102
+ dateipfad TEXT,
103
+ anzahl_zeilen INTEGER,
104
+ anzahl_zeichen INTEGER,
105
+ long_text_mode BOOLEAN,
106
+ dimensionalität INTEGER)''')
107
+
108
+ for subdir, _, files in os.walk(root_dir):
109
+ for file in files:
110
+ file_path = os.path.join(subdir, file)
111
+ if file.endswith('.html'):
112
+ parameter = extrahiere_parameter_html(file_path)
113
+ elif file.endswith('.xml'):
114
+ parameter = extrahiere_parameter_xml(file_path)
115
+ elif file.endswith('.rtf'):
116
+ parameter = extrahiere_parameter_rtf(file_path)
117
+ elif any(file.endswith(ext) for ext in SUPPORTED_FILE_TYPES):
118
+ parameter = extrahiere_parameter(file_path)
119
+ else:
120
+ continue
121
+
122
+ if parameter:
123
+ cursor.execute('''INSERT INTO dateiparameter (dateipfad, anzahl_zeilen, anzahl_zeichen, long_text_mode, dimensionalität)
124
+ VALUES (?, ?, ?, ?, ?)''', (file_path, parameter["anzahl_zeilen"], parameter["anzahl_zeichen"], parameter["long_text_mode"], parameter["dimensionalität"]))
125
+ conn.commit()
126
+ print("Parameter erfolgreich extrahiert und in der Datenbank gespeichert.")
127
+ except sqlite3.Error as e:
128
+ print(f"SQLite Fehler: {e}")
129
+ except Exception as e:
130
+ print(f"Allgemeiner Fehler: {e}")
131
+
132
+ def extrahiere_parameter_aus_db(db_pfad):
133
+ try:
134
+ with sqlite3.connect(db_pfad) as conn:
135
+ cursor = conn.cursor()
136
+ cursor.execute("SELECT * FROM dateiparameter")
137
+ daten = cursor.fetchall()
138
+ return daten
139
+ except sqlite3.Error as e:
140
+ print(f"SQLite Fehler: {e}")
141
+ return None
142
+ except Exception as e:
143
+ print(f"Allgemeiner Fehler: {e}")
144
+ return None
145
+
146
+ def konvertiere_zu_hf_dataset(daten):
147
+ dataset_dict = {
148
+ "text": [],
149
+ "anzahl_zeilen": [],
150
+ "anzahl_zeichen": [],
151
+ "long_text_mode": [],
152
+ "dimensionalität": []
153
+ }
154
+
155
+ for eintrag in daten:
156
+ dataset_dict["text"].append(eintrag[1]) # 'text' entspricht 'dateipfad'
157
+ dataset_dict["anzahl_zeilen"].append(eintrag[2])
158
+ dataset_dict["anzahl_zeichen"].append(eintrag[3])
159
+ dataset_dict["long_text_mode"].append(eintrag[4])
160
+ dataset_dict["dimensionalität"].append(eintrag[5])
161
+
162
+ return Dataset.from_dict(dataset_dict)
163
+
164
+ def trainiere_und_speichere_modell(hf_dataset, output_model_dir):
165
+ try:
166
+ tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased", use_fast=True)
167
+
168
+ def tokenize_function(examples):
169
+ return tokenizer(examples["text"], padding="max_length", truncation=True)
170
+
171
+ tokenized_datasets = hf_dataset.map(tokenize_function, batched=True)
172
+
173
+ # Beispielhaftes Hinzufügen von Dummy-Labels für das Training
174
+ tokenized_datasets = tokenized_datasets.map(lambda examples: {"label": [0.0] * len(examples["text"])}, batched=True) # Dummy labels as float
175
+
176
+ # Aufteilen des Datensatzes in Training und Test
177
+ train_test_split = tokenized_datasets.train_test_split(test_size=0.2)
178
+ train_dataset = train_test_split["train"]
179
+ eval_dataset = train_test_split["test"]
180
+
181
+ num_labels = len(set(train_dataset["label"]))
182
+
183
+ # PyTorch Modell
184
+ model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=num_labels)
185
+
186
+ training_args = TrainingArguments(
187
+ output_dir=output_model_dir,
188
+ evaluation_strategy="epoch", # Aktualisiert nach der Deprecation-Warnung
189
+ per_device_train_batch_size=8,
190
+ per_device_eval_batch_size=8,
191
+ num_train_epochs=3,
192
+ weight_decay=0.01,
193
+ )
194
+
195
+ trainer = Trainer(
196
+ model=model,
197
+ args=training_args,
198
+ train_dataset=train_dataset,
199
+ eval_dataset=eval_dataset,
200
+ )
201
+
202
+ trainer.train()
203
+ model.save_pretrained(output_model_dir)
204
+ tokenizer.save_pretrained(output_model_dir)
205
+
206
+ # TensorFlow Modell
207
+ tf_model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=num_labels)
208
+ tf_model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
209
+
210
+ # Dummy-Daten für das Speichern im TensorFlow-Format
211
+ import tensorflow as tf
212
+ dummy_input = tf.constant(tokenizer("This is a dummy input", return_tensors="tf")["input_ids"])
213
+
214
+ # Speichern des TensorFlow-Modells
215
+ tf_model(dummy_input) # Modell einmal aufrufen, um es zu "bauen"
216
+ tf_model.save_pretrained(output_model_dir)
217
+
218
+ print(f"Das Modell wurde erfolgreich in {output_model_dir} gespeichert.")
219
+
220
+ except Exception as e:
221
+ print(f"Fehler beim Trainieren und Speichern des Modells: {e}")
222
+
223
+ if __name__ == "__main__":
224
+ # Verzeichnispfad als Argument übergeben, falls vorhanden
225
+ if len(sys.argv) > 1:
226
+ directory_path = sys.argv[1]
227
+ else:
228
+ directory_path = '.' # Standardverzeichnis, falls kein Argument übergeben wurde
229
+
230
+ db_name = os.path.basename(os.path.normpath(directory_path)) + '.db'
231
+
232
+ durchsuchen_und_extrahieren(directory_path, db_name)
233
+
234
+ daten = extrahiere_parameter_aus_db(db_name)
235
+ if daten:
236
+ hf_dataset = konvertiere_zu_hf_dataset(daten)
237
+
238
+ output_model = os.path.basename(os.path.normpath(directory_path)) + '_model' # Verzeichnisname Modell
239
+ output_model_dir = os.path.join(os.path.dirname(db_name), output_model)
240
+
241
+ trainiere_und_speichere_modell(hf_dataset, output_model_dir)
242
+ else:
243
+ print("Keine Daten gefunden, um ein HF-Dataset zu erstellen.")
main_Testing_V004.py ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import sqlite3
4
+ import tkinter as tk
5
+ from tkinter import ttk
6
+ from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
7
+ import matplotlib.pyplot as plt
8
+ import matplotlib
9
+
10
+ SUPPORTED_FILE_TYPES = ['.sh', '.bat', '.ps1', '.cs', '.c', '.cpp', '.h', '.cmake', '.py', '.git', '.sql', '.csv', '.sqlite', '.lsl', '.html', '.xml', '.rtf']
11
+
12
+ # Globale Einstellung für Schriftgröße in Matplotlib um 10% verkleinern
13
+ matplotlib.rcParams.update({'font.size': plt.rcParams['font.size'] * 0.8})
14
+
15
+ class DatenVisualizer(tk.Tk):
16
+ def __init__(self, db_pfad):
17
+ super().__init__()
18
+
19
+ self.title("Daten Visualizer")
20
+ self.geometry("1200x720") # 20% größer
21
+
22
+ # Fenster für Anzahl der Zeichen
23
+ self.chars_window = tk.Toplevel(self)
24
+ self.chars_window.title("Anzahl der Zeichen")
25
+ self.chars_window.geometry("480x360") # 20% größer
26
+ self.chars_window.protocol("WM_DELETE_WINDOW", self.close_chars_window)
27
+
28
+ # Frame für die Anzahl der Zeichen
29
+ self.chars_frame = ttk.Frame(self.chars_window)
30
+ self.chars_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
31
+
32
+ # Anzahl der Zeichen pro Datei
33
+ self.anzeigen_anzahl_zeichen(db_pfad)
34
+
35
+ # Fenster für Qualität des Datensatzes
36
+ self.quality_window = tk.Toplevel(self)
37
+ self.quality_window.title("Qualität des Datensatzes")
38
+ self.quality_window.geometry("480x360") # 20% größer
39
+ self.quality_window.protocol("WM_DELETE_WINDOW", self.close_quality_window)
40
+
41
+ # Frame für die Qualität des Datensatzes
42
+ self.quality_frame = ttk.Frame(self.quality_window)
43
+ self.quality_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
44
+
45
+ # Qualität des Datensatzes
46
+ self.anzeigen_qualität(db_pfad)
47
+
48
+ # Frame für den Treeview und die Datenvisualisierung
49
+ self.tree_frame = ttk.Frame(self)
50
+ self.tree_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
51
+
52
+ # Treeview für die Daten
53
+ self.tree = ttk.Treeview(self.tree_frame)
54
+ self.tree["columns"] = ("dateipfad", "anzahl_zeilen", "anzahl_zeichen", "long_text_mode", "dimensionalität")
55
+ self.tree.heading("#0", text="ID")
56
+ self.tree.heading("dateipfad", text="Dateipfad")
57
+ self.tree.heading("anzahl_zeilen", text="Anzahl Zeilen")
58
+ self.tree.heading("anzahl_zeichen", text="Anzahl Zeichen")
59
+ self.tree.heading("long_text_mode", text="Long Text Mode")
60
+ self.tree.heading("dimensionalität", text="Dimensionalität")
61
+
62
+ self.tree_scroll = ttk.Scrollbar(self.tree_frame, orient=tk.VERTICAL, command=self.tree.yview)
63
+ self.tree.configure(yscrollcommand=self.tree_scroll.set)
64
+
65
+ self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
66
+ self.tree_scroll.pack(side=tk.RIGHT, fill=tk.Y)
67
+
68
+ self.lade_daten_aus_db(db_pfad)
69
+
70
+ def lade_daten_aus_db(self, db_pfad):
71
+ try:
72
+ with sqlite3.connect(db_pfad) as conn:
73
+ cursor = conn.cursor()
74
+ cursor.execute("SELECT * FROM dateiparameter")
75
+ daten = cursor.fetchall()
76
+
77
+ for row in daten:
78
+ self.tree.insert("", tk.END, values=row)
79
+
80
+ except sqlite3.Error as e:
81
+ print(f"SQLite Fehler: {e}")
82
+ except Exception as e:
83
+ print(f"Allgemeiner Fehler: {e}")
84
+
85
+ def anzeigen_anzahl_zeichen(self, db_pfad):
86
+ try:
87
+ with sqlite3.connect(db_pfad) as conn:
88
+ cursor = conn.cursor()
89
+ cursor.execute("SELECT dateipfad, anzahl_zeichen FROM dateiparameter")
90
+ daten = cursor.fetchall()
91
+
92
+ # Matplotlib Grafik für Anzahl Zeichen pro Datei
93
+ plot_figure_chars = plt.Figure(figsize=(6, 4.5), dpi=100) # 20% größer
94
+ plot_ax_chars = plot_figure_chars.add_subplot(111)
95
+ plot_ax_chars.bar([row[0] for row in daten], [int(row[1]) for row in daten], color='orange')
96
+ plot_ax_chars.set_xlabel("Dateipfad")
97
+ plot_ax_chars.set_ylabel("Anzahl Zeichen")
98
+
99
+ plot_canvas_chars = FigureCanvasTkAgg(plot_figure_chars, master=self.chars_frame)
100
+ plot_canvas_chars.get_tk_widget().pack()
101
+
102
+ except sqlite3.Error as e:
103
+ print(f"SQLite Fehler: {e}")
104
+ except Exception as e:
105
+ print(f"Allgemeiner Fehler: {e}")
106
+
107
+ def anzeigen_qualität(self, db_pfad):
108
+ try:
109
+ with sqlite3.connect(db_pfad) as conn:
110
+ cursor = conn.cursor()
111
+ cursor.execute("SELECT * FROM dateiparameter")
112
+ daten = cursor.fetchall()
113
+
114
+ # Berechnung der Qualität des Datensatzes
115
+ anzahl_dateien = len(daten)
116
+ durchschnittliche_anzahl_zeichen = sum(int(row[3]) for row in daten) / anzahl_dateien if anzahl_dateien > 0 else 0
117
+ durchschnittliche_anzahl_zeilen = sum(int(row[2]) for row in daten) / anzahl_dateien if anzahl_dateien > 0 else 0
118
+
119
+ # Matplotlib Grafik für Qualität
120
+ plot_figure_quality = plt.Figure(figsize=(6, 4.5), dpi=100) # 20% größer
121
+ plot_ax_quality = plot_figure_quality.add_subplot(111)
122
+ plot_ax_quality.bar(["Durchschnittliche Anzahl Zeichen", "Durchschnittliche Anzahl Zeilen"], [durchschnittliche_anzahl_zeichen, durchschnittliche_anzahl_zeilen], color=['skyblue', 'lightgreen'])
123
+ plot_ax_quality.set_xlabel("Metrik")
124
+ plot_ax_quality.set_ylabel("Durchschnittswerte")
125
+
126
+ plot_canvas_quality = FigureCanvasTkAgg(plot_figure_quality, master=self.quality_frame)
127
+ plot_canvas_quality.get_tk_widget().pack()
128
+
129
+ except sqlite3.Error as e:
130
+ print(f"SQLite Fehler: {e}")
131
+ except Exception as e:
132
+ print(f"Allgemeiner Fehler: {e}")
133
+
134
+ def close_chars_window(self):
135
+ self.chars_window.destroy()
136
+
137
+ def close_quality_window(self):
138
+ self.quality_window.destroy()
139
+
140
+ def main(db_pfad):
141
+ try:
142
+ daten_visualizer = DatenVisualizer(db_pfad)
143
+ daten_visualizer.mainloop()
144
+
145
+ except Exception as e:
146
+ print(f"Fehler beim Hauptprogramm: {e}")
147
+
148
+ if __name__ == "__main__":
149
+ # Verzeichnispfad als Argument übergeben, falls vorhanden
150
+ if len(sys.argv) > 1:
151
+ db_pfad = sys.argv[1]
152
+ else:
153
+ print("Bitte geben Sie den Pfad zur SQLite-Datenbank als Argument an.")
154
+ sys.exit(1)
155
+
156
+ main(db_pfad)