Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Simples Problem Wörter und Sätze zählen
bluewhy - Mo 05.06.06 15:43
Titel: Simples Problem Wörter und Sätze zählen
hi,
hab folgende frage. ich würde gern mal in einem text die funktion wörter und sätze zählen realisieren,leider hab ich keine idee wie ich da ran gehen soll. ich hab mir gedacht erstmal alle punkte zählen das sind die sätze oder so. aber wie prüf ich das alles?
hoffe mir kann jm helfen 1000 danke im vorraus!!
euer bluewhy
Marc. - Mo 05.06.06 16:15
Hallo,
ich hatte mal eine kleine Procedure geschrieben: Sie hangelt sich, Zeichen für Zeichen, durch den Text und prüft, ob das gesuchte Zeichen mit dem Aktuellen übereinstimmt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| procedure Count; var i, anzahl_saetze, anzahl_woerter: integer; text: string; begin anzahl_saetze := 0; anzahl_woerter := 1;
for i := 0 to Form1.richedit.GetTextLen-1 do begin text := copy(Form1.richedit.Text,i+1,1); if (text = '.') or (text = '?') or (text = '!') then begin inc(anzahl_saetze); continue; end else if (text = ' ') then if ((copy(Form1.RichEdit.Text,i+2,1) <> ' ')) then begin inc(anzahl_woerter); continue; end else continue; end;
Form1.Label1.Caption := IntToStr(anzahl_saetze); Form1.Label2.Caption := IntToStr(anzahl_woerter);
end;
procedure TForm1.Button1Click(Sender: TObject); var id: DWord; begin CreateThread(nil,0,@Count,nil,0,id); end; |
Nun brauchst du die procedure nur noch an dein Programm anzupassen ;)
Mit freundlichen Grüßen
ps: dein Post besteht aus 6 Sätzen und 59 Wörtern :)
alzaimar - Mo 05.06.06 16:47
Leider wird '...' als 3 Sätze gezählt, und der leere String ergibt '1 Wort'...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure CountWordsAndSentences (Const aText : String; Var SentenceCount, WordCount : Integer); Const SentenceDelimiter = ['.','!','?']; WordDelimiter = [' ',#13,#10,','];
var i,l,i0,j0 : integer; begin SentenceCount := 0; WordCount := 0; i0 := i; j0 := 1; For i:=1 to Length (aText) Do Begin if aText[i] in SentenceDelimiter Then Begin if i-i0>2 then inc (SentenceCount); i0 := i; End else if aText[i] in WordDelimiter Then Begin If i-j0>2 Then inc (WordCount); j0 := i; End; End; |
Über die Hilfsvariablen i0 (Ende des letzten Satzes( und j0 (Ende des letzten Wortes) stelle ich sicher, das Sachen wie '...' oder zwei Leerzeichen nicht doppelt gezählt werden.
Auf einen Aufruf als Thread kann verzichtet werden, das die Routine schnell genug ist (im Millisekundenbereich),
Marc. - Mo 05.06.06 16:54
| Zitat: |
| und der leere String ergibt '1 Wort'... |
Das war eigentlich Absicht, um die Wörter zu zählen. :)
Meine Methode scheint wohl nicht die eleganteste zu sein :lol:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!