Статистика слов в тексте с Delphi - PullRequest
0 голосов
/ 28 января 2010

Я использую Delphi 7. Я хотел бы посчитать количество повторений каждого слова в большом тексте (500 слов). Как я мог это сделать?

Ответы [ 5 ]

2 голосов
/ 28 января 2010

вот способ грубой силы сделать это. он использует список строк и сохраняет счетчик каждого слова, приведенного как объект к элементу списка.

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]);
0 голосов
/ 28 января 2010

a TSTringList также может использоваться для «списка слов». Просмотрите все ваши слова и добавьте всех и каждого в список tStringlist как новый элемент. Когда вы закончите, у вас будет ИТОГО счетчик, чтобы определить уникальные слова, отсортировать список, и в цикле посмотреть, если текущее слово отличается от предыдущего ... если так, то увеличить ваш уникальный счетчик слов.

0 голосов
/ 28 января 2010

Если мы говорим о количестве слов в текстовой строке, вы могли бы проанализировать строку и идентифицировать слова. Добавьте слова на карту, где идентификатором является само слово, а значением является число. Это число увеличивается, если найденное вами слово в строке уже существует на карте.

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, я попытался предоставить вам пример псевдокода.

0 голосов
/ 28 января 2010

Из библиотеки структур FPC:

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]); будет хорошей первой попыткой. Это предназначено для простых вычислений величины, так как это, например. не заботится о сокращенных словах.

Конечно, если вы сдадите это как домашнее задание, вас, вероятно, попросят объяснить, как оно работает.

0 голосов
/ 28 января 2010

Я не помню никаких встроенных функций Delphi, которые непосредственно делают это. Но простой метод O (n * Log (n)) - сортировать слова, а затем сканировать и считать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...