![]() |
Worthäufigkeit bestimmen
Gegeben ist eine Textdatei, Es soll jetzt die Anzahl jedes Wortes ermittelt werden. Hat da jemand eine Idee, wie man da ansetzten könnte? Oder gar schon fertigen Quellcode parat?
So, selbst ist der einsame Programmierer :mrgreen: :
Delphi-Quellcode:
sl ist die Liste mit Worten deren Häufigkeit ermittelt werden soll, Text der Text in dem die Worthäufigkeit ermittelt werden soll und WordArray sieht so aus:
procedure Occurence(sl: TStrings; Text: String; var WordArray: TWordArray);
var Loop: Cardinal; FoundPos: Cardinal; bFound: Boolean; s: String; Count: Cardinal; begin FoundPos := 0; bFound := True; Count := 0; // Wortliste durchgehen for Loop := 0 to sl.Count-1 do begin while bFound do begin // Wort aus Wortliste holen s := sl.Strings[Loop]; // Kucken ob in Text vorhanden FoundPos := NextPos(s, Text, FoundPos); if FoundPos > 0 then // FoundPos > 0 -> Wort vorhanden, Wort zählen Inc(Count) else // nicht mehr vorhanden -> abbrechen bFound := False; end; // WordArray Record füllen WordArray[Loop].Word := sl.Strings[Loop]; WordArray[Loop].Count := Count; writeln(WordArray[Loop].Word, WordArray[Loop].Count); // Variablen zurücksetzen Count := 0; bFound := True; end; end;
Delphi-Quellcode:
Muss natürlich vorher mit setlength auf die richtige Länge gesetzt werden.
TWordRec = record // zu jedem Wort gehört die Anzahl
Word: ShortString; Count: Cardinal; end; TWordArray = array of TWordRec; |
Re: Worthäufigkeit bestimmen
arg, jetzt war ich die ganze zeit dabei das fertig zu machen und nun hast du das schon :evil:
|
Re: Worthäufigkeit bestimmen
Zeig mal was du hast. Eventuell ist das ja besser.
|
Re: Worthäufigkeit bestimmen
ne besser ist es keinesfalls, aber ich denke ich hätte es irgendwi hinbekommen.
also ich hatte es so(mit nem button und nem memo:
Delphi-Quellcode:
type
TWordCount = Record word: string; count: integer; end; ... procedure TForm1.Button1Click(Sender: TObject); const FilePath: string = 'C:\Test.txt'; sep: char = ' '; var tf: TextFile; TempStr, TempWord: string; WordCount: Array of TWordCount; i: integer; IsInArray: boolean; begin AssignFile(tf, FilePath); Reset(tf); while not EOF(tf) do begin ReadLn(tf, TempStr); TempStr := Trim(TempStr); TempStr := TempStr + ' '; while pos(sep, TempStr) > 0 do begin IsInArray := false; TempWord := Copy(TempStr, 1, Pos(sep, TempStr)-1); Delete(TempStr, 1, Pos(sep, TempStr)); for i := low(WordCount) to high(WordCount) do begin if WordCount[i].word = TempWord then begin IsInArray := true; inc(WordCount[i].count); end; end; if not IsInArray then SetLength(WordCount, Length(WordCount)+1); WordCount[high(WordCount)].word := TempWord; WordCount[high(WordCount)].count := 1; end; end; for i := low(WordCount) to high(WordCount) do Memo1.Lines.Add('Wort "' + WordCount[i].word + '" ist ' + IntToStr(WordCount[i].count) + ' mal enthalten'); CloseFile(tf); SetLength(WordCount, 0); WordCount := nil; end; ich glaube das array hab ich am ende falsch freigegeben oder? Und noch ne Frage, beim ausführen des programms werden mir manche einträge doppelt angezeigt. z.b wenn das die Textdatei ist: Zitat:
Zitat:
|
Re: Worthäufigkeit bestimmen
Also irgendwie steige ich da bei dir nicht so ganz durch. Aber problematisch, was die Performance angeht dürften die copy's und Delete's sein.
|
Re: Worthäufigkeit bestimmen
Zitat:
wenn ich dich richtig verstehe hast Du die Wörter alle in eine Stringliste geladen? Gut. Aber was ich nicht verstehe ist "...der Text in dem die Worthäufigkeit ermittelt...". Wenn ich die Wörter der SL zählen sollte würde ich so vorgehen.
Ich hoffe das ist verständlich? Das Sortieren sollte recht zügig gehen. Und danach ist es nur noch ein durchlaufen der SL mit exact einer vergleichsoperation pro "Zeile". |
Re: Worthäufigkeit bestimmen
Hallo,
wenn ich mich nicht irre gibts im Delphi 6 Kochbuch ein Rezept dafür, bin mir aber nich sicher... Habe das auch mal probiert, aber den Code verschludert :wall: , sorry. CU |
Re: Worthäufigkeit bestimmen
Zitat:
Delphi-Quellcode:
if not IsInArray then Begin
SetLength(WordCount, Length(WordCount)+1); WordCount[high(WordCount)].word := TempWord; WordCount[high(WordCount)].count := 1; end; |
Re: Worthäufigkeit bestimmen
hm ich hatte jede zeile der text dtei in der while schleife.
Gibt es alternativen zu delete/copy/paste ? @Basilikum, ahhh jetzt funzt es :D, wie knnt ich das nur vergessen |
Re: Worthäufigkeit bestimmen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz