Dragon hat geschrieben:wieso rechnest du bei der stringliste in der schleife -3.
und kann man da überhaupt mit einer stringliste arbeiten ich meine muss dann jedes wort nicht in einer extra zeil vorliegen?
habe ich nun im Code erklärt
Dragon hat geschrieben:wieso rechnest du bei der stringliste in der schleife -3.
und kann man da überhaupt mit einer stringliste arbeiten ich meine muss dann jedes wort nicht in einer extra zeil vorliegen?
Edit1:Danke für die erweiterten kommentare
habs so mal probiert das programm crasht dann aber mit "EStringListError: List index (416) out of bounds"
Code: Alles auswählen
var
database: array of Statistiken;
content: string;
s: string;
//Analyse der Textlänge
Text: string;
Anzahl: longint;
sanzahl: string;
//Allgemeine schleifenzähler
i: integer;
i2: integer;
//DAtenbank befüllung
Prozent: single;
sProzent: string;
step: single;
found: boolean;
// w : byte;
//wort : array[1..3] of string;
sl: TStringList;
//wort1, wort2, folgewort: string;
start, T1, T2, t3: word;
begin
Code: Alles auswählen
type
Statistiken = record
Wort1: string;
Wort2: string;
Folgewort: string;
Anzahl: word;
Vorkommen: byte;
end;
Code: Alles auswählen
procedure MessageProc(AUser: PChar; AChannel: PChar; AMessage: PChar);
var
database: array of Statistiken;
content: string;
s: string;
//Analyse der Textlänge
Text: string;
Anzahl: longint;
sanzahl: string;
//Allgemeine schleifenzähler
i: integer;
i2: integer;
//DAtenbank befüllung
Prozent: single;
sProzent: string;
step: single;
found: boolean;
// w : byte;
//wort : array[1..3] of string;
sl: TStringList;
//wort1, wort2, folgewort: string;
start, T1, T2, t3: word;
begin
Content := AMessage;
//Datenbankgeneriereung
if AnsiStartsText('!markov add ', Content) then
begin
s := Copy(Content, 13, length(Content));
//Lade text und zähle wörter
Text := Loadfile('./markovtexte/' + s);
Anzahl := Wordcount(Text);
writeln(anzahl);
sanzahl := IntToStr(Anzahl);
irc.say(Achannel, PChar('Woerter im zu einlesendem text ' + sAnzahl));
i := 1;
sl := TStringList.Create;
sl.Delimiter := ' '; // Leerzeichen als Wort Trenner
sl.QuoteChar := #$0; // keine " als Maskierung
sl.DelimitedText := Text; // durch diese Zuordnung wird der Zugewiesene Text in einzelne Strings
// (Worte in diesem Fall unterteilt)
// dann kannst du dir alles ausschneiden ersparen
for i := 0 to sl.Count - 3 do
// die Schleife beginnt bei 0 (erstes Wort) und aus den letzten zwei Worten kannst Du keine
// dreierkombinationen machen das würde zu Zugriffsverletzungen führen
begin
found := False;
if length(Database) > 0 then
begin
for i2 := 0 to length(Database) - 1 do
begin
if (Database[i2].Wort1 = sl.strings[i]) and (Database[i2].Wort2 = sl.strings[i + 1]) and (Database[i2].Folgewort = sl.strings[i + 2]) then
begin
Inc(Database[i2].Anzahl);
found := True;
break;
end;
end;
end;
if not found then
begin
t2 := length(Database);
Setlength(Database, t2 + 1);
Database[t2].Wort1 := sl.strings[i];
Database[t2].Wort2 := sl.strings[i + 1];
Database[t2].Folgewort := sl.strings[i + 2];
Database[t2].Anzahl := 1;
end;
end;
sl.Free;
Writeln(database[1].wort1 + database[1].wort2 + database[1].folgewort); writeln(Database[1].anzahl);
Writeln(database[2].wort1 + database[2].wort2 + database[2].folgewort); writeln(Database[2].anzahl);
Writeln(database[3].wort1 + database[3].wort2 + database[3].folgewort); writeln(Database[3].anzahl);
Writeln(database[4].wort1 + database[4].wort2 + database[4].folgewort); writeln(Database[4].anzahl);
//Baue satzvergleichsdatenbank auf
//Berechne wahrscheinlichkeiten
end;
Code: Alles auswählen
var
// start, T1, T2 : word; // word 0 .. 65535
T2: Cardinal;
Code: Alles auswählen
type
Statistiken = record
Wort1: string;
Wort2: string;
Folgewort: array of string;
Anzahl: array of integer;
Vorkommen: array of byte;
end;
var
database: array of Statistiken;
Code: Alles auswählen
procedure MessageProc(AUser: PChar; AChannel: PChar; AMessage: PChar);
var
// database: array of Statistiken;
content: string;
s: string;
//Analyse der Textlänge
Text: string;
//Allgemeine schleifenzähler
i: integer;
i2: integer;
i3: integer;
found: boolean;
sl: TStringList;
t2 : qword;
begin
Content := AMessage;
//Datenbankgeneriereung
if AnsiStartsText('!markov add ', Content) then
begin
s := Copy(Content, 13, length(Content));
//Lade text und zähle wörter
Text := Loadfile('./markovtexte/' + s);
{Anzahl := Wordcount(Text);
writeln(anzahl);
sanzahl := IntToStr(Anzahl);
irc.say(Achannel, PChar('Woerter im zu einlesendem text ' + sAnzahl));}
i := 1;
sl := TStringList.Create;
sl.Delimiter := ' '; // Leerzeichen als Wort Trenner
sl.QuoteChar := #$0; // keine " als Maskierung
sl.DelimitedText := Text; // durch diese Zuordnung wird der Zugewiesene Text in einzelne Strings
// (Worte in diesem Fall unterteilt)
// dann kannst du dir alles ausschneiden ersparen
for i := 0 to sl.Count - 3 do
// die Schleife beginnt bei 0 (erstes Wort) und aus den letzten zwei Worten kannst Du keine
// dreierkombinationen machen das würde zu Zugriffsverletzungen führen
begin
found := False;
if length(Database) > 0 then
begin
//Überprüft nach vorhandensein von doppelpaaren
for i2 := 0 to length(Database) - 1 do
begin
if (Database[i2].Wort1 = sl.strings[i]) and (Database[i2].Wort2 = sl.strings[i + 1]) then
begin
//innerhalb der wortgruppe nach übereinstimmung suchen
for i3 := 0 to length(Database[i2].Folgewort)-1do
begin
if Database[i2].Folgewort[i3] = sl.strings[i + 2] then
begin
Inc(Database[i2].Anzahl[i3]);
found := True;
break;
end
else
begin
//ohne übereinstimmung neuen untereintrag in wortpaar anlegen
t2 := length(Database[i2].Folgewort);
Setlength(Database[i2].Folgewort, t2 + 1);
Setlength(Database[i2].Anzahl, t2 + 1);
Database[i2].Folgewort[i3] := sl.strings[i + 2];
Database[i2].Anzahl[i3] := 1;
found := true;
break;
end;
end;
end;
end;
end;
if not found then
begin
//ohne worthauptgruppe neue wortpaarhauptgruppe anlegen
t2 := length(Database);
Setlength(Database, t2 + 1);
Setlength(Database[i2].Folgewort, length(Database[i2].Folgewort)+ 1);
Setlength(Database[i2].Anzahl, length(Database[i2].Folgewort)+ 1);
Database[t2].Wort1 := sl.strings[i];
Database[t2].Wort2 := sl.strings[i + 1];
Database[t2].Folgewort[1] := sl.strings[i + 2];
Database[t2].Anzahl[1] := 1;
end;
end;
sl.Free;
//Debugoutput
Writeln(database[0].wort1 + database[0].wort2 + database[0].folgewort[0]); writeln(Database[0].anzahl[0]);
Writeln(database[0].wort1 + database[0].wort2 + database[0].folgewort[1]); writeln(Database[0].anzahl[1]);
Writeln(database[0].wort1 + database[0].wort2 + database[0].folgewort[2]); writeln(Database[0].anzahl[2]);
//Baue satzvergleichsdatenbank auf
//Berechne wahrscheinlichkeiten
end