Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как посчитать количество слов, в большом текстовом файле 
:(
    Опции темы
Teran
  Дата 3.10.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Поскажите как можно посчитать количество слов в большом текстовом файле?
просто перебирать посимвольно и искать пробелы не подходит так как занимает очень много времени (при файле 100кб поиск занял 2 минуты)


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Matematik
Дата 3.10.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



http://rouse.drkb.ru/ Словарь уникальных слов.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 3.10.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Teran @  3.10.2006,  15:17 Найти цитируемый пост)
так как занимает очень много времени (при файле 100кб поиск занял 2 минуты) 

Это если в файле искать, а если его сразу загрузить в память и там искать, то будет быстро. smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Teran
Дата 3.10.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Цитата(alexeis1 @  3.10.2006,  15:54 Найти цитируемый пост)
Это если в файле искать, а если его сразу загрузить в память и там искать, то будет быстро.

а TStringList или AnsiString - это разве не память?


Цитата(Matematik @  3.10.2006,  15:26 Найти цитируемый пост)
Словарь уникальных слов

а если необходимо например искать колличество предложений??

Это сообщение отредактировал(а) Teran - 3.10.2006, 16:46


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Alexeis
Дата 3.10.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Teran @  3.10.2006,  16:23 Найти цитируемый пост)
а TStringList или AnsiString - это разве не память?

Там про это не было написано... 
Значит алгоритм поиска по пробелам реализован неоптимально. Должно быть не более 5 секунд

Код в студию!


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Teran
Дата 3.10.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Код

int __fastcall GetCountSymbol(AnsiString Tmp)
{int Ret=0,CountFountSymbol=0,CountFountSymbolTmp=0,CountAllSymbol=Tmp.Length();
        do{CountFountSymbol=Tmp.SubString(CountFountSymbolTmp+1,CountAllSymbol).Pos(" ");
              CountFountSymbolTmp+=CountFountSymbol;
              if(CountFountSymbol!=1)Ret++; //Защита от двух пробелов сразу
              }while(CountFountSymbol!=0);
}

ps язык роли не играет

Добавлено @ 17:14 
Цитата(alexeis1 @  3.10.2006,  17:06 Найти цитируемый пост)
 Должно быть не более 5 секунд

можеш показать такой алгоритм?? smile 

Это сообщение отредактировал(а) Teran - 3.10.2006, 17:50


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
sergejzr
Дата 3.10.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Teran, проблема у тебя не в алгоритме, а в чтении из файла. (Я предполагаю). Многие читают с диска посимвольно и удивляются, почему программа тормозит smile

ПС:
Хотя с алгоритмом тоже трабла smile
Надо чтото типа

Код

int __fastcall GetCountSymbol(AnsiString Tmp)
{
int ret=0;
bool character=false;
char txt*=Tmp.c_str();

for(;*txt;txt++)
{
  if(isalpha(*txt)&&!character)
  {
    character=true;
    ret++;
  }else
  {
    character=false;
  }

}
return ret;
}


PPS:
Код не проверял


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Alexeis
Дата 3.10.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Простейший вариант использовать функцию PosEx, из модуля StrUtils. Написана она на ассемблере и позволяет производить поиск начиная с определенной позиции в строке.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
sergejzr
Дата 3.10.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



ПППС:
Количество предложений это количество точек,воскл/вопр знаков
Вместо isalpha(*txt) напиши:
Код

bool isEndOfSentence(char character)
{
switch(character)
{
case '.':
case '!':
case '?':
return true;

}
return false;
}


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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Alexeis
Дата 3.10.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



К сожалению я не знаком с внутренней реализацией функций на билдере, а потому не могу определить какая из операций является тормозом в этом коде...

Цитата(sergejzr @  3.10.2006,  17:22 Найти цитируемый пост)
проблема у тебя не в алгоритме, а в чтении из файла. (Я предполагаю).

StringList - оптимизирован для чтения из файла текста, так что это маловероятно.

Добавлено @ 17:31 
Еще вариант
Код

stringlist1.delimiter := ' ';
stringlist1.delimitedtext := text;
wordsCount := stringlist1.count;

 smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
sergejzr
Дата 3.10.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Кстати, ТСтрингЛист ещё и строки делит сам??? тогда в мусор его. smile


Код

long fileLength(const char* filename)
{
    struct stat buf;
 
    if(stat(filename, &buf) != 0)
    {
        /* Произошла проблема при получении информации */
        return -1;
    }
    return (buf.st_size);
}
readFile(){
FILE * in
int  n;

long* xorbuf;
int len=512/sizeof(int);

in=fopen("myfile.txt","rb");
int len=fileLength("myfile.txt");
char buf =new char[len];
if(!(n = read(fileno(in), buf, len)) > 0))
{
return -1; //Error!

}

cout<<countWords(buf);

}


PS: А что, считаются только пробелы? А перехосы строк? А ошибки типа "Привет!"-Сказал Вася?

Добавлено @ 17:40 
Модератор: А что С++ код делает в дельфях?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guedda
Дата 3.10.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(sergejzr @  3.10.2006,  18:26 Найти цитируемый пост)
Количество предложений это количество точек,воскл/вопр знаков

А если предложение незаконченное (...), либо выражает истинное удивление (???), либо сильно восклицательное (!!!)? 
В таком случае этот вариант не подходит.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Marriage
Дата 3.10.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



А что за компутер ??? Если Пень 75 то около того и будет. Скинь свой текст, а то у меня файл 1.06 Мб проверялся около минуты. у меня пень 2.4.
Код не рассчитан на все случаи жизни,считает быстрее чем 100 кб за 2 мин.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
p:integer;
PREV:STRiNG;
len:integer;
all:string;

//chars:array of char;
begin
p:=0;
MEMO1.Lines.LoadFromFile('sqlnet.log');
all:=MEMO1.Text;
ProgressBar1.Max:=length(MEMO1.Text);
i:=1;
len:=length(MEMO1.Text);
//SetLength(chars,len);
//pchar(chars):=pchar(all);
while i < len-1 do
  Begin
   Application.ProcessMessages;

   If (
         (all[i] = ' ')  and (all[i-1] <> ' ')
      ) or ( (all[i] = #10)  and (all[i-1] = #13)) then
      
    Begin
        inc(p);
    End;
    inc(i);
    ProgressBar1.StepIt;
End;
ShowMEssage(IntTOStr(p+1));
//SetLength(chars,0);;
end;


Это сообщение отредактировал(а) Marriage - 3.10.2006, 17:59


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
Teran
Дата 3.10.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Цитата(Guedda @  3.10.2006,  17:51 Найти цитируемый пост)
А если предложение незаконченное (...), либо выражает истинное удивление (???), либо сильно восклицательное (!!!)? 
В таком случае этот вариант не подходит.

а чего это программа найдет например первую "." и посчитает предложение+1, - все правильно затем все идущие заним точки (хоть 100) считать не будет

sergejzr Тебе выражаю особенную благодарность твой код это все считает за 0.5 - 1 секунду

Это сообщение отредактировал(а) Teran - 3.10.2006, 18:07


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
sergejzr
Дата 3.10.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Цитата(Guedda @  3.10.2006,  15:51 Найти цитируемый пост)
А если предложение незаконченное (...), либо выражает истинное удивление (???), либо сильно восклицательное (!!!)? 
В таком случае этот вариант не подходит. 

Тот код, который я написал - подходит.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.