Spaces:
Sleeping
Sleeping
| import json | |
| import logging | |
| import re | |
| import os | |
| from collections import defaultdict | |
| import pickle | |
| import time | |
| import shutil | |
| from gematria import calculate_gematria | |
| # --- Konfiguration --- | |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
| BOOK_RANGE = range(1, 40) | |
| MAX_PHRASE_WORDS = 20 | |
| TEXTS_DIR = "texts/torah" | |
| CACHE_FILE = "tanakh_phrasedict.cache" | |
| OLD_INDICES_DIR = "indices_by_book" | |
| def clean_text(text): | |
| """Bereinigt den hebräischen Text.""" | |
| text = re.sub(r'\[.*?\]', '', text) | |
| text = re.sub(r"[^\u05D0-\u05EA\s]+", "", text) | |
| text = re.sub(r"\s+", " ", text).strip() | |
| return text | |
| def cleanup_old_files(): | |
| """Löscht alte, inkompatible Dateien und Verzeichnisse.""" | |
| if os.path.isdir(OLD_INDICES_DIR): | |
| logging.warning(f"Lösche altes Index-Verzeichnis: '{OLD_INDICES_DIR}'...") | |
| shutil.rmtree(OLD_INDICES_DIR) | |
| # Die alte Cache-Datei muss ebenfalls gelöscht werden, da sie das neue Format nicht hat | |
| if os.path.exists(CACHE_FILE): | |
| logging.warning(f"Lösche alte Cache-Datei für Re-Indizierung: '{CACHE_FILE}'...") | |
| os.remove(CACHE_FILE) | |
| def main(): | |
| """Erstellt ein globales Phrasen-Wörterbuch mit Wortanzahl und Frequenz.""" | |
| logging.info("Starte den globalen Index-Builder...") | |
| start_time = time.time() | |
| temp_phrases = [] | |
| phrase_frequencies = defaultdict(int) | |
| # --- Phase 1: Alle Phrasen sammeln und Frequenzen zählen --- | |
| logging.info("Phase 1: Sammle Phrasen und zähle Frequenzen...") | |
| for book_num in BOOK_RANGE: | |
| filepath = os.path.join(TEXTS_DIR, f"{book_num:02}.json") | |
| if not os.path.exists(filepath): | |
| continue | |
| logging.info(f" -> Verarbeite Buch {book_num:02}...") | |
| with open(filepath, 'r', encoding='utf-8') as f: | |
| data = json.load(f) | |
| for chap_idx, chapter in enumerate(data.get("text", []), start=1): | |
| for verse_idx, verse_text in enumerate(chapter, start=1): | |
| words = clean_text(verse_text).split() | |
| if not words: | |
| continue | |
| for length in range(1, min(len(words), MAX_PHRASE_WORDS) + 1): | |
| for start in range(len(words) - length + 1): | |
| phrase_words = words[start:start+length] | |
| phrase_text = " ".join(phrase_words) | |
| gematria_val = calculate_gematria("".join(phrase_words)) | |
| if gematria_val > 0: | |
| source_ref = f"B{book_num:02d},K{chap_idx:02d},V{verse_idx:02d}" | |
| # Speichere alle relevanten Daten temporär | |
| temp_phrases.append({ | |
| "gematria": gematria_val, | |
| "text": phrase_text, | |
| "source": source_ref, | |
| "words": length | |
| }) | |
| # Zähle die Häufigkeit jeder einzigartigen Phrase | |
| phrase_frequencies[phrase_text] += 1 | |
| logging.info(f"Phase 1 abgeschlossen. {len(temp_phrases):,} Phrasen-Instanzen gefunden.") | |
| # --- Phase 2: Finales Wörterbuch mit Frequenzdaten erstellen --- | |
| logging.info("Phase 2: Erstelle finales Phrasen-Wörterbuch...") | |
| final_phrase_dict = defaultdict(list) | |
| # Set, um Duplikate (gleiche Phrase, gleiche Gematria) zu vermeiden | |
| seen_phrases = set() | |
| for phrase in temp_phrases: | |
| # Einzigartiger Schlüssel, um zu verhindern, dass die gleiche Phrase mehrfach pro Gematria-Wert gespeichert wird | |
| phrase_key = (phrase['gematria'], phrase['text']) | |
| if phrase_key in seen_phrases: | |
| continue | |
| seen_phrases.add(phrase_key) | |
| final_phrase_dict[phrase['gematria']].append({ | |
| "text": phrase['text'], | |
| # Wichtig: Wir speichern jetzt auch Wortanzahl und Frequenz! | |
| "words": phrase['words'], | |
| "freq": phrase_frequencies[phrase['text']], | |
| "source": phrase['source'] # Quelle der ersten Begegnung | |
| }) | |
| logging.info("Phase 2 abgeschlossen.") | |
| # --- Phase 3: Speichern --- | |
| logging.info(f"Phase 3: Speichere das Phrasen-Wörterbuch in Cache-Datei: {CACHE_FILE}") | |
| with open(CACHE_FILE, 'wb') as f: | |
| pickle.dump(dict(final_phrase_dict), f) | |
| end_time = time.time() | |
| logging.info(f"\nIndizierung erfolgreich abgeschlossen. Gesamtdauer: {(end_time - start_time):.2f} Sekunden.") | |
| if __name__ == "__main__": | |
| cleanup_old_files() | |
| main() | |