Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.08.2011, 01:11
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию оптимизация кода

Накатал сейчас программу для нечеткого сравнения строк по базе, используя алгоритм отсюда http://www.delphisources.ru/pages/fa...e_strings.html

сама функция поиска

Код:
function TForm1.AI(word: string): string;
var
i: integer;
k,p:integer;
slovo: string;
variants: TStringList;
begin
word:=AnsiLowerCase(copy(word,1,50));
 for i:=0 to mozg.Count-1 do
  begin
   p:=0;
   if copy(mozg.Strings[i],1,3)='<Q>' then
    begin
     for k:=1 to  length(mozg.Strings[i]) do if mozg.Strings[i][k]='<' then inc(p);
     slovo:=mozg.Strings[i];
     if p>1 then
      begin
      for p:=p downto 2 do
       begin
        delete(slovo,1,3);
        if FindCompare.IndistinctMatching(4,word,copy(slovo,1,pos('<Q>',slovo)-1))>=80 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
        slovo:=copy(slovo,pos('<Q>',slovo)+1,length(slovo));
       end;
       delete(slovo,1,2);
       if FindCompare.IndistinctMatching(4,word,slovo)>=80 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
      end
    else
     begin
      slovo:=copy(slovo,4,length(slovo));
      if FindCompare.IndistinctMatching(4,word,slovo)>=80 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
     end;
    end;
  end;
 for i:=0 to mozg.Count-1 do
  begin
   p:=0;
   if copy(mozg.Strings[i],1,3)='<Q>' then
    begin
     for k:=1 to  length(mozg.Strings[i]) do if mozg.Strings[i][k]='<' then inc(p);
     slovo:=mozg.Strings[i];
     if p>1 then
      begin
      for p:=p downto 2 do
       begin
        delete(slovo,1,3);
        if FindCompare.IndistinctMatching(4,word,copy(slovo,1,pos('<Q>',slovo)-1))>=40 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
        slovo:=copy(slovo,pos('<Q>',slovo)+1,length(slovo));
       end;
       delete(slovo,1,2);
       if FindCompare.IndistinctMatching(4,word,slovo)>=40 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
      end
    else
     begin
      slovo:=copy(slovo,4,length(slovo));
      if FindCompare.IndistinctMatching(4,word,slovo)>=40 then
         begin
          variants:=TStringList.Create;
          for k:=i+1 to mozg.Count-1 do
           if copy(mozg.Strings[k],1,3)='<A>' then variants.Add(copy(mozg.Strings[k],4,length(mozg.Strings[k]))) else break;
          result:=variants.strings[random(variants.Count)];
          variants.free;
          exit;
         end;
     end;
    end;
  end;
result:=rand.Strings[random(rand.count)];
end;

ищет фразу и ответ на неё, в файле с базой такого вида
Цитата:
<Q>Есть кто живой?
<A>Кто-то есть...
<Q>Здарова<Q>Здоровеньки
<A>Прювед
<A>Здоровее видали
сначало идет сравнение более точное от 80%, затем от 40% и если ничего не нашли рандомная фраза

но проблема больно долго ищет если ничего не найдено, хотелось бы услышать совет по оптимизации кода

и прикрепляю исходник, с базой если понадобится
Вложения
Тип файла: rar ИИ.rar (19.3 Кбайт, 1 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:35.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025