Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Подсчет одинаковых слов в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.079 c
15-1345573664
Jimmy
2012-08-21 22:27
2013.03.22
Редактор для создания математических чертежей


2-1339584024
IGray
2012-06-13 14:40
2013.03.22
ShowModal внутри try...except


15-1339763619
Kerk
2012-06-15 16:33
2013.03.22
WebDAV в Windows XP


8-1226309625
Andrey_ka
2008-11-10 12:33
2013.03.22
как работает PixelFormat


15-1349614847
картман
2012-10-07 17:00
2013.03.22
клавиатуры Logitech





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский