私は Delphi 7 を使用しています。大きなテキスト (500 語) 内のすべての単語の繰り返し回数を数えたいと思います。どうすればできますか?
5 に答える
これが一種のブルートフォース攻撃の方法です。文字列リストを使用し、リストアイテムのオブジェクトとしてキャストされた各単語の数を格納します。
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]);
TSTringListは、「単語のリスト」にも使用できます。すべての単語に目を通し、すべての人を新しいアイテムとしてtStringlistに追加します。完了したら、合計カウントがあり、一意の単語を判別し、リストを並べ替え、ループで現在の単語が前の単語と異なるかどうかを確認します...そうである場合は、一意の単語数を増やします。
これを直接行う組み込みの Delphi 関数を思い出せません。しかし、単純な O(n*Log(n)) メソッドは、単語を並べ替えてからスキャンしてカウントすることです。
テキスト文字列内の単語数について話している場合、できることは文字列を解析して単語を識別することでした。単語をマップに追加します。識別子はそれ自体の単語であり、値は数値です。文字列で見つかった単語がマップに既に存在する場合、この数は増加します。
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 をよく知らないので、疑似コードの例を提供しようとしました。
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]); 最初の試みとしては良いでしょう。たとえば、略語を処理しないため、単純なマグニチュード計算を目的としています。
もちろん、これを宿題として提出すると、おそらくその仕組みを説明するよう求められるでしょう。