Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > как посчитать количество слов


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

Автор: Matematik 3.10.2006, 15:26
http://rouse.drkb.ru/ Словарь уникальных слов.

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

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

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

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


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

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

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

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

Код в студию!

Автор: Teran 3.10.2006, 17:13
Код

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 

Автор: sergejzr 3.10.2006, 17:22
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:
Код не проверял

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

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

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

}
return false;
}


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

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

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

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

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

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

 smile 

Автор: sergejzr 3.10.2006, 17:37
Кстати, ТСтрингЛист ещё и строки делит сам??? тогда в мусор его. 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 
Модератор: А что С++ код делает в дельфях?

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

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

Автор: Marriage 3.10.2006, 17:58
А что за компутер ??? Если Пень 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;

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

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

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

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

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

Автор: Marriage 3.10.2006, 19:12
А окончательный вариант на Дельфи выложить можно ??

Автор: Romikgy 3.10.2006, 19:49
а что считаете словами?
и как слова должны отделятся друг от друга?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)