Главная страница
    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.353 c
15-1337665496
Василий3005
2012-05-22 09:44
2013.03.22
Как не потерять клиента?


15-1353184202
Юрий
2012-11-18 00:30
2013.03.22
С днем рождения ! 18 ноября 2012 воскресенье


15-1351197002
Юрий
2012-10-26 00:30
2013.03.22
С днем рождения ! 26 октября 2012 пятница


2-1337678526
vrem
2012-05-22 13:22
2013.03.22
ntfs = $indexroot не хочет считываться


1-1301494021
Циркуль
2011-03-30 18:07
2013.03.22
Модальное окно прячется под немодальным





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский