![]() |
|
![]() ![]() ![]() |
|
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
Здравствуйте
есть строки: первая строка вторая отличная строка третья улетная строка четвертая строка и т.д. таких строк миллионы как посоветуете поступить, что бы в дальнейшем максимально быстро можно было выбрать все строки, в которых встречается например слово "улетная" или "строка" ? на ум приходит только одно, один файл список фраз (то что вверху, оригинал) второй файл, индексы (номера позиций) отдельных слов есть идеи? хочется именно максимально быстро выбирать из огромного числа строк (реально десятки миллионов) может быть намекнет кто-нить ![]() заранее благодарю |
|||
|
||||
AVA12 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
Нужно уточнить задачу:
1. "Слово" состоит только из букв или из любых символов? Например, подстрока "вторая отличная" считается словом? 2. "Словом" является максимальная последовательность символов или фрагменты "слов" тоже считаются "словами"? Например, если есть слово "отличная", можно ли выделить из него слова "отличн", "личная", "на" и пр.? Это сообщение отредактировал(а) AVA12 - 30.10.2009, 02:20 |
|||
|
||||
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
В строке может быть как буквы так и цифры, а так же . (точка) и , (запятая)
т.е. асолютно любые последовательности выделить я тут затрудняюсь главное что бы найти нужное слово в строке т.е. если я потом буду искать все строки где есть слово "улетная" то мне надо найти все типа: улетная строка супер пупер улетная строка улетная бредятина но не нужно брать отлет птиц улетнаястрока улетные строки |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Насколько я понимаю, нужно сократить число проверяемых строк. Первое, что приходит в голову - построить для каждой строки такой признак (индекс), который быстро позволит отсечь множество строк. Например, пусть это будут все символы (строчные), входящие в строку (по одному), отсортированные по алфавиту. Для искомой подстроки строит такой же индекс, а далее ищем вхождения уже по индексам. Во первых их должно быть гораздо меньше, а во вторых - символы отсортированы, так что поиск может быть быстрым. На втором этапе проверяем строки с подходящими индексами. Вместо строчного индекса можно использовать битовый (по одному биту на символ). Тогда первичная проверка вообще пулей считаться будет - побитовое сравнение.
-------------------- ... |
|||
|
||||
aggressorus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 2.11.2006 Репутация: нет Всего: нет |
Если поиск работает в оффлайне, то в принципе можно построить массив суффиксов для всех строк разделенных каким нибудь терминальным символом. При поиске уже анализировать это целое слово или часть другого слова.
|
|||
|
||||
AVA12 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
DooZ, ты так и не ответил на вопросы.
|
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 1 Всего: 56 |
А использовать что-нибудь типа Xapian нет желания? -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
aggressorus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 2.11.2006 Репутация: нет Всего: нет |
source777,
А смысл крутить целый движок если достаточно написать нехитрый алгоритм поиска для конкретной задачи. Тут вариантов масса, можно элементарно добавить все слова в бинарное дерево и потом искать |
|||
|
||||
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
2AVA12 вроде ответил, если насчет выделить, то надо именно найти "слово" т.е. все строки где встречается слово "слово",
слово номер 1 - подходит лучшее слово тут - подходит это такое слово - подходит словоформа текста - не подходит (т.к. "слово" это часть слова "словоформа", а нам надо четко отделять "слово") пока есть один варинт работает молниеносно это составление индексов с позицией слова в основном текстовом файле т.е. пример: слово1 - тут перечислены позиции где встречается это слово (стартовая и конечная позиция) и т.д. минус один, размер индексов жуткий =) при базе 6 мегабайт (текстовик), около 70к строк индекс занимает места около 80 метров и порядка 6к файлов ![]() Добавлено через 54 секунды ЗЫ. постойка индексов конечно в таком варианте долгая (относительно), но поиск просто моментальный но этот вариант не устраивает т.к. кол-во файлов при скажем 100.000.000 слов будет жуткий Добавлено через 1 минуту и 9 секунд 100.000.000 строк т.е (фраз) |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 3 Всего: 173 |
Это inverted index. Большинство алгоритмов полнотекстового поиска используют его в том или ином виде. Индекс можно сжать многими способами: например, давать позицию не по байтам, а по блокам фиксированного размера (страницам) — чтение страницы с диска все равно занимает больше времени, чем поиск подстроки в памяти и отсев ложных попаданий. В результате уменьшается как размер одиночной позиции, так и общее их число для слова. Для хранения индексов можно использовать целые переменной длины. Я бы рекомендовал всё же воспользоваться готовой реализацией, будь то внешний индексатор (Lucene, Sphinx, Xapian) или встроенный в БД (SQLite, PostgreSQL). Это сообщение отредактировал(а) Void - 2.11.2009, 13:34 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
sqlite пробывал
я на C# пишу щас, так вот sqlite не прошел проверку =) ооооочень медленный (с индексами) а вот с Xapian проблема не работает, библиотеки взял как положено (dll) не работает, скомпилировал под себя (не работает) вот что выдает:
хотя в папке с исполняемым файлом лежат два файла: XapianCSharp.dll (этот подключается в visual studio как библиотека) _XapianSharp.dll - этот просто лежит т.к. подключить его не получается (VS ругается на него) может кто подскажет что не так и как подружить этот xapian с С#, второй день бьюсь :-( |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 1 Всего: 56 |
Попробуй в system32 кинуть, точно не могу сказать, привязки под .NET не пробовал. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
2source777 бесполезно =( не помогло
я щас Lucene ковыряю, вроде то что нужно, правда документация на нее не очень удобная, некоторые вещи не понятны =( |
|||
|
||||
DooZ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 25.11.2005 Репутация: нет Всего: 1 |
насчет ошибся xapian не хватало библиотеки zlib.dll
очень помогла программа depends которая показывает какие библиотеки требует библиотека =) буду разбираться теперь с xapian |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |