File: //opt/textanalyse/tools/phonetics_tool.py
# tools/phonetics_tool.py
import os
from pathlib import Path
from typing import Dict, List, Tuple, Optional
# Dateipfad zur Laut-Buchstaben-Zuordnung
PHONETICS_FILE_PATH = Path(__file__).parent.parent / "knowledge" / "phonetics" / "laut_buchstaben_zuordnung.txt"
# Cache für die geladenen Daten
phonetics_data = {
"laut_to_buchstaben": {}, # Laut -> mögliche Buchstaben
"buchstaben_to_laut": {}, # Buchstaben -> mögliche Laute
"beispiele": {}, # Laut -> Beispiele
"hinweise": {} # Laut -> Hinweise
}
def load_phonetics_data() -> bool:
"""
Lädt die Laut-Buchstaben-Zuordnungen aus der TXT-Datei.
Returns:
bool: True, wenn das Laden erfolgreich war, sonst False
"""
if not PHONETICS_FILE_PATH.is_file():
print(f"Info: Phonetik-Datei noch nicht vorhanden oder leer: {PHONETICS_FILE_PATH}")
return False
try:
with open(PHONETICS_FILE_PATH, 'r', encoding='utf-8') as f:
# Datei ist leer oder hat noch keine Daten - das ist in Ordnung
content = f.read().strip()
if not content:
print("Info: Phonetik-Datei ist leer. Bereit zum Befüllen durch Benutzer.")
return False
lines = content.split('\n')
for line in lines:
# Ignoriere leere Zeilen oder Kommentarzeilen
if not line.strip() or line.strip().startswith('#'):
continue
# Erwarte Format: Laut|Buchstaben|Beispiele|Hinweise
# Wobei Buchstaben und Beispiele durch Kommas getrennt sein können
parts = line.split('|')
if len(parts) < 4:
print(f"Warnung: Ungültiges Format in Zeile: {line}")
continue
laut = parts[0].strip()
buchstaben = [b.strip() for b in parts[1].split(',')]
beispiele = [b.strip() for b in parts[2].split(',')]
hinweis = parts[3].strip()
# Laut -> Buchstaben Zuordnung
phonetics_data["laut_to_buchstaben"][laut] = buchstaben
# Beispiele zum Laut
phonetics_data["beispiele"][laut] = beispiele
# Hinweise zum Laut
phonetics_data["hinweise"][laut] = hinweis
# Buchstaben -> Laut Zuordnung (umgekehrt)
for buchstabe in buchstaben:
if buchstabe not in phonetics_data["buchstaben_to_laut"]:
phonetics_data["buchstaben_to_laut"][buchstabe] = []
phonetics_data["buchstaben_to_laut"][buchstabe].append(laut)
print(f"Phonetik-Daten erfolgreich geladen. {len(phonetics_data['laut_to_buchstaben'])} Laute verfügbar.")
return True
except Exception as e:
print(f"Fehler beim Laden der Phonetik-Datei: {e}")
return False
# Beim Import des Moduls die Daten laden
load_success = load_phonetics_data()
def get_buchstaben_for_laut(laut: str) -> List[str]:
"""
Gibt alle möglichen Buchstaben(kombinationen) für einen Laut zurück.
Args:
laut (str): Der phonetische Laut (z.B. 'ʃ')
Returns:
List[str]: Liste von Buchstaben(kombinationen) (z.B. ['sch', 's'])
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return []
return phonetics_data["laut_to_buchstaben"].get(laut, [])
def get_laute_for_buchstabe(buchstabe: str) -> List[str]:
"""
Gibt alle möglichen Laute für eine Buchstabe(nkombination) zurück.
Args:
buchstabe (str): Der Buchstabe oder die Buchstabenkombination (z.B. 'sch')
Returns:
List[str]: Liste von Lauten (z.B. ['ʃ'])
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return []
return phonetics_data["buchstaben_to_laut"].get(buchstabe, [])
def get_beispiele_for_laut(laut: str) -> List[str]:
"""
Gibt Beispielwörter für einen Laut zurück.
Args:
laut (str): Der phonetische Laut (z.B. 'ʃ')
Returns:
List[str]: Liste von Beispielwörtern (z.B. ['Schule', 'stehen', 'spät'])
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return []
return phonetics_data["beispiele"].get(laut, [])
def get_hinweis_for_laut(laut: str) -> str:
"""
Gibt den Hinweis zu einem Laut zurück.
Args:
laut (str): Der phonetische Laut (z.B. 'ʃ')
Returns:
str: Der Hinweis zum Laut (z.B. 'Stimmloser postalveolarer Frikativ')
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return ""
return phonetics_data["hinweise"].get(laut, "")
def check_phonetics(text: str) -> List[Dict]:
"""
Analysiert einen Text auf mögliche phonetische Auffälligkeiten.
Diese Funktion ist für den LautBuchstabenAgent gedacht.
Args:
text (str): Der zu analysierende Text
Returns:
List[Dict]: Eine Liste von Wörtern mit Informationen zu ihrer phonetischen Zusammensetzung
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return [{"info": "Keine Phonetik-Daten verfügbar. Bitte befüllen Sie die Datei laut_buchstaben_zuordnung.txt."}]
# Diese Implementierung ist vereinfacht und fokussiert sich auf
# das Rückgabeformat für den Agenten, nicht auf komplexe phonetische Analyse
# Einfaches Wortfilter
words = [word.strip('.,;:!?()[]{}""\'') for word in text.split() if word.strip('.,;:!?()[]{}""\'')]
results = []
# Für jedes Wort relevante phonetische Informationen sammeln
for word in words:
# Hier könnte eine komplexere Analyse stehen
# Die aktuelle Implementierung ist stark vereinfacht
word_info = {
"word": word,
"phonetic_mappings": []
}
# Vereinfachte Analyse für einige bekannte Buchstabenkombinationen
for i in range(len(word)):
# Längere Kombinationen zuerst prüfen
for length in [4, 3, 2, 1]:
if i + length <= len(word):
buchstabe = word[i:i+length].lower()
laute = get_laute_for_buchstabe(buchstabe)
if laute:
for laut in laute:
beispiele = get_beispiele_for_laut(laut)
hinweis = get_hinweis_for_laut(laut)
word_info["phonetic_mappings"].append({
"position": i,
"buchstabe": buchstabe,
"laut": laut,
"beispiele": beispiele,
"hinweis": hinweis
})
if word_info["phonetic_mappings"]:
results.append(word_info)
return results
# Hilfsfunktion für LautBuchstabenAgent
def get_all_phonetic_data() -> Dict:
"""
Gibt alle verfügbaren phonetischen Daten zurück.
Returns:
Dict: Wörterbuch mit allen Laut-Buchstaben-Zuordnungen
"""
if not load_success:
print("Info: Phonetik-Daten wurden nicht geladen oder sind noch nicht verfügbar.")
return {"info": "Keine Phonetik-Daten verfügbar. Bitte befüllen Sie die Datei laut_buchstaben_zuordnung.txt."}
return {
"laute": list(phonetics_data["laut_to_buchstaben"].keys()),
"laut_to_buchstaben": phonetics_data["laut_to_buchstaben"],
"buchstaben_to_laut": phonetics_data["buchstaben_to_laut"],
"beispiele": phonetics_data["beispiele"],
"hinweise": phonetics_data["hinweise"]
}