Sprachenerkenner

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Lord Stweccys

Betreff: Sprachenerkenner

BeitragDi, Apr 13, 2010 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich les grad ein Buch über Codes und da stand auch was drin über die Häufigkeit von Buchstaben kurzerhand habe ich daraus ein kleines Prog in BMax geschrieben, welches erkennt, welche Sprache hauptsächlich in einem Textdokument vorkommt, die man auf das Prog gezogen hat. Klartext: Textdatei auf Enlisch oder Deutsch schreiben, Computer sagt, welche Sprache. An sich nicht so besonders, mich hat nur fasziniert, dass das schlicht anhand der Buchstaben und nicht der Wörter geschieht:

Wer kein BMax besitzt , oder einfach zu faul ist, das hier zu kopieren, und Windows hat: Hier gibts auch einen Link für die kompilierte Anwendung dazu: https://www.blitzforum.de/upload/file.php?id=8357

BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework BRL.System


AppTitle="Lord Stweccy's Sprachenerkenner"
Local letter_d:Float[26]
Local letter_e:Float[26]
Local letter_r:Float[26]
letter_d=[6.51,1.89,3.06,5.08,17.40,1.66,3.01,4.76,7.55,0.27,1.21,3.44,2.53,9.78,2.51,0.79,0.02,7.00,7.27,6.15,4.35,0.67,1.89,0.03,0.04,1.13]
letter_e=[8.2,1.5,2.8,4.3,12.7,2.2,2.0,6.1,7.0,0.2,0.8,4.0,2.4,6.7,7.5,1.9,0.1,6.0,6.3,9.1,2.8,1.0,2.4,0.2,2.0,0.1]

If Len(AppArgs)<2
Notify "Ziehe eine beliebige Textdatei auf mich und ich sage, dir in welcher Sprache sie vermutlich verfasst wurde (enlisch oder deutsch)"
End
EndIf


Local file:TStream=ReadFile(AppArgs[1])
If file=Null
Notify "Die Datei konnte nich gefunden werden!"
End
EndIf
Local count:Int

While Eof(file)=0
Local b:Int=ReadByte(file)
If b>=65 And b<=90' großbuchstaben
letter_r[b-65]=letter_r[b-65]+1
count=count+1
EndIf
If b>=97 And b<=122' kleinbuchstaben
letter_r[b-97]=letter_r[b-97]+1
count=count+1
EndIf
Wend
CloseFile file
If count=0
Notify "In dem Text konnten keine verwendbaren Buchstaben gefunden werden!"
End
EndIf



Local langc:Int

For Local i:Int=0 To 25
letter_r[i]=letter_r[i]/count*100
If Abs(letter_r[i]-letter_e[i])>Abs(letter_r[i]-letter_d[i])
langc=langc+1
EndIf
Next

If langc>14
Notify "Der Text ist wahrscheinlich Deutsch"
Else
Notify "Der Text ist wahrscheinlich Englisch"
EndIf
End
  • Zuletzt bearbeitet von Lord Stweccys am Di, Apr 13, 2010 18:10, insgesamt 3-mal bearbeitet

Progger93

BeitragDi, Apr 13, 2010 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
funktioniert eher schlecht als recht....

Habe einen kurzen deutschen Forenbeitrag getestet -> Englisch
Die Info über BlitzBasic von hier(deutsch) -> Deutsch
Und die ersten paar Zeilen vom Wiki-Artikel über Thomas Jefferson (deutsch) -> Englisch

Da kann man auf jeden Fall noch was verbessern. Mein Tipp wäre nach ganzen Wörtern wie "die","das","der","ein","eine","und","dass",... oder für Englisch "the","a","that","and",... zu suchen. Da wäre die Trefferchance deutlich höher.

EDIT: Habs jetzt nochmal mit ein paar langen Texten probiert und festgestellt dass es nun funktioniert Embarassed ...
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT
  • Zuletzt bearbeitet von Progger93 am Di, Apr 13, 2010 18:13, insgesamt einmal bearbeitet

C--

BeitragDi, Apr 13, 2010 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die idee finde ich gut, aber wie Progger93 schon sagte, ist die Trefferquote verbesserungswürdig.
Du könntest zum Beispiel auch noch eine Erkennung für Buchstaben einbauen (ä,ö,ü,ß, gibts ja im Englischen nicht).
Problem wird aber immer sein, dass wir ins Deutsche ja auch englische begriffe übernommen haben und das verfälscht ein wenig das ergebnis.

Xeres

Moderator

BeitragDi, Apr 13, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Progger93:
Für kurze Texte kann diese Methode nie funktionieren, da man für eine statistische Analyse nun mal möglichst viele Daten benötigt. Und ganze Wörter zu vergleichen, ist eben nicht der Sinn des Programms.
Theoretisch interessant.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Lord Stweccys

BeitragDi, Apr 13, 2010 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also meine Testtexte haben größtenteils funktioniert, manchmal gabs abweichungen, aber das war an der Obergrenze undich konnte durch eine Veränderung von langc erreichen, dass es richtig erkannt wurde.

Ja, okay, es ist nicht die perfekteste Methode, aber ich bin ganz zufrieden damit, weil diese Methode ganz schnell und simpel zu programmieren ist. Very Happy

PS: Mein Testtext bestand jeweils nur aus einem Satz. o-O

Lord Stweccys

BeitragDi, Apr 13, 2010 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, habe jetzt das Problem erkannt: In meinem Wahn, weil das mit einem Englischen Text nicht funktioniert hat, hab ich das limit für langc auf 16 angehoben. Es sollte sich aber im 13-15 Bereich bewegen.
[Link aktualisiert]

Midimaster

BeitragDi, Apr 13, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
mein vorschlag dazu wäre bestimmte 2er oder 3er-Buchstabenkombinationen zu checken, die fast nur in einer der Sprachen vorkommen. Da bleibt der Datenaufwand noch erträglich, aber die Trefferquote geht enorm hoch.

Um die Werte zu erhalten, könnte man ja viele bekannte Texte vergleichen und aber später nur signifikante Kombinationen in den Code übernehmen.

Ich denke da an das deutsche "ck" oder englische "a " (das mit leerzeichen danach).

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group