0

私は Delphi 7 を使用しています。大きなテキスト (500 語) 内のすべての単語の繰り返し回数を数えたいと思います。どうすればできますか?

4

5 に答える 5

2

これが一種のブルートフォース攻撃の方法です。文字列リストを使用し、リストアイテムのオブジェクトとしてキャストされた各単語の数を格納します。

var
  i : integer;
  iCount : integer;
  idxFound : integer;
  someText : string;
  s : TStringList;
  oneWord : string;

begin
  someText := 'this that theother and again this that theother this is not that';
  oneWord := '';

  s := TStringList.Create;
  for i := 1 to length(someText) do begin
    if someText[i] = ' ' then begin
      idxFound := s.indexof(oneWord);
      if idxFound >= 0 then begin
        iCount := integer(s.objects[idxFound]);
        s.Objects[idxFound] := TObject(iCount + 1);
      end
      else begin
        s.AddObject(oneWord, TObject(1));
      end;
      oneWord := '';
    end
    else begin
      oneWord := oneWord + someText[i];
    end;
  end;

  if oneWord <> '' then
    if idxFound >= 0 then begin
      iCount := integer(s.objects[idxFound]);
      s.Objects[idxFound] := TObject(iCount + 1);
    end
    else begin
      s.AddObject(oneWord, TObject(1));
    end;

  // put the results on the screen in a text box.
  memo1.Text := '';
  for i := 0 to s.Count - 1 do
    memo1.Lines.Add(intToStr(integer(s.Objects[i])) + ' ' + s[i]);
于 2010-01-28T15:09:14.990 に答える
0

TSTringListは、「単語のリスト」にも使用できます。すべての単語に目を通し、すべての人を新しいアイテムとしてtStringlistに追加します。完了したら、合計カウントがあり、一意の単語を判別し、リストを並べ替え、ループで現在の単語が前の単語と異なるかどうかを確認します...そうである場合は、一意の単語数を増やします。

于 2010-01-28T17:57:43.940 に答える
0

これを直接行う組み込みの Delphi 関数を思い出せません。しかし、単純な O(n*Log(n)) メソッドは、単語を並べ替えてからスキャンしてカウントすることです。

于 2010-01-28T14:37:19.430 に答える
0

テキスト文字列内の単語数について話している場合、できることは文字列を解析して単語を識別することでした。単語をマップに追加します。識別子はそれ自体の単語であり、値は数値です。文字列で見つかった単語がマップに既に存在する場合、この数は増加します。

map<string, int>
foreach word in string
    if word is in map
        map[word] = map[word] + 1
    else
        map[word] = 1
    end if
end for

私は Delphi をよく知らないので、疑似コードの例を提供しようとしました。

于 2010-01-28T14:39:40.160 に答える
-1

FPC strutils ライブラリから:

function WordCount(const S: string; const WordDelims: TSysCharSet): Integer;

var
 P,PE : PChar;

begin
  Result:=0;
  P:=Pchar(pointer(S));
  PE:=P+Length(S);
  while (P<PE) do
    begin
    while (P<PE) and (P^ in WordDelims) do
      Inc(P);
    if (P<PE) then
      inc(Result);
    while (P<PE) and not (P^ in WordDelims) do
      inc(P);
    end;
end;

wordcount (test,[',','.','','!','?',#10,#13]); 最初の試みとしては良いでしょう。たとえば、略語を処理しないため、単純なマグニチュード計算を目的としています。

もちろん、これを宿題として提出すると、おそらくその仕組みを説明するよう求められるでしょう。

于 2010-01-28T14:46:37.833 に答える