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

我不记得有任何直接执行此操作的内置 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 回答
0

TSTringList 也可用于“单词列表”。遍历您的所有单词,并将每个人作为新项目添加到 tStringlist。完成后,您将获得一个 TOTAL 计数,以确定唯一单词,对列表进行排序,并在循环中查看当前单词是否与前一个单词不同......如果是,则增加您的唯一单词计数。

于 2010-01-28T17:57:43.940 回答
-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 回答