как искать слово в книге программно? - PullRequest
0 голосов
/ 29 июля 2009

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

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

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

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

Ответы [ 7 ]

3 голосов
/ 29 июля 2009

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

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

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

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

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

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

2 голосов
/ 29 июля 2009

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

2 голосов
/ 29 июля 2009

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

2 голосов
/ 29 июля 2009

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

0 голосов
/ 29 июля 2009

Вы можете посмотреть алгоритм Бойера-Мура (также, this содержит ссылку на их оригинальную статью)

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

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

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

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

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

0 голосов
/ 29 июля 2009

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

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

0 голосов
/ 29 июля 2009
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

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

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

К вашему сведению - код выше Python.

...