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); // erhöhre anzahl_saetze um eins
       continue; // setze den schleifendurchlauf fort
     end else
       if (text = ' 'then // falls ein leerzeichen enthalten ist
       if ((copy(Form1.RichEdit.Text,i+2,1) <> ' ')) then // und das drauffolgende keines ist
      begin
        inc(anzahl_woerter); // erhöhe anzahl_woerter
        continue; // setze den schleifendurchlauf fort
      end else // ansonsten
       continue; // setze nur den schleifendurchlauf fort 
    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); // thread für die procedure, damit das programm nicht gefriert
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 : StringVar 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: