{"Page-description":"BroStarter \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0441\u0430\u0439\u0442\u0430\u043c\u0438. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 - \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e, \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u0426\u0435\u043b\u044c \u0441\u043b\u043e\u0436\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430. \u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b) \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438).","Page-title":"BroStarter - \u043d\u043e\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u0430","Page-unique-id":"24to_new-5","JSMessages":{"redactor":{"ajax-operation-send":"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440...","close-confirm":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440?","delete-confirm":"\u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e? \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c! \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f?","input-archive-out":"\u0414\u043e\u0441\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430","input-archive-in":"\u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0432 \u0430\u0440\u0445\u0438\u0432","send-to-server-error":"\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440! \u0422\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438:"}}} 	
BroLib BroBlog Статья
BroStarter - новый взгляд на использование сайта

Основная концепция программного продукта BroStarter

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

Все версии программного продукта написаны по единым для BroGroup стандартам и правилам (PHP & JavaScript кода). Данный программный продукт затрагивает ряд соглашений в общем пользовательском соглашении BroLib.

Первоначальная и нынешняя версии (до 0.0.3 включительно) разработаны, непосредственно, только для авторского конструктора BroGroup – BroZebra. Дальнейший план развития функционала программного продукта предусматривает патчи для большинства хороших (по мнению автора) CMS.

Сам по себе функционал BroStarter представляет из себя удобный интерфейс взаимодействия с сервером (JavaScript) и обработчик на уровне сервера (PHP handler). Первоначальная версия программного продукта (версии 0.1 & меньше) создавалась и модернизировалась как модуль, который имеет отношение, непосредственно, только к BroLib, нежели как целостное отдельное API. Первоначальная версия (0.0.1) включала в себя следующий функционал:

  • Взаимодействие световых индикаторов во время загрузки (индикатор качества ответа);
  • Непосредственное запоминание запросов на уровне URL HASH строки;
  • Интуитивное управление поиском и резервирование важных событий на ключевые кнопки, такие как: ESC, Enter, Backspace;
  • Вывод четырех наиболее валидных результатов;
  • Алгоритм поиска по BroZebra XML Language Pack (взаимодействие с фреймворком BroZebra.lang & BroZebra.cwords).

Алгоритм поиска по XML Language Pack

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

Тэг, в котором был найден результат Кол-во процентов релевантности, которые начисляются ответу
MetaTitle 20%
MetaDescription 15%
MetaKeywords 10%
BroStarter_{Integer} 5% (специальный тэг тонкой настройки индексации)

При этом система учитывает кол-во совпадений в каждом из XML тэгов, добавляя статичные проценты к релевантности. Ниже приведена таблица:

Кол-во совпадений в XML-тэге Кол-во процентов релевантности
<= 2 2%
3 5%
>=4 10%

При поиске совпадений система проверит все имеющиеся языковые разделы и будет складывать проценты релевантности тэгов (сохраняя результат, прикрепленным к разделу). Таким образом, каждый выделенный и описанный раздел в BroZebra XML Language Pack, в котором было найдено хотя бы одно совпадение (раздел имеет % релевантности больше 0) будет иметь процент релевантности. Ниже приведен пример:

Для примера создадим небольшой фрагмент XML кода в BroZebra XML Language Pack, описывающий 3 разных обычных страницы. Опишем в нем два раздела (для подробного описания синтаксиса см. соответствующий раздел на странице BroZebra.lang):

XML code source
<!-- -Begin, D- Страница 1 --> <page-1> <MetaTitle>Прогулка в лесу</MetaTitle> <MyTag-1>Хороший день, чтобы прогуляться в лесу</MyTag-1> </page-1> <!-- -End, D- Страница 1 --> <!-- -Begin, D- Страница 2 --> <page-2> <MetaTitle>Летом хорошо в лесу</MetaTitle> <MyTag-1>Хороший день, чтобы прогуляться в лесу</MyTag-1> <BroStarter_1>Прогулка в лесу, замечательный лес, хорошо в лесу, зимний лес, лес как лес</BroStarter_1> </page-2> <!-- -End, D- Страница 2 --> <!-- -Begin, D- Страница 3 --> <page-3> <MetaTitle>Множество людей предпочитает гулять в лесу зимой</MetaTitle> <MyTag-1>Хороший день, чтобы прогуляться в лесу</MyTag-1> </page-3> <!-- -End, D- Страница 3 -->
Далее, для наиболее точного примера я создам таблицу запросов и конечных результатов релевантности у каждой страницы:
Текст запроса Index страниц & проценты релевантности
Хорошо в лесу
Index страницы Процент релевантности
page-1 0%
page-2 (MetaTitle 72% BroStarter 57%) 129%
page-3 0%
В лесу
Index страницы Процент релевантности
page-1 (MetaTitle 72% MyTag-1 52%) 124%
page-2 (MetaTitle 72% MyTag-1 52% BroStarter 57%) 181%
page-3 (MetaTitle 72% MyTag-1 52%) 124%
Гулять
Index страницы Процент релевантности
page-1 (MyTag-1 52%) 52%
page-2 (MyTag-1 52%) 52%
page-3 (MetaTitle 72% MyTag-1 52%) 124%

Исходя из приведенной таблицы, можно сделать вывод, что если бы к странице page-1 & page-3 был добавлен специальный тэг BroStarter_{Integer}, то результат бы был совершенно иным.

Специальный тэг BroStarter_{Integer} (для настройки индексации)

Поскольку поисковые запросы могут иметь вид, который может не существовать в используемом языковом пакете (либо может быть выдвинут не релевантный результат), было создано решение, позволяющее найти компромисс. А именно XML тэг BroStaret_{Integer}, который может дать варианту ответа 5% к релевантности. Таким образом, появляется возможность управлять отдельными запросами, создавая запросы, которые могут доминировать над другими обычными запросами, например:

XML code source
<!-- -D- a) --><MetaTitle>Замечательный день, чтобы прогуляться в лесу</MetaTitle> <!-- -D- b) --><MyTag>Замечательный день, чтобы прогуляться в лесу</MyTag> <!-- -D- c) --><MyTag-2>Замечательный денек, чтобы прогуляться в лесу</MyTag-2> <!-- -D- d) --><BroStarter_1>Замечательный день, чтобы прогуляться в лесу</BroStarter_1>
В приведенном примере существует три разных, по восприятию системой, вида XML-тэгов. Ниже приведена таблица тэгов и их процентов релевантности по запросу "Замечательный день":
Index тэга Процент релевантности
MetaTitle 72%
MyTag 52%
MyTag-2 0%
BroStarter_1 57%
Из таблицы видно, что наиболее релевантным ответом может стать совпадение, найденное в тэге MetaTitle, после него будет предложен результат из тэга BroStarter_1, после MyTag. Содержимое тэга MyTag-2 не совпало с запросом, а значит релевантность этого тэга равна 0%.

Строка с вариантами словосочетаний (обновление до версии 0.0.2)

В последствии Автор заметил необходимость внедрения некоего функционала, который позволял бы обойти создание дубликатов строк с синонимами слов. В обновлении 0.0.2 был реализован функционал Управление Вариантами Словосочетаний. Это означает, что теперь нет необходимости создавать большое кол-во дубликатов с разными вариантами отдельных слов, достаточно соблюдать некий синтаксис (пример приведен ниже):

XML code source
<BroStarter_1><![CDATA[ {Array[уточнить, проверить, узнать, получить, выяснить] информацию}, {Блог Array[мастера, мастеров, программистов, верстальщиков, дизайнеров, маркетологов, специалистов]}, ]]></BroStarter_1>

Таким образом, можно комбинировать совершенно разные строки (из большого кол-ва вариантов) и при этом не создавать дублей в BroZebra XML Language Pack. Программа сама создаст за Вас все возможные варианты со словами, которые были ей предоставлены.