faecher:informatik:oberstufe:machine_learning:mljs:markow:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:machine_learning:mljs:markow:start [19.02.2025 18:09] – [Die wichtigsten Bestandteile:] Frank Schiebelfaecher:informatik:oberstufe:machine_learning:mljs:markow:start [19.02.2025 20:52] (aktuell) – [Die wichtigsten Bestandteile:] Frank Schiebel
Zeile 1: Zeile 1:
 +{{:faecher:informatik:oberstufe:machine_learning:mljs:markow:256px-aamarkov.jpg?140 |}}((https://commons.wikimedia.org/wiki/File:AAMarkov.jpg))
 ====== Texterzeugung mit Herrn Markow ====== ====== Texterzeugung mit Herrn Markow ======
 +
  
 Ein [[https://de.wikipedia.org/wiki/Markow-Kette|Markow-Prozess]] - benannt nach dem russischen Mathematiker Andrei Andrejewitsch Markow - ist ein mathematisches Modell, das verwendet wird, um die zukünftige Entwicklung eines Systems vorherzusagen. Es basiert auf der Idee, dass die zukünftige Entwicklung des Systems nur von seinem aktuellen Zustand abhängt und nicht von seiner gesamten Vergangenheit. Ein [[https://de.wikipedia.org/wiki/Markow-Kette|Markow-Prozess]] - benannt nach dem russischen Mathematiker Andrei Andrejewitsch Markow - ist ein mathematisches Modell, das verwendet wird, um die zukünftige Entwicklung eines Systems vorherzusagen. Es basiert auf der Idee, dass die zukünftige Entwicklung des Systems nur von seinem aktuellen Zustand abhängt und nicht von seiner gesamten Vergangenheit.
Zeile 58: Zeile 60:
 ==== Die wichtigsten Bestandteile: ==== ==== Die wichtigsten Bestandteile: ====
  
-=== uebergaenge === 
  
- +{{:faecher:informatik:oberstufe:machine_learning:mljs:markow:puzzle.png |}}''uebergaenge'': Das ist eine  [[faecher:informatik:oberstufe:java:algorithmen:assoziative_arrays:start|HashMap]], das den Übergangsgraphen speichert. Dort wird festgehalten, welche Folgezeichen zu einem aktuellen Zustand erlaubt sind. 
-''uebergaenge'': Das ist eine  [[faecher:informatik:oberstufe:java:algorithmen:assoziative_arrays:start|HashMap]], das den Übergangsgraphen speichert. Dort wird festgehalten, welche Folgezeichen zu einem aktuellen Zustand erlaubt sind. +
 <code java> <code java>
 private Map<String, Map<Character, Integer>> uebergaenge; private Map<String, Map<Character, Integer>> uebergaenge;
Zeile 106: Zeile 106:
  
  
 +----  
 +{{:faecher:informatik:oberstufe:machine_learning:mljs:markow:puzzle.png |}}Die Methoden ''lerneText(String textQuelle, int grad)'' und ''lerneUebergang(String letzteZeichen, char naechstesZeichen)'':
 +
 +<code java>
 +/**
 +   Lerne Text
 + */    
 +public void lerneText(String text, int grad) {
 +    this.grad = grad;
 +    uebergaenge.clear();
 +
 +    for (int i = 0; i < text.length() - grad; i++) {
 +        // Hier wird das "Zustandsfenster" der Länge grad
 +        // über den Text "geschoben"
 +        String zustand = text.substring(i, i + grad);
 +        // Das ist das Zeichen, das auf den aktuellen Zustand folgt
 +        char naechstesZeichen = text.charAt(i + grad);
 +        // Lerne den gefundenen Übergang
 +        lerneUebergang(zustand, naechstesZeichen);
 +    }
 +}
 +
 +/**
 + * Hier wird ein gefundener Übergang überprüft und 
 + * passend in der HashMap eingetragen
 + */    
 +public void lerneUebergang(String zustand, char naechstesZeichen) {
 +    // Versuche die Übergangs-Map für den aktuellen Zustand zu lesen
 +    Map<Character, Integer> folgeZeichenMap = uebergaenge.get(zustand);
 +    // Wenn es für den Zustand noch keine Einträge gibt...
 +    if(folgeZeichenMap == null) {
 +       // Zuerst eine neue Map für die Folgezeichen anlegen. Die ist erst mal leer...
 +       uebergaenge.put(zustand, new HashMap<>());
 +    }
 +    // Jetzt gibt es für den Zustand auf alle Fälle ein Map mit den Folgezeichen
 +    // Nun muss man entscheiden, ob das aktuelle Folgezeichen neu da rein muss
 +    // oder ob nur seine Anzahl erhöht werden muss.
 +    folgeZeichenMap = uebergaenge.get(zustand);
 +    Integer anzahl = folgeZeichenMap.get(naechstesZeichen);
 +    if(anzahl == null || anzahl == 0) {
 +        folgeZeichenMap.put(naechstesZeichen, 1);
 +    } else {
 +        folgeZeichenMap.put(naechstesZeichen, anzahl + 1);
 +    }
 +    uebergaenge.put(zustand, folgeZeichenMap);
 +}
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A3) === 
 +
 +Vollziehe am Wort ''kakaopulver'' mit dem Grad 2 nach, was die beiden Methoden machen. Welche Übergänge sind am Ende des Lernprozesses in der HashMap ''uebergaenge'' abgelegt?
 +
 +Du kannst das mit dem Markow-Texter überprüfen, indem du den Text ''kakaopulver'' in die Datei ''experiment.txt'' einträgst und das Programm lernen lässt. 
 +
 +++++ Hilfestellung: Schritt 1 |
 +{{ :faecher:informatik:oberstufe:machine_learning:mljs:markow:lernen01.png |}}
 +++++
 +++++ Hilfestellung: Schritt 2 |
 +{{ :faecher:informatik:oberstufe:machine_learning:mljs:markow:lernen02.png |}}
 +++++
 +
 +++++ Hilfestellung: Schritt 3 |
 +{{ :faecher:informatik:oberstufe:machine_learning:mljs:markow:lernen03.png |}}
 +++++
 +
 +++++ Hilfestellung: Ergebnis |
 +{{ :faecher:informatik:oberstufe:machine_learning:mljs:markow:lernen_fertig.png |}}
 +++++
 +
 +----  
 +{{:faecher:informatik:oberstufe:machine_learning:mljs:markow:puzzle.png |}}Die Methoden ''erzeugeText(String anfang, int laenge)'' und ''zufaelligerUebergang(String aktuellerZustand)'':
 +
 +<code java>
 +/**
 +*   Erzeuge Text
 +*/   
 +public String erzeugeText(String anfang, int laenge) {
 +
 +  String aktuellerZustand = anfang;
 +  StringBuilder resultat = new StringBuilder(anfang);
 +
 +  for (int i = 0; i < laenge; i++) {
 +      char naechstesZeichen = zufaelligerUebergang(aktuellerZustand);
 +      aktuellerZustand = aktuellerZustand.substring(1) + naechstesZeichen;
 +      resultat.append(naechstesZeichen);
 +  }
 +  return resultat.toString().replaceAll("N","\n"); 
 +}
 +
 +/**
 +* Wählt ein zufälliges Folgezeichen. Die Häufigkeit der Zeichen wird 
 +* nicht berücksichtigt. 
 +*/
 +char zufaelligerUebergang(String aktuellerZustand) {
 +  Map<Character, Integer> folgeZeichen = uebergaenge.get(aktuellerZustand);
 +
 +  if(folgeZeichen != null) {
 +      // Zufalsgenerator initialisieren
 +      Random generator = new Random();
 +      // Die Keys der HashMap in ein Array umwandeln. Diese Methode 
 +      // funktioniert nur, wenn alleZeichen eine Array vom Typ 
 +      // Object ist. 
 +      Object[] alleZeichen = folgeZeichen.keySet().toArray();
 +      // mit generator.nextInt(alleZeichen.length) wird eine Zufallszahl erzeugt
 +      // die über den Index ein zufälliges Element auswählt. 
 +      // Bevor das Element zurückgegen werden kann, muss es nach char 
 +      // gecastet werden.
 +      return (char) alleZeichen[generator.nextInt(alleZeichen.length)];
 +  } else {
 +      return ' ';
 +  }
 +}
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A4) === 
 +
 +Vollziehe nach wie das Erzeugen von Texten abläuft.
 +
 +  * Erstelle eine Methode ''public char gewichteterUebergang(String aktuellerZustand)'', der bei der Auswahl des nächsten Zeichens die Häufigkeiten der Zeichen berücksichtigt
 +  * Für Fortgeschrittene: Dupliziere den Markow-Texter in ein neues BlueJ-Projekt und passe dieses so an, dass er Wörter lernt anstatt Zeichen, so dass das jeweils nächste Wort anhand der vorhergehenden Worte bestimmt wird. 
  • faecher/informatik/oberstufe/machine_learning/mljs/markow/start.1739988576.txt.gz
  • Zuletzt geändert: 19.02.2025 18:09
  • von Frank Schiebel