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:22] – [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)) {{: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 ======
Zeile 116: Zeile 114:
  */      */    
 public void lerneText(String text, int grad) { public void lerneText(String text, int grad) {
-        this.grad = grad; +    this.grad = grad; 
-        uebergaenge.clear();+    uebergaenge.clear();
  
-        for (int i = 0; i < text.length() - grad; i++) { +    for (int i = 0; i < text.length() - grad; i++) { 
-            // Hier wird das "Zustandsfenster" der Länge grad +        // Hier wird das "Zustandsfenster" der Länge grad 
-            // über den Text "geschoben" +        // über den Text "geschoben" 
-            String zustand = text.substring(i, i + grad); +        String zustand = text.substring(i, i + grad); 
-            // Das ist das Zeichen, das auf den aktuellen Zustand folgt +        // Das ist das Zeichen, das auf den aktuellen Zustand folgt 
-            char naechstesZeichen = text.charAt(i + grad); +        char naechstesZeichen = text.charAt(i + grad); 
-            // Lerne den gefundenen Übergang +        // Lerne den gefundenen Übergang 
-            lerneUebergang(zustand, naechstesZeichen); +        lerneUebergang(zustand, naechstesZeichen); 
-        }+    }
 } }
  
Zeile 135: Zeile 133:
  */      */    
 public void lerneUebergang(String zustand, char naechstesZeichen) { public void lerneUebergang(String zustand, char naechstesZeichen) {
-        // Versuche die Übergangs-Map für den aktuellen Zustand zu lesen +    // Versuche die Übergangs-Map für den aktuellen Zustand zu lesen 
-        Map<Character, Integer> folgeZeichenMap = uebergaenge.get(zustand); +    Map<Character, Integer> folgeZeichenMap = uebergaenge.get(zustand); 
-        // Wenn es für den Zustand noch keine Einträge gibt... +    // Wenn es für den Zustand noch keine Einträge gibt... 
-        if(folgeZeichenMap == null) { +    if(folgeZeichenMap == null) { 
-            // Zuerst eine neue Map für die Folgezeichen anlegen. Die ist erst mal leer... +       // Zuerst eine neue Map für die Folgezeichen anlegen. Die ist erst mal leer... 
-            uebergaenge.put(zustand, new HashMap<>()); +       uebergaenge.put(zustand, new HashMap<>()); 
-        +    
-        // Jetzt gibt es für den Zustand auf alle Fälle ein Map mit den Folgezeichen +    // 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 +    // Nun muss man entscheiden, ob das aktuelle Folgezeichen neu da rein muss 
-        // oder ob nur seine Anzahl erhöht werden muss. +    // oder ob nur seine Anzahl erhöht werden muss. 
-        folgeZeichenMap = uebergaenge.get(zustand); +    folgeZeichenMap = uebergaenge.get(zustand); 
-        Integer anzahl = folgeZeichenMap.get(naechstesZeichen); +    Integer anzahl = folgeZeichenMap.get(naechstesZeichen); 
-        if(anzahl == null || anzahl == 0) { +    if(anzahl == null || anzahl == 0) { 
-            folgeZeichenMap.put(naechstesZeichen, 1); +        folgeZeichenMap.put(naechstesZeichen, 1); 
-        } else { +    } else { 
-            folgeZeichenMap.put(naechstesZeichen, anzahl + 1); +        folgeZeichenMap.put(naechstesZeichen, anzahl + 1); 
-        +    
-        uebergaenge.put(zustand, folgeZeichenMap);+    uebergaenge.put(zustand, folgeZeichenMap);
 } }
 </code> </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.1739989320.txt.gz
  • Zuletzt geändert: 19.02.2025 18:22
  • von Frank Schiebel