Форум: "Прочее";
Текущий архив: 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