Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Подсчет одинаковых слов в Delphi   Найти похожие ветки 

 
Стьюденд   (2012-09-25 14:18) [0]

Добрый день!Надо написать программу,которая будет подсчитывать повторяющиеся слова в тексте.Программа также должна учитывать регистр т.е. слово тест,Тест,ТЕСТ должны считаться одинаковыми.Выводить надо только самые повторяющиеся слова.Например:
слово тест встречается 10 раз,слово программа 8 и т.д.Значит вывести программа должна так
тест-10
программа-8
Пробовал написать используя обычные строковые функции и код получился немного ужасный.Поискал в интернете и нашел исходник

procedure TForm1.Button1Click(Sender: TObject);
var TS : TStringList;
   s, OneWord : string;
   i, Cnt : integer;
begin
  TS := TStringList.Create;
  TS.Delimiter := " ";
  TS.LoadFromFile("C:\t.txt");
  s := TS.Text;
  TS.DelimitedText := s;

  if TS.Count = 0 then begin
    ShowMessage("Вообще ни одного слова нет!");
    Exit;
  end;

  TS.Sort;

  Memo1.Lines.Clear; // подготовим место для формирования отчёта

  // собственно подсчёт
  OneWord := TS.Strings[0];
  Cnt := 1;
  for i := 1 to TS.Count - 1 do
    if AnsiUpperCase(TS.Strings[i]) = AnsiUpperCase(OneWord) then inc(Cnt)
    else begin
      Memo1.Lines.Append(OneWord+" "+InttoStr(Cnt));
      OneWord := TS.Strings[i];
      Cnt := 1;
    end;

  // для последнего слова в списке вывод результата
  Memo1.Lines.Append(OneWord+" "+InttoStr(Cnt));

  FreeAndNil(TS); // освободим память
end;

Но эта программа подсчитывает все слова в тексте и не учитывает регистр.Поизучал код  но не особо понял и разумеется не смого переделать как мне нужно.Подскажите функцией или примером.Премного благодарен!


 
Inovet ©   (2012-09-25 14:25) [1]

> [0] Стьюденд   (25.09.12 14:18)
> Программа также должна учитывать регистр т.е. слово тест,
> Тест,ТЕСТ должны считаться одинаковыми

не учитывать


 
Inovet ©   (2012-09-25 14:30) [2]

IndexOf


 
Ega23 ©   (2012-09-25 14:37) [3]

Начать надо с определения, что такое "слово".
Сколько "слов" будет в строке
1, ,.;22 3333"#9"%ss мама мыла раму объектно-ориентированный д"Артаньян  ?


 
Jeer ©   (2012-09-25 14:52) [4]


> Надо написать программу


Тебе надо, не нам.

Далее, по пунктам, с учетом уже сказанного:

1. Что есть "текст"
2. Определиться с разделителями слов
3. Определиться, где будет храниться словарь ( БД или иная структура )
4. Исходя из 1..3 реализовать парсинг и гистограмму слов.

К примеру, назначаем разделителями слов символы: #44 #46 #58 #9 #32, CRLF и др.

"Выстраиваем" текст в "линию" и парсим, вычленяя слова.
После выделения очередного слова проверяем на уникальность в той или иной выбранной структуре данных, добавляем при отсутствии либо инкрементируем кол-во при наличии.


 
MBo ©   (2012-09-25 15:06) [5]

Почти вся рвбота уже сделана. Для того, чтобы учитывать счетчики, предлагаю использовать второй TStringList, и вместо вывода в Memo вносить в него строки вместе со счетчиком таким образом:

TS2.AddObject(OneWord, Pointer(Cnt));

По окончанию цикла этот список отсортировать по полю счетчика с помощью CustomSort и функции

function TSCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
 Result := Integer(List.Objects[Index2]) - Integer(List.Objects[Index1]);
end;

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

 Memo1.Lines.Add(Format("%s: %d",[TS2[i], Integer(TS2.Objects[i])]));


 
Ega23 ©   (2012-09-25 15:13) [6]

Плюс также учесть, что в строке могут быть управляющие (и другие) символы: "длинное тире", "мягкий перенос", "неразрывный пробел" и т.п.


 
QAZ2   (2012-09-25 15:20) [7]


> Ega23 ©   (25.09.12 14:37) [3]

тут нет слов вообще


 
MsGuns ©   (2012-09-25 15:53) [8]

ИМХО, сабж очень уж похож на недавний "крутняк" про 50 словарей по 10 000 000 слов в каждом


 
Ega23 ©   (2012-09-25 16:25) [9]


> тут нет слов вообще

Смотря что вкладывать в определение "слово".


 
Jeer ©   (2012-09-25 16:44) [10]


> Смотря что вкладывать в определение "слово".


Однозначное аксиоматическое обозначение в лексике :)


 
Inovet ©   (2012-09-25 16:47) [11]

> [8] MsGuns ©   (25.09.12 15:53)
> ИМХО, сабж очень уж похож на недавний "крутняк" про 50 словарей
> по 10 000 000 слов в каждом

Там регистр учитывался.


 
Jeer ©   (2012-09-25 16:49) [12]


> Однозначное аксиоматическое обозначение в лексике :)


Если не учитывать омографы, но все в порядке :)


 
Jeer ©   (2012-09-25 16:53) [13]

" Вдали виднелся замок и, в подзорную трубу, я разглядел на его главных воротах замок. Дорога к  замку была вся усыпана мелом, но это оказалась мука и такая была мука топтать ее копытами коня, что я потерял ключ от ворот, зато нашел чистый и прохладный ключ и вволю напился"

Налицо омографы :)


 
Ega23 ©   (2012-09-25 16:55) [14]


> Однозначное аксиоматическое обозначение в лексике :)

Вооот.
Осталось определить БНФ ( http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0_%D0%91%D1%8D%D0%BA%D1%83%D1%81%D0%B0_%E2%80%94_%D0%9D%D0%B0%D1%83%D1%80%D0%B0 ) для данной задачи - и вперёд.


 
Jeer ©   (2012-09-25 16:57) [15]

Естественный язык также далек от программирования, как и крайний от первого :)


 
TUser ©   (2012-09-27 23:58) [16]

можно использовать префиксное дерево, например


 
Petr V. Abramov ©   (2012-09-28 00:11) [17]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.057 c
4-1260893670
QAZ
2009-12-15 19:14
2013.03.22
Hook&Uac


15-1338443640
М
2012-05-31 09:54
2013.03.22
Подскажите компонент для выбора каталога


15-1330443309
pasha_golub
2012-02-28 19:35
2013.03.22
IPC в MacOS&Win средствами Delphi XE2


3-1287558732
Sergey2
2010-10-20 11:12
2013.03.22
LinkedServer на mssql 2008


2-1337243492
TStas
2012-05-17 12:31
2013.03.22
Как установить отступ в ричэдите у всех абзацев?