Autor Beitrag
bluewhy
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 05.06.06 15:43 
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 05.06.06 16:47 
Leider wird '...' als 3 Sätze gezählt, und der leere String ergibt '1 Wort'...

ausblenden 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),

_________________
Na denn, dann. Bis dann, denn.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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: