Modelleren en Programmeren Jeroen Bransen
16 december 2015 Tentamen Case study: Automatische taalherkenning Modelleren Specificeren Implementeren Modelleren Implementeren
Tentamen
Tentamen
Vrijdag 22 januari van 17.00 - 20.00 in Educatorium Gamma.
Case study: Automatische taalherkenning
Programmeer-cyclus
Modelleren
Modelleren Gedicht Jabberwocky (Lewis Carrol): ’Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe.
Es brillig war. Die schlichten Toven Wirrten un wimmelten in Waben; Und aller-mümsigen Burggroven Die mohmen Räth’ ausgraben.
Il brigue: les tôves libricilleux Se gyrent en vrillant dans la guave. Enmîmés sont les goubebosqueux Et le mômerade horsgrave.
’t Was bradig en de slijp’le torfs Driltolden op de wijde weep. Misbrozig stonden borogorfs ’t Verdwoolde grasvark schreep.
Modelleren Gedicht Jabberwocky (Lewis Carrol): ’Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe.
Es brillig war. Die schlichten Toven Wirrten un wimmelten in Waben; Und aller-mümsigen Burggroven Die mohmen Räth’ ausgraben.
Il brigue: les tôves libricilleux Se gyrent en vrillant dans la guave. Enmîmés sont les goubebosqueux Et le mômerade horsgrave.
’t Was bradig en de slijp’le torfs Driltolden op de wijde weep. Misbrozig stonden borogorfs ’t Verdwoolde grasvark schreep.
Welke talen zijn dit?
Modelleren Gedicht Jabberwocky (Lewis Carrol): ’Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe.
Es brillig war. Die schlichten Toven Wirrten un wimmelten in Waben; Und aller-mümsigen Burggroven Die mohmen Räth’ ausgraben.
Il brigue: les tôves libricilleux Se gyrent en vrillant dans la guave. Enmîmés sont les goubebosqueux Et le mômerade horsgrave.
’t Was bradig en de slijp’le torfs Driltolden op de wijde weep. Misbrozig stonden borogorfs ’t Verdwoolde grasvark schreep.
Welke talen zijn dit? (Engels, Duits, Frans, Nederlands)
Modelleren
I
Je kunt de taal herkennen zonder de woorden te begrijpen
Modelleren
I
Je kunt de taal herkennen zonder de woorden te begrijpen
I
Patronen in woorden
Modelleren
I
Je kunt de taal herkennen zonder de woorden te begrijpen
I
Patronen in woorden
I
Relatieve frequenties van letters: computer kan heel goed tellen!
Modelleren
Aanpak: I
Bepaal de letterfrequentie van de onbekende tekst
Modelleren
Aanpak: I
Bepaal de letterfrequentie van de onbekende tekst
I
Vergelijk die met opgeslagen frequentie-tabellen van diverse talen
Modelleren
Aanpak: I
Bepaal de letterfrequentie van de onbekende tekst
I
Vergelijk die met opgeslagen frequentie-tabellen van diverse talen
I
De “best passende” is het!
Modelleren
Aanpak: I
Bepaal de letterfrequentie van de onbekende tekst
I
Vergelijk die met opgeslagen frequentie-tabellen van diverse talen
I
De “best passende” is het!
Modelleren
Aanpak: I
Bepaal de letterfrequentie van de onbekende tekst
I
Vergelijk die met opgeslagen frequentie-tabellen van diverse talen
I
De “best passende” is het! (misschien)
Modelleren
I
In plaats van kant-en-klare tabellen, gebruiken we voorbeeldteksten
Modelleren
I
In plaats van kant-en-klare tabellen, gebruiken we voorbeeldteksten
I
Programma kan daar zelf wel voor turven
Modelleren
I
In plaats van kant-en-klare tabellen, gebruiken we voorbeeldteksten
I
Programma kan daar zelf wel voor turven
I
Is dit nou Kunstmatige Intelligentie?
Modelleren
I
In plaats van kant-en-klare tabellen, gebruiken we voorbeeldteksten
I
Programma kan daar zelf wel voor turven
I
Is dit nou Kunstmatige Intelligentie?
Modelleren
I
In plaats van kant-en-klare tabellen, gebruiken we voorbeeldteksten
I
Programma kan daar zelf wel voor turven
I
Is dit nou Kunstmatige Intelligentie? Ja, subsymbolische kunstmatige intelligentie
Specificeren
Specificeren
Specificeren
Hoe vergelijk je frequentietabellen?
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
I
Tekstlengte maakt niet uit, dus neem relatieve frequentie
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
I
Tekstlengte maakt niet uit, dus neem relatieve frequentie
I
Minder a’s mogen extra b’s niet compenseren, dus gebruik voor verschil altijd positief getal
Ontwerp
I
class TurfTabel: om letters te tellen
Ontwerp
I
class TurfTabel: om letters te tellen
I
class Taal extends Frame: gebruikersinterface
Implementeren
Implementatie
public class Taal extends Frame implements ActionListener { TextArea tekst; Label uitvoer; TextField[] taal; TextField[] url; final int aantal = 10; // ... }
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld;
onbekend = new TurfTabel(); onbekend.turf(tekst.getText());
voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText());
}
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld;
onbekend = new TurfTabel(); onbekend.turf(tekst.getText());
for (int i = 0; i < aantal; i++) { voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText());
} }
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld;
onbekend = new TurfTabel(); onbekend.turf(tekst.getText());
for (int i = 0; i < aantal; i++) { voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText()); verschil = onbekend.verschil(voorbeeld);
} }
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld;
onbekend = new TurfTabel(); onbekend.turf(tekst.getText());
for (int i = 0; i < aantal; i++) { voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText()); verschil = onbekend.verschil(voorbeeld); if (verschil < kleinste) { kleinste = verschil; } } }
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld;
onbekend = new TurfTabel(); onbekend.turf(tekst.getText()); kleinste = 26.0; antwoord = "niet te bepalen"; for (int i = 0; i < aantal; i++) { voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText()); verschil = onbekend.verschil(voorbeeld); if (verschil < kleinste) { kleinste = verschil; antwoord = taal[i].getText(); } } uitvoer.setText(antwoord); }
Implementatie public void actionPerformed(ActionEvent e) { TurfTabel onbekend, voorbeeld; double kleinste, verschil; String naam, antwoord; onbekend = new TurfTabel(); onbekend.turf(tekst.getText()); kleinste = 26.0; antwoord = "niet te bepalen"; for (int i = 0; i < aantal; i++) { voorbeeld = new TurfTabel(); voorbeeld.leesUrl(url[i].getText()); verschil = onbekend.verschil(voorbeeld); if (verschil < kleinste) { kleinste = verschil; antwoord = taal[i].getText(); } } uitvoer.setText(antwoord); }
Turftabel
public class TurfTabel { int[] tellers; int totaal; public public public public
TurfTabel() { ... } void turf(String s) { ... } double verschil(TurfTabel andere) { ... } void leesUrl(String naam) { ... }
private void turf(char c) { ... } }
Turftabel public class TurfTabel { int[] tellers; int totaal; public TurfTabel() { tellers = new int[26]; for(int i = 0; i < tellers.length; i++) tellers[i] = 0; } public void turf(String s) { for (int i = 0; i < s.length(); i++) turf(s.charAt(i)); } // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. private void turf(char c) {
tellers[c - ’a’]++; totaal++; } // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. private void turf(char c) { if (c >= ’A’ && c <= ’Z’) { tellers[c - ’A’]++; totaal++; } else if (c >= ’a’ && c <= ’z’) { tellers[c - ’a’]++; totaal++; } } // .. }
Specificeren
Hoe vergelijk je frequentietabellen?
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
I
Tekstlengte maakt niet uit, dus neem relatieve frequentie
Specificeren
Hoe vergelijk je frequentietabellen? I
Totaal verschil over alle letters
I
Tekstlengte maakt niet uit, dus neem relatieve frequentie
I
Minder a’s mogen extra b’s niet compenseren, dus gebruik voor verschil altijd positief getal
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. public double relatief(int i) { } public double verschil(TurfTabel andere) {
} // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. public double relatief(int i) { return (double) tellers[i] / totaal; } public double verschil(TurfTabel andere) {
} // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. public double relatief(int i) { return (double) tellers[i] / totaal; } public double verschil(TurfTabel andere) { double totaal = 0.0; for (int i = 0; i < 26; i++) totaal += Math.abs(this.relatief(i) - andere.relatief(i)); return totaal; } // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. public void leesUrl(String naam) {
} // .. }
Turftabel public class TurfTabel { int[] tellers; int totaal; // .. public void leesUrl(String naam) { BufferedReader reader; String s; reader = new BufferedReader( new InputStreamReader( new URL(naam) .openConnection() .getInputStream())); while ((s = reader.readLine()) != null) turf(s); } // .. }
Modelleren
Modelleren
I
Onze voorbeeldteksten komen van het internet
Modelleren
I
Onze voorbeeldteksten komen van het internet
I
Maar dat is HTML:
Klik hier
Modelleren
I
Onze voorbeeldteksten komen van het internet
I
Maar dat is HTML:
Klik hier
I
De tags verstoren de telling!
Implementeren
Turftabel public class TurfTabel { boolean teltmee = true; // .. private void turf(char c) { if (c == ’<’) teltmee = false; else if (c == ’>’) teltmee = true; else if (teltmee) { // Originele code van turf } } // .. }
Programmeer-cyclus
Het werkt!