# Antwort bewerten (Nur etwas für Experten!)



## vollkommenegal (10. Jul 2006)

Hallo.

Ich schreibe an einem Prog, das die Eingaben des Users bewertet. Man gibt eine Musterlösung vor und vergleicht diese mit dem, was der User eingegeben hat.

Beispiel:
Musterlösung: Ich glaube, dass es heute regnen wird.
Userlösung: Ich glaube, das es heute regnen wird.

Bei der Bewertung werfe ich alle Interpunktionszeichen (Komma, Punkt, Fragezeichen usw.) raus und vergleiche dann die Worte. Meine Routine würde nun "das" herausgeben, da dies das erste falsche Wort in der Userlösung ist.

Nun soll seine Lösung eingefärbt werden:
Ich glaube, das es heute regnen wird.
(Wie das bei einem Eingabefeld geht, weiß ich auch noch nicht, wäre also für Vorschläge offen.  :wink:  )

Mein eigentliches Problem ist aber das Erkennen des falschen Wortes in der Userlösung. Bei dem obigen Beispiel ist das kein Problem, aber was ist bspw. mit

Musterlösung: Es ist möglich, dass eine lange Strecke keine Ebene ist.
Userlösung: Es ist möglich, dass keine lange Strecke keine Ebene ist.

Ab dem ersten "keine" ist seine Lösung falsch, aber wie soll ich das erkennen, wenn doch 2x "keine" in der Lösung vorkommt und durch das Entfernen der Interpunktionszeichen die Indizes nicht mehr stimmen?!

Die gleiche Problematik ergibt sich, wenn der User sich bei Worten verschrieben hat, die von einem Interpunktionszeichen umgeben sind: "Es kann seein, dass..."

Die Routine findet "seein" als falsches Wort, aber wie finde ich "seein" in der User-Lösung? Ich kann ja nicht nach "seein" suchen, denn es könnte bei kurzen Worten (z.B. "ein") sein, dass sie in einem anderen Wort ("ein" ist in "fein", "mein", "sein",...) stecken. Also muss ich nach " seein " suchen, um sicherzustellen, dass ich nach einem eigenständigen Wort suche. Diese Suche würde aber fehlschlagen, da " seein " nicht dasselbe wie " seein," ist. Und grundsätzlich mit allen Interpunktionszeichen ("seein," ",seein" ".seein" "seein." usw.) zu suchen, halte ich ebenfalls für nicht besonders effektiv, denn dabei könnten ebenfalls neue Sonderfälle entstehen.

Ich hoffe, ich habe verständlich erklären können, worum es geht. Würde mich über Ideen und Beispielcode (darf auch für PHP sein) freuen.  

cya


----------



## AlArenal (10. Jul 2006)

Das darfst du vermutlich sowas von knicken. Du müsstest zum einen mit einem umfangreichen Wörterbuch arbeiten und zum anderen mit einer Grammatikprüfung, wie sie in Textverarbeitungen benutzt werden. 
Wer beides kennt weiß, dass die alles andere als perfekt arbeiten. Wenn du da nichts supertolles und fertiges findest, worauf du aufbauen kannst, würde ich mir keine großen Chancen ausrechnen. Oder hast du auf Anhieb eine Idee wie die das komplette deutsche Vokabular und die komplette deutsche Grammatik inkl. Unregelmäßigkeiten, etc. abbilden willst?

Ich ziehe meinen Hut vor Leuten, die sich dafür Algorithmen überlegen und das mit der passenden Datenbasis so halbwegs hinbekommen.


----------



## vollkommenegal (10. Jul 2006)

> umfangreichen Wörterbuch arbeiten und zum anderen mit einer Grammatikprüfung


Ich wüsste spontan nicht, wie mir die helfen sollen.  



> Wenn du da nichts supertolles und fertiges findest


Deshalb meine Frage hier.
Es muss sich doch in all den Jahren mal jemand mit dieser Problematik auseinandergesetzt haben. Oder werden bei einem Quiz deshalb einfach nur 4 Antworten präsentiert und man muss die richtige Antwort anklicken? 
Hilfreich wäre auch ein Fachbegriff oder sowas, dann könnte ich meinen Freund Google fragen. Ich weiß im Moment nämlich nicht einmal, wonach ich suchen sollte. ("quiz bewertung" funktioniert nicht wirklich.)

cya


----------



## 0xdeadbeef (10. Jul 2006)

Tja, Du sagt es ja selber: nicht ohne Grund benutzen die meisten Quizprogramme "Multiple Choice".
Selbst die Parser von Textadventures stellten bloß Vermutungen über den eigentlich eingegebenen Befehl aus.
Sowas wie "Nimm Handtuch" ist relativ einfach zu bewerten. "Bitte, könntest Du nicht das Handtuch nehmen" würde aber mit 99%iger Sicherheit zu einem "Höh?" führen.
Wenn Du das vorliegende Problem lösen könntest, eine bestehende Aussage in natürlicher Sprache mit einer beliebig formulierten zweiten Aussage auf inhaltliche Gleichheit zu prüfen, hättest Du das Grundproblem künstlicher Intelligenz gelöst, an dem die Informatik schon mindestens seit 40 Jahren herumknabbert. Das halte ich für eher unwahrscheinlich.
Es bleiben die also zwei Möglichkeiten: benutze "Multiple Choice" oder eine sehr streng formalisierte Sprache. Es gibt ja durchaus "logische" Programmiersprachen wie Prolog, deren Syntax man für sowas heranziehen könnte.


----------



## AlArenal (10. Jul 2006)

0xdeadbeef hat gesagt.:
			
		

> Es gibt ja durchaus "logische" Programmiersprachen wie Prolog, deren Syntax man für sowas heranziehen könnte.



Das sind aber die echten Helden. Die in Zeiten von PHP, Java, C++ und Python noch Prolog und Lisp beherrschen. Ich taste mich derweil noch an Smalltalk heran - wenn ich nur mehr Zeit hätte


----------



## vollkommenegal (10. Jul 2006)

Na ja, ich hatte mir sowas schon gedacht, aber die Hoffnung stirbt ja bekanntlich zuletzt...   

Danke für die Antworten.

cya

P.S.: Prolog hatte ich im Studium. Ist ganz witzig und in einigen Bereichen sehr hilfreich, aber sehr gewöhnungsbedürftig.


----------



## Leroy42 (10. Jul 2006)

0xdeadbeef hat gesagt.:
			
		

> Es gibt ja durchaus "logische" Programmiersprachen wie Prolog, deren Syntax man für sowas heranziehen könnte.



Die Syntax von Prolog hat damit gar nichts zu tun.
Es stimmt allerdings, daß man in Prolog _natürlichsprachliche_ Muster relativ
leicht abbilden kann.


			
				AlArenal hat gesagt.:
			
		

> Das sind aber die echten Helden. Die in Zeiten von PHP, Java, C++ und Python noch Prolog und Lisp beherrschen. Ich taste mich derweil noch an Smalltalk heran - wenn ich nur mehr Zeit hätte



Ohh! Danke!    

Allerdings laß dir von jemanden, der sich mal im Bereich
Prolog in Verbindung mit Computerlinguistik während des Studiums 'rumgetrieben hat,
sagen, daß Prolog auch nicht _den Durchbruch_ bringen konnte und kann.
Die Komplexheit und Unlogik natürlicher Sprachen ist einfach zu verworren
um ihnen alleine mit logischen Programmiersprachen, gepaart mit ein paar Heuristiken,
näherzukommen.



			
				AlArenal hat gesagt.:
			
		

> Ich taste mich derweil noch an Smalltalk heran - wenn ich nur mehr Zeit hätte



Nimm sie dir: Es lohnt sich einmal eine *richtige* OOP-Sprache kennenzulernen, in
der sogar die Kontrollstrukturen selbst gecodet werden können !  

Methode der Klasse Block (Klasse deren Instanzen ausführbarer Code sind):


```
whileTrue: aBlock
  ^self value ifTrue: [aBlock value. self whileTrue: aBlock].
```

Aus Effizienzgründen wird diese Implementation allerdings
intern nicht verwendet.[/quote]


----------



## AlArenal (10. Jul 2006)

Leroy42 hat gesagt.:
			
		

> AlArenal hat gesagt.:
> 
> 
> 
> ...



Ist nur schade, dass die Nischen für solche Sprachen immer kleiner werden, auch wenn die Konzepte weiterleben (Java, Python, Ruby, GUI, MVC, Pattern, Extreme Programming, ...).


----------



## 0xdeadbeef (10. Jul 2006)

Leroy42 hat gesagt.:
			
		

> Die Syntax von Prolog hat damit gar nichts zu tun.
> Es stimmt allerdings, daß man in Prolog _natürlichsprachliche_ Muster relativ
> leicht abbilden kann.


Keine Ahnung, was Du da verstanden hast, aber sicher nicht das, was ich geschrieben habe...



> Allerdings laß dir von jemanden, der sich mal im Bereich
> Prolog in Verbindung mit Computerlinguistik während des Studiums 'rumgetrieben hat,
> sagen, daß Prolog auch nicht _den Durchbruch_ bringen konnte und kann.
> Die Komplexheit und Unlogik natürlicher Sprachen ist einfach zu verworren
> ...


Ok, jetzt _weiß_ ich, daß Du mein Posting in keiner Weise verstanden hast. Schade auch.


----------



## Roar (11. Jul 2006)

hmm kanns sein dass ihr das irgendwie verkompliziert oder bin ich nich experte genug dafür? 
so wie ich die frage verstehe, will er doch nur überprüfen, ob die worte mit denen der vorgegeben richtigen antwort übereinstimmen, und zwar in der richtigen reihenfolge und nicht mehr. ???:L
wenns wirklich nicht mehr ist, dann reicht es ja doch die sätze bei ihren whitespaces und interpunktionszeichen aufzuteilen und jedes wort mit dem der antwort zu vergleichen, welche man ebenso aufsplittet :autsch: :?: ???:L


----------



## Leroy42 (11. Jul 2006)

0xdeadbeef hat gesagt.:
			
		

> Ok, jetzt _weiß_ ich, daß Du mein Posting in keiner Weise verstanden hast. Schade auch.


 ???:L Mag sein!
Mir ist vor allem nicht klar, was


			
				0xdeadbeef hat gesagt.:
			
		

> Es gibt ja durchaus "logische" Programmiersprachen wie Prolog, deren Syntax man für sowas heranziehen könnte.


bedeuten soll.

Andererseits trifft dein Beispiel



			
				0xdeadbeef hat gesagt.:
			
		

> Sowas wie "Nimm Handtuch" ist relativ einfach zu bewerten. "Bitte, könntest Du nicht das Handtuch nehmen" würde aber mit 99%iger Sicherheit zu einem "Höh?" führen.



genau den Punkt was die Schwierigkeit betrifft, natürlichsprachliche Äußerungen
_zu verstehen._

Die Analyse der zweiten, negierten Frage bereitet zwar keine Schwierigkeiten,
aber die Zielrichtung dieser Formulierung ("Bitte...",  "könntest du nicht...") algorithmisch
zu erfassen, dürfte wohl noch eine lange Zeit auf sich warten lassen.

Aber egal, denn:



			
				Roar hat gesagt.:
			
		

> hmm kanns sein dass ihr das irgendwie verkompliziert oder bin ich nich experte genug dafür?



 Nein! Du liegst schon richtig. Nur hat sich der Thread irgendwie in diese Richtung entwickelt. :shock: 

Vermutlich weil wir in die Fragestellung des OPs etwas zuviel hineininterpretiert haben  ???:L


----------



## 0xdeadbeef (11. Jul 2006)

Wenn man  dem Benutzer erlaubt, eine beliebige natürlichsprachige Antwort einzugeben, die man mit einer Musterantwort vergleichen will, ist es recht unwahrscheinlich, daß zwei Benutzer die gleiche Antwort geben.
Der geschilderte Ansatz (wortweises vergleichen) war angesichts der Problemstellung naiv und in keiner Weise erfolgversprechend. Darauf hinzuweisen, dürfte kaum unter "Verkomplizieren" oder "Hereininterpretieren" fallen.

Mein Hinweis darauf, daß natürliche Sprache zu komplex ist, um Inhaltsgleichheit einfach zu überprüfen und mein Vorschlag, die Antworten in einer formalen Sprache mit klarer Syntax eingeben zu lassen, wurde komplett mißverstanden. Kann ich aber auch nichts für.

Ich denke mal, der Threadstarter hat eingesehen, daß er das Thema unterschätzt hat. Damit sollte es gut sein.


----------



## Leroy42 (11. Jul 2006)

0xdeadbeef hat gesagt.:
			
		

> Der geschilderte Ansatz (wortweises vergleichen) war angesichts der Problemstellung _naiv und in keiner Weise erfolgversprechend_. Darauf hinzuweisen, dürfte kaum unter "Verkomplizieren" oder "Hereininterpretieren" fallen.



Was der OP allem Anschein nach aber nicht bewußt war. Aus diesem Grund war dein "Hineininterpretieren" 
schon hilfreich für das, was er _eigentlich_ wollte, nur nicht gerade hilfreich formuliert hatte.



			
				0xdeadbeef hat gesagt.:
			
		

> und mein Vorschlag, die Antworten in einer formalen Sprache mit klarer Syntax eingeben zu lassen, wurde komplett mißverstanden.



Jetzt verstehe ich endlich was du gemeint hast.   



			
				0xdeadbeef hat gesagt.:
			
		

> Ich denke mal, der Threadstarter hat eingesehen, daß er das Thema unterschätzt hat. Damit sollte es gut sein.



Einverstanden!


----------



## Roar (11. Jul 2006)

Leroy42 hat gesagt.:
			
		

> Vermutlich weil wir in die Fragestellung des OPs etwas zuviel hineininterpretiert haben  ???:L


ja, vermutlich. ich sehe nirgendwo in der fragestellung etwas, was darauf hindeutet, dass sein programm deutsche sätze verstehen und auswerten soll :autsch:

egal, hier code, der das macht, was ich vermute, was der threadersteller will:


```
public static void main(String[] args) throws Exception {
		String s1 = "Ich glaube, dass es heute regnen wird. ";
		String s2 = "Ich glaube, das es heute regnen wird. ";
		String s3 = " Ich glaube   dass es heute 	regnen wird  ";
		check(s1, s2);
		check(s1, s3);
		s1 = "Es ist möglich, dass eine lange Strecke keine Ebene ist. ";
		s2 = "Es ist möglich, dass keine lange Strecke keine Ebene ist. ";
		check(s1, s2);
		s1 = "Seine eine hatte keine Beine, doch meine eine meinte: Blup";
		s2 = "Seine eine hatte keeine Beine, doch meine eine meinte: Blup";
		check(s1, s2);
	}

	private static void check(String s1, String s2) {
		String[] words1 = s1.trim().split("[\\s\\p{Punct}]+");
		String[] words2 = s2.trim().split("[\\s\\p{Punct}]+");
		for (int i = 0; i < words2.length; i++) {
			String word = words2[i];
			if (words1.length <= i) {
				System.out.printf("Fehler bei Wort %d: '%s'. Lösung zu lang.\n", i + 1, word);
				return;
			}
			if (!words1[i].equalsIgnoreCase(word)) {
				System.out.printf("Fehler bei Wort %d: '%s'. Erwartet: '%s'.\n", i + 1, word, words1[i]);
				return;
			}
		}
		System.out.println("Lösung richtig.");
	}
```


----------



## Kola (11. Jul 2006)

Ich glaube, "Alphakorrelation" ist hierzu ein Schlagwort. Ich habe das mal benutzt, aber nicht in Java! Ist auch nicht schwer zu implementieren!


----------



## 0xdeadbeef (11. Jul 2006)

Korrelation hilf Dir hier nicht wirklich weiter. Zwei Sätze können sehr ähnlich sein und trotzdem unterschiedliche Dinge aussagen. Oder aber sie sind sehr unähnlich und sagen trotzdem das gleiche aus.


----------

