![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перебор текста по словарю [D7, WinXP]
_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]если я правильно понял, то спасёт написание своих регулярных выражений. и не надо говорить, что это сложно -- это просто. %-)) даже без автоматов.