Быстрый рекурсивный поиск в больших объёмах текста - это просто!

  • Когда Вы пользовались действительно хорошим поиском информации?
  • Чем Вы ещё пользуетесь, кроме поисковых гигантов Bing, Google, Yahoo, Yandex для поиска необходимой Вам информации в сети Интернет?
  • Насколько сложно сделать такой на собственном сайте или это только отчасти подвластно Интернет-гигантам и даже они ещё не пришли к нужному результату?
  • Вы тоже считаете, что это невозможно сделать обычному рядовому разработчику сайтов?
Ответ прост: просто ещё никто не объяснял как сделать грамотно.
Давайте устраним этот нелепый пробел: каждый же хочет свой личный гугл в кармане)

Итак, поехали...

Что у нас есть в тексте такого, что нужно помнить и учитывать всегда:
0. знакоместо (определённое количество бит для данной кодировки)
1. символ
2. буквы, цифры, и все другие символы

3.1. слово (набор букв, несущий некий смысл),
3.2. номер (цифры, целые и дробные значения, включая различные формы написания)
3.3. дефис (нечто среднее между отсутствующим символом и разделителем слов!),
3.4. идентификатор (модель, деталь, артикул и т.д., где всё буквы цифры и дефис - следуют хаотично),
3.5. разделители слов/номеров/идентификаторов. Обычно - знак "пробел", но лучше учитывать так: "любой символ (или его повтор), кроме п.3.1, 3.2, 3.3 и 3.4". Все повторяющиеся символы, идущие подряд (дубликаты и повторы) - обязательно приводим к единому!
3.6. знаки препинания и пунктуации (то, что мы пишем, но не произносим)

4. словосочетания, предложения, абзацы, параграфы, разделы, главы
5. также, текст делится на разные составные части: цитаты, диалоги, списки и т.д.

Создаём 3 таблицы:
1. таблицу-"дерево" слов: ID, слово, разделитель (ID), следующее слово (ID)
2. таблицу ресурсов слов: ID, ID-ресурса (например, конкретная публикация), ID-слова
3. таблица разделителей: ID, разделитель, описание


Что такое разделители? Это:
1. разделитель слова ("пробел" и т.д.),
2. разделитель простых предложений внутри сложного ("запятая"),
3. разделитель предложений ("точка" и др. знаки),
4. разделитель абзацев (символ переноса строки или указатель на новый абзац/параграф например, "p", "div", и т.д.)

Т.е., формируем отдельную таблицу разделителей слов.
После - используем только ID-разделителя в таблице-"дереве" слов.

Ресурс - это ID-текста, заголовка, линка и т.д., т.е. идентификатор контейнера текста, где это слово встречается.

После этого мы имеем возможность просмотра шинглы любой длины, вернее - глубины. Мы берём нужное слово и рекурсивно по дереву начинаем спуск, как только результат нам не интересен - прерываем спуск, лучшие цепочки - сохраняем всего двумя параметрами из таблицы-"дерева" слов: ID и глубину (2 - два слова подряд и т.д.)

Таким образом, мы можем делать одинаково как прямой, так и обратный рекурсивный поиск цепочек совпадений слов по такому "дереву".
По флагу-разделителю - мы может отсекать поиск цепочек тогда, когда нам это не нужно.

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

Подписка на новости:

Самые полезные и признанные экспертами публикации в сферах IT-бизнеса и Web-разработки:

Сертификат

Certificate for nickname xmoonlight, is registered to: https://sitecoder.blogspot.com