2009-07-29 3 views
0

Мне нужно разработать приложение, которое может выполнять поиск по книге и перечислять все страницы и строки, содержащие заданное ключевое слово.как искать слово в книге программно?

Для книг, которые расщепляются каким-либо другим способом, например, библии, разделенной главой и стихом; они смогут найти все стихи, содержащие определенное ключевое слово. Или, альтернативно, выполните поиск в определенных главах и стихах для ключевого слова.

В какой формат следует хранить книгу? Должен ли он храниться в базе данных SQL?

Какой формат был бы самым легким для поиска, а не простым для хранения?

+2

Какой формат является книгой? У вас есть pdf? или текстовый документ? Если это библия, то текст, предоставленный уже SPLIT UP, главами и стихами, или ваша программа должна была бы также описать главу и стих? – DevinB

ответ

2

Несколько лет назад вы были Библией, уже хранящейся в базе данных Access, которую я использовал, чтобы сделать приложение точно так же, как то, о чем вы говорите. БД Access была бесплатной загрузкой. Несколько лет назад я столкнулся с одним в XML. Я не могу делать это с работы, но я бы рекомендовал выполнить поиск Библии доступа или XML-Библии и посмотреть, можете ли вы ее найти. (Я думаю, что исходный Access можно было назвать ASP Bible). Во всяком случае, если вы можете найти его, он должен дать вам представление о том, как вы можете структурировать свою базу данных.

2

Предполагается ли программа искать любую книгу или только определенную книгу? Книги, отличные от Библии, не содержат содержания, разделенных на главы и стихи, как это делает Библия. Ответ будет зависеть от того, какой формат находится в настоящее время в книге.

+0

Многие МНОГИЕ книги разделены на подразделения. Глава и стих были библейским примером. – DevinB

+0

(-1) Это не ответ, это комментарий. – DevinB

2

Я бы предложил использовать полный текстовый движок, такой как Lucene.NET. Вы получите всевозможные функции, которые вы не получили бы, если бы сделали это сами.

-3
def findWord(keyword): 
    f = open("book.txt") 
    for line in f: # horribly bad performance for a large block of text 
     if line.find(keyword) > -1: 
      print line 

Подставьте каждую строку для текста текста для конкретного примера Библии. Как вы храните текст, это действительно не имеет значения. Все, что вы делаете, - это поиск определенного текста (скорее всего, в цикле) для ключевого слова.

Если вы хотите найти номера строк и другие произвольные поля, лучше всего хранить информацию в базе данных с соответствующими полями и выполнять поиск в любом поле, которое является релевантным.

FYI - код выше - Python.

+0

(-1) Если вы говорите о книге, такой большой, как библия, этот алгоритм будет практически непригодным. – DevinB

3

Это не зависит от среды, в которой вы хотите ее запустить, и сколько запросов вы ожидаете в секунду.

Самый быстрый способ сохранить каждое слово в хеш-таблице в памяти, а значения содержат ссылку на главы/стихи или что бы вы ни называли, вы хотите получить.

Но это может плохо масштабироваться, если книга очень большая, или клиент очень тонкий.

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

Если ваша загрузка приложения может обрабатывать его, вы также можете хранить каждый стих в текстовом файле (обычный текст, XML или любой другой формат) и сканировать каждый файл, желательно с помощью XPATH или регулярного выражения. Очень дешевое и простое решение, которое вы можете сделать настолько продвинутым, насколько вам нравится, но, вероятно, медленнее. Опять же, если вам нужно обслуживать только 1 запрос в час, почему бы и нет?

Я бы использовал базу данных с полнотекстовым поиском, поскольку это масштабирует лучшее.

0

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

Когда вы знаете, какой алгоритм вы используете, выбор лучшей структуры данных (базы данных, плоского файла и т. Д.) Должен быть более простым выбором.

0

Вы можете посмотреть в алгоритм

Boyer-Moore (также, this содержит ссылку на оригинальную бумагу) К сожалению, алгоритм Бойера-Мур намного быстрее на более длинных строках, чем на поисках короткого «Ключевые слова». Таким образом, для поиска по ключевым словам вам может понадобиться реализовать какой-то искатель, который мог бы индексировать вероятные поисковые запросы.

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

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

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

Я думаю, что первая и самая важная задача - забить и затвердеть ваши требования. Затем вы должны выяснить, в каком формате вы будете , получая книги. Когда вы знаете свои ограничения, вы можете приступить к принятию решений по архитектурному дизайну.

Смежные вопросы