Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перебор текста по словарю [D7, WinXP]


Страницы:   1 2 3

_mik ©   (2006-07-14 22:18:00) 

Сдравствуйте!

Как можно организовать   быстрыйперебор теста по словарю!

Причем словарь имеет довольно большой размер ~35000 слов и словосочетаний!, причем синтаксис словаря такой:
[$][*][слово][*]=[чему то]
где
$ -  учитывать ли индекс;
* - любое кол-во символов;


atruhin   (2006-07-18 18:20:00) [21]

> Ты дольше провозишься с оптимизацией поиска, и всеравно
> такой скорости как у БД не добьешься.

Почему ты так решил? В БД что поиск какой то особенный секретный. Все алгоритмы известны. Реализуются максимем за 1 день. Можно найти готовые реализации. А алгоритм заточенный под конкретную задачу будет быстрее.
Автору:
Не нужны в данном случае регулярные выражения, да и как ты их хочешь прикрутить?


Stanislav   (2006-07-18 09:45:00) [22]

Если БД на ACCESS драйвера не нужны.

Тупой перебор на Pentium 2.4HT теста ~500 символов занимает 10 сек при полной загрузки процессора, что для меня не приемлемо!

Это очень медлено. Ты дольше провозишься с оптимизацией поиска, и всеравно такой скорости как у БД не добьешься.
Хотя есть примеры в книгах быстрой сортировки, это сортировка путем половинчатого деления.


Ketmar   (2006-07-18 01:53:00) [23]

не вопрос. если поймёшь, как и почему оно работает -- поделись знанием. я не понимаю. %-)


_mik   (2006-07-18 01:10:00) [24]

Спасибо!


Ketmar   (2006-07-17 23:35:00) [25]

может, хотя бы в анкету глянешь? %-)


_mik   (2006-07-17 21:51:00) [26]

Может хотябы исходиники скинеш?
viri@yandex.ru


Ketmar   (2006-07-17 21:39:00) [27]

>_mik ©   (17.07.06 20:50) [26]
к сожалению, переходник "мозг-USB" ещё не придумали. а писать статью мне лениво. %-)


_mik   (2006-07-17 20:50:00) [28]

Лучше приведи (или пошли напочту если не жалко) информацию по написанию!
Это очень интересно!
СПАСИБО!


_mik   (2006-07-17 20:49:00) [29]

А не мог бы ты привести исходники!
Или хотябы адрес сайта с которого ты взял информацию!
Спасибо!


Ketmar   (2006-07-17 20:45:00) [30]

насчёт регулярных выражений. проверил только что свой движок (далеко не самый шустрый, кстати). на файле объёмом 400 кил отрабатывает практически мгновенно. машина -- pIII/600. просто dos-like wildcards ещё шустрее.


_mik   (2006-07-17 18:05:00) [31]

Вообще я привел то, что работает хорошо!
Я уже писал, что я произовожу бинарный поиск по словарю (это значит что словарь заранее отсортирован)

Вариант с базой данных мне не подходит, т.к. я планирую использовать программу на компютерах с win95 и выше! (не охото утяжилять дистрибутив драйверами)
Плюс к тому, я пытаюсь обеспечить совместимость по словарями ГОВОРИЛКИ!

В Данный момент я не могу решить проблему с быстрым поискомслов  и словосочетанийпо маске, т.е. с обобщающими символами!

Подчеркиваю именно быстрого!!
СПАСИБО ЗА СОВЕТЫ


atruhin   (2006-07-17 17:53:00) [32]

> [21] Stanislav ©   (17.07.06 17:14)

Незачем использовать БД где не попадя. Словарь фиксированный, маленький. Менее 1 мб, поиск в памяти будет эффективнее.

> [20] _mik ©   (17.07.06 16:59)

Ерунда какая то. Я тебе описал простой алгоритм, зачем ты приводиш то, что у тебя работает плохо? Ответь на:

> PS Не понимаю одного в задаче, на входе слово содружество
> в словаре его нет , нашли дружество запомнили, а куда девать
> со


Stanislav   (2006-07-17 17:14:00) [33]

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

Лучше всего использовать БД. хотябы организованную на MS ACCESS т.к. алгоритмы быстрого поиска там уже реализованы.


_mik   (2006-07-17 16:59:00) [34]

Спасибо за дельный совет!

В настоящее время я деляю так:

1 выбираю кусок текста и разбиваю его на составные части путем добавления после каждого слова символов #10#13 а затем помещаю все в
StringList

2 обращаюсь через метод StringList.items к отдельным словам и произвожу поиск их по словарю, а затем меняю!

примерно так:

    str := TStringList.Create();
     _GetTextBlock (REEdit.Text, SpeechPosition, str);
      // вставляем теги
      _TextAnalise (str);
      // отслеживание позиции чтения
      _TextHig (0,SpeechPosition, clGreen);
      // замена по словарю
      replaseOnDic (str);
      TTSSpeech.Speech(str.Text);

где

procedure replaseOnDic (var Data: TStringList);
var i, psn: Integer;
   str1, str2: String;
begin
for i:=0 to Data.Count-1 do
  begin
     str1 := Data.Strings[i];

     if str1[1] in separators then continue;
{separators - множество разделителей слов set of char = [',', '.', ':']}

     // проверка на регистрозависимость
     psn:=FindItem ('$'+str1);
     if psn>=0 then
     begin
        {получаем слово перед знаком '='}
        str1:=GetDest(SEDicEditor.Lines[psn]);

        Data.Strings[i]:=str1;
        continue;
     end;

     // замена текста
     str1:=AnsiLowerCase (str1);
     psn:=FindItem (str1);
     if psn>=0 then
     begin
         {получаем слово после знака '='}
         str1:=self.GetDest(SEDicEditor.Lines[psn]);
         {SEDicEditor - TStringList со словарем}
        Data.Strings[i]:=str1;
     end;

  end;  
end;


atruhin   (2006-07-17 13:20:00) [35]

По условия задачи не нужно ни каких регулярных выражений (это не очень быстро).
Во первых:
ОБЯЗАТЕЛЬНО убери из строк равно и сделай двумерный массив + модификаторы. Сократится область поиска.
Далее: словарь сделать отсортированным, сделать хэш по первым символам, далее бинарный поиск в оставшемся фрагменте.
Далее двигашся по текстовому потоку выбираеш слово ищеш в словаре, если найдено пытаешся удлиннить (т.е. словосочитание), если не найдено поиск по кажддой букве.
Думаю будет работать на несколько порядков быстрее. На самом деле подходящих алгоритмов много.
PS Не понимаю одного в задаче, на входе слово содружествов словаре его нет , нашли дружествозапомнили, а куда девать со


Ketmar   (2006-07-17 12:34:00) [36]

в интернете? %-)


_mik   (2006-07-17 12:08:00) [37]

Спасибо.
А где мне взять подробный материал?


Ketmar   (2006-07-17 10:19:00) [38]

>_mik ©   (17.07.06 10:10) [15]
а вот сесть -- и написать. досовые маски -- тоже регэкспы. Вы и для них будете автомат городить?
фильтры -- тоже в какой-то мере регэкспы. можно написать без автоматов.
и так дале...


_mik   (2006-07-17 10:10:00) [39]

- А каким образом можно написать свои регулярные выражения без конечных автоматов?

- Да так, чтобы не потерять при этом скоростьобработки?


Ketmar   (2006-07-17 03:43:00) [40]

если я правильно понял, то спасёт написание своих регулярных выражений. и не надо говорить, что это сложно -- это просто. %-)) даже без автоматов.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо