Супер быстрый поиск в массиве!
|
|
Sower | Дата: Четверг, 15 Января 2009, 09:25 | Сообщение # 1 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Я тут переводчика замутил Super Translator, словари в двух файлах (англ и рус), при запуске загружаю в массив (один eng, другой rus), в файле все слова в столбик и соответствуют словам в другом файле, где перевод, так вот ввожу слово, находит(напимер русской-английский, у меня он и туды и сюды) находится это слово в массиве, запоминаем индекс, под которым это слово в массиве rus и грузим из массива eng ис тойже позиции! Так вот, 2000 слов прога сканирует за 2-4 секунды, а как можно ускорить?????
|
|
| |
toizy | Дата: Четверг, 15 Января 2009, 12:12 | Сообщение # 2 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Ну вот. Уже и переводчики стали мутить :-D Если используешь цикл, то никак. Потом, зачем 2 файла? Используй один. Можно извратиться и оптимизировать поиск, но всё же лучше сделать это хотя бы плагином
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
YURIY | Дата: Четверг, 15 Января 2009, 15:50 | Сообщение # 3 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Советую вообще отказаться от файлов. Здесь нужно работать с базой данных.
Вечная память Андрею Сергееву!
|
|
| |
Sower | Дата: Пятница, 16 Января 2009, 13:05 | Сообщение # 4 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Quote (toizy) сделать это хотя бы плагином Хорошая идея, но каким образом? Ведь если в ммв цикл, то он и в паскале цикл...
|
|
| |
Alex3A | Дата: Пятница, 16 Января 2009, 14:11 | Сообщение # 5 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Grand) ошая идея, но каким образом? Ведь если в ммв цикл, то он и в паскале цикл... Корова и самолет то же передвигаются, так какая разница начем ехать?:)
|
|
| |
toizy | Дата: Пятница, 16 Января 2009, 16:23 | Сообщение # 6 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Дык... Мы же можем всё сделать исключительно плагином, зачем нам циклы ммвшные...
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Sower | Дата: Суббота, 17 Января 2009, 09:48 | Сообщение # 7 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Можете по подробней
|
|
| |
DEMBEL | Дата: Суббота, 17 Января 2009, 15:44 | Сообщение # 8 |
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
| Quote (Grand) 2000 слов прога сканирует за 2-4 секунды Неудивительно. Ты все слова вначале загружаешь в массив, потом делаешь поиск по массиву в цикле? Попробуй просто ничего не загружая произвести поиск по текстовому файлу, при нахождении нужного слова вернуть номер строки в файле, и считать строку с тем же номером из другого файла (перевод). Будет тоже самое что и с массивом, но без циклов (в ммб они медленно работают). А вообще лучше ковыряться в указанном направлении: Quote (Yuriy) Советую вообще отказаться от файлов. Здесь нужно работать с базой данных.
Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
|
|
| |
Sower | Дата: Вторник, 20 Января 2009, 08:51 | Сообщение # 9 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Quote (DEMBEL) Неудивительно. Ты все слова вначале загружаешь в массив, потом делаешь поиск по массиву в цикле? Попробуй просто ничего не загружая произвести поиск по текстовому файлу, при нахождении нужного слова вернуть номер строки в файле, и считать строку с тем же номером из другого файла (перевод). Будет тоже самое что и с массивом, но без циклов (в ммб они медленно работают). Из текстовго сразу намного медленнее. А так один раз загрузил, а дальше в массиве быстро! Я так уже делал!Добавлено (20 Январь 2009, 08:43) --------------------------------------------- Я отправлял as-master'у ВЕЧНАЯ ЕМУ ПАМЯТЬ проект этого переводчика, самую первую мою разработку переводчика, так он написал, что при большом количестве слов будет полный затык!!!!! Я забросил на месяца два этот проект, потом захотел его доделать, подумал и решил, что оптимальнейший вариант через массив (средствами ммв), сейчас думаю нужен плагин!!! Попробую его написать, если кто может, попробуйте написать! Насчет написания плагина: как в делфи считать нужную строку из файла, как в ммв?!?!?! Подскажите по подробне Добавлено (20 Январь 2009, 08:51) --------------------------------------------- DEMBEL, Ты наверно не правильно понял! Я при загрузке программы загружаю в массив, а потом уже нет!!!
|
|
| |
Alexey | Дата: Вторник, 20 Января 2009, 08:57 | Сообщение # 10 |
Новый участник
Группа: Пользователи
Сообщений: 2
Репутация: 0
Награды: 0
Статус: Offline
| Quote (Grand) Насчет написания плагина: как в делфи считать нужную строку из файла, как в ммв?!?!?! Подскажите по подробне я не знаю, помогите Grand,
|
|
| |
DEMBEL | Дата: Вторник, 20 Января 2009, 10:54 | Сообщение # 11 |
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
| а если все таки попробовать базу данных использовать? Есть же несколько плагинов, работающих с БД, вдруг там поиск по запросу быстрее будет работать?
Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
|
|
| |
YURIY | Дата: Вторник, 20 Января 2009, 21:06 | Сообщение # 12 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (DEMBEL) а если все таки попробовать базу данных использовать? Я уже устал об этом говорить... Grand, времени много? Убей его на бесполезное занятие. Ну вот честно! Не обижайся. Quote (DEMBEL) вдруг там поиск по запросу быстрее будет работать? Он будет моментально работать. Так как у БД совсем другая организация структуры хранения данных. А, следовательно, и другие методы работы с ними.
Вечная память Андрею Сергееву!
|
|
| |
DEMBEL | Дата: Вторник, 20 Января 2009, 22:39 | Сообщение # 13 |
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
| Quote (Yuriy) Он будет моментально работать Ну вот, я так и подозревал. Так что брось возню с файлами пока не поздно, будет у тебя не 2 а 5-10 тысяч слов, что тогда делать будешь?
Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
|
|
| |
Alex3A | Дата: Среда, 21 Января 2009, 01:07 | Сообщение # 14 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Grand, тем более что в плагине есть функция поиска (в моем).
|
|
| |
usermmbuild | Дата: Воскресенье, 25 Января 2009, 15:34 | Сообщение # 15 |
Любопытный
Группа: Проверенные
Сообщений: 48
Репутация: 0
Награды: 0
Статус: Offline
| Quote (DEMBEL) Есть же несколько плагинов, работающих с БД, Дайте, пожалуйста, ссылочку или хотя бы название Добавлено (25 Январь 2009, 15:34) --------------------------------------------- ссори, нашёл
|
|
| |
Sower | Дата: Пятница, 06 Февраля 2009, 10:37 | Сообщение # 16 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Сделал свой плагин для поиска, но не в БД! Спокойно ищет из 5000 и более - один щелчок и готово! Хотя устройство плагина !СМЕШНОЕ! : Два MEMO, в один грузится файл eng.iso, а в другой rus.iso В цикле ищем слово, которое передано плагину из ммв вот так цикл фор i Memo1.Lines[i] Grand||просто, гениально Добавлено (06 Февраль 2009, 10:37) --------------------------------------------- Если кому интересно могу кинуть плагин.
|
|
| |
Rush | Дата: Суббота, 07 Февраля 2009, 13:03 | Сообщение # 17 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Сразу все начинают говорить про медленные циклы ММВ и, как следствие, про плагины. Но ведь для таких простых случаев, как организация пары значение/перевод в текстовых файлах, совсем не нужен цикл и скорость работы хорошая. Как я понял, строка английского значения в одном файле соответствует строке в файле с русским значением. Тогда можно так (задержки поиска нет вообще): Code ** создаем константу перевода строки crlf$=CHR(13)+CHR(10) ** загружаем файлы в переменные eng$=StrFromFile(<Embedded>\eng.txt,1,-1)+crlf$ rus$=StrFromFile(<Embedded>\rus.txt,1,-1)+crlf$ ** определяем длину исходного массива lenEngArr=GetArrayNum(eng$,crlf$) ** однозначно идентифицируем слово для перевода word$=crlf$+'help'+crlf$ ** определяем его позицию pos=POS(word$,eng$)+LEN(word$) ** создаем временную переменную tmp$=StrDel(eng$,1,pos) ** определяем длину ее массива и очищаем lenTmpArr=GetArrayNum(tmp$,crlf$) tmp$='' ** определяем позицию соответствия в массиве назначения posRusArr=lenEngArr-lenTmpArr ** идентифицируем перевод слова и обрабатываем per$=GetArrayItem(rus$,crlf$,posRusArr) per$=StrDel(per$,1,1)
|
|
| |
Sower | Дата: Воскресенье, 08 Февраля 2009, 07:20 | Сообщение # 18 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Rush, спасибо. а что, если переводить несколько слов из одной строки, т.е. есть у меня едит, ввел я туда два слова, и перевод мне нужен двух слов!
|
|
| |
Rush | Дата: Понедельник, 09 Февраля 2009, 13:23 | Сообщение # 19 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Если нужны функции машинного перевода, то такими дилетанскими методами, как ММВ, задачу не решить. Ведь здесь нужна, как минимум, обработка на суффиксы/аффиксы/постфиксы. А это специальные словари с грамматической информацией и алгоритм грамматического анализа. Ну и т.д. и т.п. Quote Наиболее распространенной является следующая последовательность формальных операций, обеспечивающих анализ и синтез в системе машинного перевода: 1. На первом этапе осуществляется ввод текста и поиск входных словоформ (слов в конкретной грамматической форме, например дательного падежа множественного числа) во входном словаре (словаре языка, с которого производится перевод) с сопутствующим морфологическим анализом, в ходе которого устанавливается принадлежность данной словоформы к определенной лексеме (слову как единице словаря). В процессе анализа из формы слова могут быть получены также сведения, относящиеся к другим уровням организации языковой системы. 2. Следующий этап включает в себя перевод идиоматических словосочетаний, фразеологических единств или штампов данной предметной области (например, при англо-русском переводе обороты типа in case of, in accordance with получают единый цифровой эквивалент и исключаются из дальнейшего грамматического анализа); определение основных грамматических (морфологических, синтаксических, семантических и лексических) характеристик элементов входного текста (например, числа существительных, времени глагола, синтаксических функций словоформ в данном тексте и пр.), производимое в рамках входного языка; разрешение омографии (конверсионной омонимии словоформ – скажем, англ. round может быть существительным, прилагательным, наречием, глаголом или же предлогом); лексический анализ и перевод лексем. Обычно на этом этапе однозначные слова отделяются от многозначных (имеющих более одного переводного эквивалента в выходном языке), после чего однозначные слова переводятся по спискам эквивалентов, а для перевода многозначных слов используются так называемые контекстологические словари, словарные статьи которых представляют собой алгоритмы запроса к контексту на наличие/отсутствие контекстных определителей значения. 3. Окончательный грамматический анализ, в ходе которого доопределяется необходимая грамматическая информация с учетом данных выходного языка (например, при русских существительных типа сани, ножницы глагол должен стоять в форме множественного числа, при том что в оригинале может быть и единственное число). 4. Синтез выходных словоформ и предложения в целом на выходном языке. В зависимости от особенностей морфологии, синтаксиса и семантики конкретной языковой пары, а также направления перевода общий алгоритм перевода может включать и другие этапы, а также модификации названных этапов или порядка их следования, но вариации такого рода в современных системах, как правило, незначительны. Анализ и синтез могут производиться как пофразно, так и для всего текста, введенного в память компьютера; в последнем случае алгоритм перевода предусматривает определение так называемых анафорических связей (такова, например, связь местоимения с замещаемым им существительным – скажем, местоимения им со словом местоимения в самом этом пояснении в скобках). Если же тебе нужен перевод двух (или нескольких) слов в именительном падеже просто как отдельные переводы слов, то это можно реализовать. Скрипт довольно существенно усложнится дополнительными условиями. Строк на 20-25. Хотя скорость работы и не замедлится заметно... Вопрос - а зачем? Добавлено (09 Февраль 2009, 13:23) --------------------------------------------- Кстати, есть еще вариант быстрого поиска - с использованием командной строки. Его большой плюс в том, что он позволяет использовать в поиске регулярные выражения. Code word$='help' param$='WAIT,HIDE /C findstr /i /n "\<'+word$+'\>" <Embedded>\eng.txt > <Embedded>\numstr.tmp' Run("cmd","param$") numstr=VAL(StrFromFile(<Embedded>\numstr.tmp,1,1)) per$=StrFromFile(<Embedded>\rus.txt,numstr, 1)
|
|
| |
toizy | Дата: Понедельник, 09 Февраля 2009, 15:23 | Сообщение # 20 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Раш - повелитель командной строки! и вижл васика... респект!
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Rush | Дата: Понедельник, 09 Февраля 2009, 17:31 | Сообщение # 21 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Quote (toizy) Раш - повелитель командной строки! Если бы! Серединка на половинку. Quote (Rush) Кстати, есть еще вариант быстрого поиска - с использованием командной строки. Его большой плюс в том, что он позволяет использовать в поиске регулярные выражения. Вот ведь приходится себя цитировать и себя же носом тыкать - оказывается этот метод с кириллицей не дружит. Или это только у меня так?
|
|
| |
max3d | Дата: Пятница, 13 Февраля 2009, 11:54 | Сообщение # 22 |
Любопытный
Группа: Проверенные
Сообщений: 57
Репутация: 0
Награды: 0
Статус: Offline
| Интересно вот нафик распихивать в два файла? Не проще ли запихнуть все это в один файл?
|
|
| |
toizy | Дата: Пятница, 13 Февраля 2009, 15:09 | Сообщение # 23 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Продолжаю абстрагирование - чем запихивать в один файл, не проще ли запихнуть в базу данных?
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
max3d | Дата: Пятница, 13 Февраля 2009, 16:27 | Сообщение # 24 |
Любопытный
Группа: Проверенные
Сообщений: 57
Репутация: 0
Награды: 0
Статус: Offline
| То ли искать по двум файлам, то ли по бызе данных али одному тхт?
|
|
| |
Alex3A | Дата: Пятница, 13 Февраля 2009, 16:37 | Сообщение # 25 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Rush) Как я понял, строка английского значения в одном файле соответствует строке в файле с русским значением. Тогда можно так (задержки поиска нет вообще): Так и поиск то не проводится. Есть слово и его перевод, а так же номер строки, если в файле, или номер записи, если в базе. С базой "задержки поиска нет вообще" будет по быстрее, и вот почему: Поиск строки с номером N- в файле строки разделяются символами ПСВК $13$10, каждая строка имеет произвольный размер, для нахождения нужной необходимо последовательно просмотреть, с начала файла, когда встретится N-1й разделитель, текст между N-1 и N и будет искомой строкой. В связи с тем что эту операцию проводит не скрипт ммв а странслированный машинный код, то задержки поиска не наблюдается. Аналогичная операция в базе данных происходит совсем по другому. Все элементы записи имеют заранее известный размер, для доступа к нужному элементу надо вычислить ее адрес, то есть провести простую операцию х*у. Таким образом время доступа к нужному элементу не зависит от его номера, и будет одинаково для всех элементов. Конечно, при современных вычислительных возможностях, разницу между первым и вторым способом мы сможем увидеть только на очень больших объемах информации.
|
|
| |
Rush | Дата: Пятница, 13 Февраля 2009, 17:04 | Сообщение # 26 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Собственно, я прекрасно понимаю как происходит поиск и что такое базы. Вопрос здесь не терминологии, а конкретного решения конкретной задачи. Организовано было бы по другому - другое было бы и решение. Остальное - просто разговоры вокруг темы. Про отсутствие задержки, назовем это загрузкой информации в переменную, чтобы не смущать неправильным термином, говорилось не в сравнении с поиском по базе адванцед-средствами, а лишь в сравнении с циклами ММВ.
|
|
| |
Alex3A | Дата: Пятница, 13 Февраля 2009, 18:03 | Сообщение # 27 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Rush) Собственно, я прекрасно понимаю Я это писал вовсе не для тебя, тебя лечить нечего - ты сам доктор и мастер эксклюзивных решений. Что то, последнеее время, пошли, мягко выражаясь, не совсем умные вопросы и суждения, и как не странно ты на это повелся, хотя тут самым верным было бы помочь вопрошающим в изучении мат части.
|
|
| |
Sower | Дата: Воскресенье, 15 Февраля 2009, 07:08 | Сообщение # 28 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Спасибо за внимание к теме! Но я чето не могу разобраться с базами данных! Помогите!!!
|
|
| |
Alex3A | Дата: Воскресенье, 15 Февраля 2009, 12:59 | Сообщение # 29 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Grand) Но я чето не могу разобраться с базами данных! Если просто - база данных это таблица. Запись это строка в ней. поле - ячейка в строке. Ну и каждая строка (запись) имеет свой номер, однозначно на нее указывающий. В чем конкретно трудности?
|
|
| |
toizy | Дата: Воскресенье, 15 Февраля 2009, 15:22 | Сообщение # 30 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (Alex3A) простую операцию х*у Это только у меня такая иллюзия появляется при чтении этой строки?
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |