Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как посоветуете индексировать? 
:(
    Опции темы
DooZ
Дата 30.10.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



Здравствуйте

есть строки:

первая строка
вторая отличная строка
третья улетная строка
четвертая строка
и т.д.

таких строк миллионы

как посоветуете поступить, что бы в дальнейшем максимально быстро можно было выбрать все строки, в которых встречается например слово "улетная" или "строка" ?

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

есть идеи?
хочется именно максимально быстро выбирать из огромного числа строк (реально десятки миллионов)

может быть намекнет кто-нить smile

заранее благодарю
PM MAIL   Вверх
AVA12
Дата 30.10.2009, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 1
Всего: 4



Нужно уточнить задачу:

1. "Слово" состоит только из букв или из любых символов? Например, подстрока "вторая отличная" считается словом?
2. "Словом" является максимальная последовательность символов или фрагменты "слов" тоже считаются "словами"? Например, если есть слово "отличная", можно ли выделить из него слова "отличн", "личная", "на" и пр.?

Это сообщение отредактировал(а) AVA12 - 30.10.2009, 02:20
PM ICQ Jabber   Вверх
DooZ
Дата 30.10.2009, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



В строке может быть как буквы так и цифры, а так же . (точка) и , (запятая)
т.е. асолютно любые последовательности

выделить я тут затрудняюсь
главное что бы найти нужное слово в строке
т.е. если я потом буду искать все строки где есть слово "улетная"

то мне надо найти все типа:
улетная строка
супер пупер улетная строка
улетная бредятина

но не нужно брать

отлет птиц
улетнаястрока
улетные строки
PM MAIL   Вверх
Earnest
Дата 30.10.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Насколько я понимаю, нужно сократить число проверяемых строк. Первое, что приходит в голову - построить для каждой строки такой признак (индекс), который быстро позволит отсечь множество строк. Например,  пусть это будут все символы (строчные), входящие в строку (по одному), отсортированные по алфавиту. Для искомой подстроки строит такой же индекс, а далее ищем вхождения уже по индексам. Во первых их должно быть гораздо меньше, а во вторых - символы отсортированы, так что поиск может быть быстрым. На втором этапе проверяем строки с подходящими индексами. Вместо строчного индекса можно использовать битовый (по одному биту на символ). Тогда первичная проверка вообще пулей считаться будет - побитовое сравнение.



--------------------
...
PM   Вверх
aggressorus
Дата 30.10.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.11.2006

Репутация: нет
Всего: нет



Если поиск работает в оффлайне, то в принципе можно построить массив суффиксов для всех строк разделенных каким нибудь терминальным символом. При поиске уже анализировать это целое слово или часть другого слова.
PM MAIL   Вверх
AVA12
Дата 30.10.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 1
Всего: 4



DooZ, ты так и не ответил на вопросы.
PM ICQ Jabber   Вверх
source777
Дата 30.10.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 1
Всего: 56



Цитата(DooZ @  30.10.2009,  00:47 Найти цитируемый пост)
таких строк миллионы
как посоветуете поступить, что бы в дальнейшем максимально быстро можно было выбрать все строки, в которых встречается например слово "улетная" или "строка" ?

А использовать что-нибудь типа Xapian нет желания?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
aggressorus
Дата 30.10.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.11.2006

Репутация: нет
Всего: нет



source777
А смысл крутить целый движок если достаточно написать нехитрый алгоритм поиска для конкретной задачи. 

Тут вариантов масса, можно элементарно добавить все слова в бинарное дерево и потом искать
PM MAIL   Вверх
DooZ
Дата 2.11.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



2AVA12 вроде ответил, если насчет выделить, то надо именно найти "слово" т.е. все строки где встречается слово "слово",
слово номер 1 - подходит
лучшее слово тут - подходит
это такое слово - подходит
словоформа текста - не подходит (т.к. "слово" это часть слова "словоформа", а нам надо четко отделять "слово")

пока есть один варинт работает молниеносно
это составление индексов с позицией слова в основном текстовом файле

т.е. пример:
слово1 - тут перечислены позиции где встречается это слово (стартовая и конечная позиция)
и т.д.

минус один, размер индексов жуткий =)
при базе 6 мегабайт (текстовик), около 70к строк
индекс занимает места около 80 метров и порядка 6к файлов smile

Добавлено через 54 секунды
ЗЫ. постойка индексов конечно в таком варианте долгая (относительно), но поиск просто моментальный
но этот вариант не устраивает т.к. кол-во файлов при скажем 100.000.000 слов будет жуткий

Добавлено через 1 минуту и 9 секунд
100.000.000 строк т.е (фраз)
PM MAIL   Вверх
Void
Дата 2.11.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 3
Всего: 173



Цитата(DooZ @  2.11.2009,  14:51 Найти цитируемый пост)
пока есть один варинт работает молниеносно
это составление индексов с позицией слова в основном текстовом файле

Это 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
PM MAIL WWW GTalk   Вверх
DooZ
Дата 2.11.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



sqlite пробывал
я на C# пишу щас, так вот sqlite не прошел проверку =) ооооочень медленный (с индексами)
а вот с Xapian проблема
не работает, библиотеки взял как положено (dll) не работает, скомпилировал под себя (не работает)
вот что выдает:

Код

Exception: System.TypeInitializationException: Инициализатор типа "Xapian.Xapian
" выдал исключение. ---> System.TypeInitializationException: Инициализатор типа
"Xapian.XapianPINVOKE" выдал исключение. ---> System.TypeInitializationException
: Инициализатор типа "SWIGExceptionHelper" выдал исключение. ---> System.DllNotF
oundException: Не удается загрузить DLL "_XapianSharp": Не найден указанный моду
ль. (Исключение из HRESULT: 0x8007007E)
   в Xapian.XapianPINVOKE.SWIGExceptionHelper.SWIGRegisterExceptionCallbacks_Xap
ian(ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate,
 ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelega
te, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDel
egate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, Ex
ceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, Excepti
onDelegate systemExceptionDelegate)
   в Xapian.XapianPINVOKE.SWIGExceptionHelper..cctor()
   --- Конец трассировки внутреннего стека исключений ---
   в Xapian.XapianPINVOKE.SWIGExceptionHelper..ctor()
   в Xapian.XapianPINVOKE..cctor()
   --- Конец трассировки внутреннего стека исключений ---
   в Xapian.XapianPINVOKE.DB_CREATE_OR_OPEN_get()
   в Xapian.Xapian..cctor()
   --- Конец трассировки внутреннего стека исключений ---


хотя в папке с исполняемым файлом лежат два файла:
XapianCSharp.dll (этот подключается в visual studio как библиотека)
_XapianSharp.dll - этот просто лежит т.к. подключить его не получается (VS ругается на него)

может кто подскажет что не так и как подружить этот xapian с С#, второй день бьюсь :-(
PM MAIL   Вверх
source777
Дата 2.11.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 1
Всего: 56



Цитата(DooZ @  2.11.2009,  15:37 Найти цитируемый пост)
_XapianSharp.dll - этот просто лежит

Попробуй в system32 кинуть, точно не могу сказать, привязки под .NET не пробовал.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
DooZ
Дата 2.11.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



2source777 бесполезно =( не помогло
я щас Lucene ковыряю, вроде то что нужно, правда документация на нее не очень удобная, некоторые вещи не понятны =(
PM MAIL   Вверх
DooZ
Дата 4.11.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



насчет ошибся xapian не хватало библиотеки zlib.dll
очень помогла программа depends которая показывает какие библиотеки требует библиотека =)
буду разбираться теперь с xapian
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1037 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.