Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Spracherkennung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.02.2005, 13:52 Uhr
virtual
Sexiest Bit alive
(Operator)


Hier mal ein etwas umfangreicheres Rätsel/Aufgabe:

Wenn man die Buchstaben in texten zählt, so kann man anhand der Buchstabenhäufigkeit Rückschlüsse darauf ziehen, in welcher Sprache (Deutsch, Englisch, ...) der Text verfasst wurde.

In diesem Rästel soll nun folgendes Programm entwickelt werden. es kennt zwei Modi:

1. Lernmodus
Im Lernmodus wird das Programm mit einer Datei gefüttert und die Sprache mit angegeben: das Programm liest die Datei ein, bestimmt die Buchstabenhäufigkeiten und speichert in geeigneter Form die Daten ab, gleicht diese ggf mit zuvor bestimmten Buchstabenhäufigkeiten ab.

2. Ratemodus
Im Ratemodus wird das Programm mit einer Datei gefüttert und die Sprache nicht mit angegeben. Auch hier bestimmt das Programm die Buchstabenhäufigkeiten und ermittelt auf Basis der bisher gewonnenen Daten (aus dem lernmodus) die wahrscheinlichste Sprache.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.02.2005, 14:09 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


was ist par?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 11.02.2005 um 14:09 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.02.2005, 16:06 Uhr
kronos
Quotenfisch
(Operator)


Da ist wohl einer unter die Neurologen gegangen...
Tolle Aufgabe, kann leider erst Montag was schreiben.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 11.02.2005 um 16:10 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.02.2005, 16:23 Uhr
enno-tyrant
Frag nicht!


das wäre der teil1 (lernmodus) -> ist natürlich ausbaufähig


Code:
#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::cin;
using std::ifstream;
using std::ofstream;
using std::string;
using std::endl;

int main()
{
    // Buchstaben-Zähler
    int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0, k=0, l=0, m=0, n=0, o=0, p=0, q=0;
    int r=0, s=0, t=0, u=0, v=0, w=0, x=0, y=0, z=0, ae=0, oe=0, ue=0, sz=0;
    ifstream datei;
    ofstream toLearn;
    string pfad, sprache, buffer;
    cout << "Geben Sie den Namen inkl, Pfad der Datei ein: ";
    cin >> pfad;
    cout << "Geben Sie die Sprache der Datei ein:";
    cin >> sprache;
    datei.open(pfad.c_str());
    if(!datei){cout << "Fehler beim \x99""ffnen der Datei" << endl;}
    while(!datei.eof())
    {
        getline(datei,buffer);
    }
    datei.close();
    datei.clear();
    char puffer[buffer.size()];
    for(unsigned int index=0;index<buffer.size();++index)
    {
        puffer[index] = buffer[index];
    };
    for(unsigned int index=0;index<buffer.size();++index)
    {    
        if(puffer[index] == 'a' || puffer[i] == 'A'){a++;}
        else if(puffer[index] == 'b' || puffer[index] == 'B'){b++;}
        else if(puffer[index] == 'c' || puffer[index] == 'C'){c++;}
        else if(puffer[index] == 'd' || puffer[index] == 'D'){d++;}
        else if(puffer[index] == 'e' || puffer[index] == 'E'){e++;}
        else if(puffer[index] == 'f' || puffer[index] == 'F'){f++;}
        else if(puffer[index] == 'g' || puffer[index] == 'G'){g++;}
        else if(puffer[index] == 'h' || puffer[index] == 'H'){h++;}
        else if(puffer[index] == 'i' || puffer[index] == 'I'){i++;}
        else if(puffer[index] == 'j' || puffer[index] == 'J'){j++;}
        else if(puffer[index] == 'k' || puffer[index] == 'K'){k++;}
        else if(puffer[index] == 'l' || puffer[index] == 'L'){l++;}
        else if(puffer[index] == 'm' || puffer[index] == 'M'){m++;}
        else if(puffer[index] == 'n' || puffer[index] == 'N'){n++;}
        else if(puffer[index] == 'o' || puffer[index] == 'O'){o++;}
        else if(puffer[index] == 'p' || puffer[index] == 'P'){p++;}
        else if(puffer[index] == 'q' || puffer[index] == 'Q'){q++;}
        else if(puffer[index] == 'r' || puffer[index] == 'R'){r++;}
        else if(puffer[index] == 's' || puffer[index] == 'S'){s++;}
        else if(puffer[index] == 't' || puffer[index] == 'T'){t++;}
        else if(puffer[index] == 'u' || puffer[index] == 'U'){u++;}
        else if(puffer[index] == 'v' || puffer[index] == 'V'){v++;}
        else if(puffer[index] == 'w' || puffer[index] == 'W'){w++;}
        else if(puffer[index] == 'x' || puffer[index] == 'X'){x++;}
        else if(puffer[index] == 'y' || puffer[index] == 'Y'){y++;}
        else if(puffer[index] == 'z' || puffer[index] == 'Z'){z++;}
        else if(puffer[index] == '\x84' || puffer[index] == '\x8E'){ae++;}
        else if(puffer[index] == '\x94' || puffer[index] == '\x99'){oe++;}
        else if(puffer[index] == '\x81' || puffer[index] == '\x9A'){ue++;}
        else if(puffer[index] == '\xE1'){sz++;};
    };
    {
        toLearn.open(sprache.c_str());
        toLearn << "a=" << a << endl;
        toLearn << "b=" << b << endl;
        toLearn << "c=" << c << endl;
        toLearn << "d=" << d << endl;
        toLearn << "e=" << e << endl;
        toLearn << "f=" << f << endl;
        toLearn << "g=" << g << endl;
        toLearn << "h=" << h << endl;
        toLearn << "i=" << i << endl;
        toLearn << "j=" << j << endl;
        toLearn << "k=" << k << endl;
        toLearn << "l=" << l << endl;
        toLearn << "m=" << m << endl;
        toLearn << "n=" << n << endl;
        toLearn << "o=" << o << endl;
        toLearn << "p=" << p << endl;
        toLearn << "q=" << q << endl;
        toLearn << "r=" << r << endl;
        toLearn << "s=" << s << endl;
        toLearn << "t=" << t << endl;
        toLearn << "u=" << u << endl;
        toLearn << "v=" << v << endl;
        toLearn << "w=" << w << endl;
        toLearn << "x=" << x << endl;
        toLearn << "y=" << y << endl;
        toLearn << "z=" << z << endl;
        toLearn << "ä=" << ae << endl;
        toLearn << "ö=" << oe << endl;
        toLearn << "ü=" << ue << endl;
        toLearn << "ß=" << sz << endl;
        toLearn.close();
        toLearn.clear();
    };
}



--
...um etwas zu verstehen muß man wissen wie es funktioniert...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.02.2005, 16:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich glaub ja es hakt... wie wärs einfach mit nem array das du in abhängkeit was fürn buchstabe kommt inkrementierst... also einfach
if(isalpha(c)) ++array[toupper(c)' -'A')];

oder bist du ein freund der if- orgien...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.02.2005, 16:52 Uhr
enno-tyrant
Frag nicht!


, war eben das erste was mir einfiel
--
...um etwas zu verstehen muß man wissen wie es funktioniert...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.02.2005, 16:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich hab halt immer gleich perverse golf-gedanken... in dem fall anscheinend ausnahmsweise mal angebracht
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.02.2005, 13:09 Uhr
kronos
Quotenfisch
(Operator)


Okay, hier mal mein Ansatz. Ein super-primitives zwei-schichtiges neuronales Netzwerk, das sich mit einer Anzahl von input- und output-Neuronen (nin und nout) erzeugen lässt. Für jedes output-Neuron gibt es nin Verbindungen (zu jedem Input-Neuron eine) die unterschiedlich gewichtet sind.
Die Input Neuronen erfahren unterschiedlich starke Stimulierungen. Beim Training ist außerdem das aktive Output-Neuron gegeben. Die Verbindungen zwischen diesem und den aktiven Input-Neuronen werden dabei je nach der Aktivität nach einer bestimmten Regel verstärkt (learn_rule).
Im Rate-Modus werden zunächst nur die Input-Neronen stimuliert. Der Reiz wird an alles output-Neuronen weitergeleitet. Wie stark wird durch eine Regel (stim_rule) anhand der jeweiligen Verbindungs-Gewichtung errechnet. Nun wird das output-Neuron mit der insgesamt stärksten Stimulierung aktiv.

In diesem Fall würde man 27 Input Neuronen, für die Buchstaben im Alphabet (evtl. +Sonderzeichen) und soviele output-neuronen wie Sprachen verwenden. Der Stimulus der einzelnen Neuronen wäre die Häufgkeit im Text (0.0 bis 1.0).
Regeln:
Am Anfang haben alle Verbindungen den Wert 1.
learn_rule: Der bisherige Verbindungswert wird mit dem Stimulus multipliziert und zum alten Wert addiert
stim_rule: Der bisherige Verbindungswert wird mit dem Stimulus multipliziert und zum Stimulus addiert.

TODO:
- Das ganze in weniger stümperhaftes C++ portieren
- Es dominiert unberrechtigter Weise immer die Sprache, die am öftesten trainiert wird. Man bräuchte schlauere Regeln, die Verbindungen die selten verwendet werden degradieren, so dass ein hoher Stimulus auf eine selten verwendete Verbindung eine negative Stimulierung des Output-Neurons bewirkt.
- Der Parses ist tickt aus bei falsch formatierten files.
- Front-End fehlt noch. Das kommt noch, falls virtual den Ansatz als ausreichend bewertet.


C++:
#include <string>
#include <fstream>
#include <sstream>

class nn
{
    public:
        nn(int in, int out); // Anzahl Input-Parameter und der möglichen Lösungen
        nn(std::ifstream &file);
        ~nn();
        void train(int out,double*stim); // out: korrekte Antwort, stim: Array mit nout Werten
        int guess(double*stim); // raten der Antwort anhand der Eingabe
        void save(std::ofstream &file); // abspeichern

    protected:        
        int nin,nout; // Wieviele Eingabe- und Ausgabe-Punkte
        double**weights; // Die Gewichtung der Verbindungen zwischen ihnen
        virtual double learn_rule(double weight,double stim); // Wie sich die Verbindung beim Training verändert
        virtual double stim_rule(int out,double*stim); // Auswertung von Input anhand der Verbindungsstärken
    
};

nn::nn(int in, int out):nin(in),nout(out)
{
    weights=(double**)new double[nout][nin];
    for(out=0;out<nout;++out)
    {
        weights[out]=new double[nin];
        for(in=0;in<nin;++in)
            weights[out][in]=1.0;
    }
}

nn::nn(std::ifstream &file):nin(0),nout(0),weights(0)
{
    std::string line;
    while(getline(file,line))
    {
        weights=(double**)realloc(weights,(nout+1)*sizeof(double*));
        std::stringstream sline(line);
        
        if(!nin)
        {
            double d;
            while(!sline.eof())
                sline>>d,++nin;
            sline.str(line);
        }
        weights[nout]=new double[nin];
        int in=0;
        while(!sline.eof())
        {
            //if(in==nin) throw(ERROR);
            double d;
            sline>>weights[nout][in++];
        }
        ++nout;
    }
}
      
nn::~nn()
{
    for(int out=0;out<nout;++out)
        delete weights[out];
    delete weights;
}

void nn::train(int out,double *stim)
{
    for(int n=0;n<nin;++n)
        weights[out][n]=learn_rule(weights[out][n],stim[n]);
}

int nn::guess(double*stim)
{
    int num;
    double value=.0;
    for(int out=0;out<nout;++out)
    {
        double val=stim_rule(out,stim);
        if(val>value)
            value=val,num=out;
    }
    return num;
}

void nn::save(std::ofstream &file)
{
    for(int out=0;out<nout;++out)
    {
        for(int in=0;in<nin;++in)
            file <<weights[out][in]<<' ';
        file<<std::endl;
    }
}

double nn::stim_rule(int out,double*stim)
{
    double r=.0;
    for(int in=0;in<nin;++in)
        r+=stim[in]*weights[out][in];
    return r;
}

double nn::learn_rule(double weight,double stim)
{
    return weight+stim*weight;
}


--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 15.02.2005 um 13:11 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.02.2005, 17:43 Uhr
virtual
Sexiest Bit alive
(Operator)


@kronos
wirklich schöner Ansatz!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: