Webmaster Notes

Морфологический поиск по сайту в статусе перемоги.

15 января 2017, 10:44

Морфологический поиск по сайту в статусе перемоги.

У всякого сайтовладельца в голове подспудно циклически крутится вопрос, удобен ли его ресурс для посетителя. Потому как сайтовладелец много слышал о поведенческих факторах, и уже чётко знает: траст сайта от них почти целиком и зависит. А если на сайте что-то предлагается или продаётся, без траста будет только тоска и печаль — таковы реалии.

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

Другое дело — сервисы.
И самый важный из них — поиск по сайту.

Зачем нужен поиск по сайту?

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

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

Но, поняв, что сам-то сайт про искомое, пользователь далее остро нуждается в каком-то простом механизме изыскания нужной ему информации, причём уже не силами поисковика (тот и так уже сделал всё, что только мог — точнее на цель поисковик вывести не сумел).

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

Каким должен быть поиск по сайту?

Местный автор считает, что поиск по сайту не должен быть основан на поисковых технологиях Гугла или Яндекса, причём по вполне прозаическим и понятным каждому причинам:

  1. Инерционность индексации сайтов поисковиками может быть впечатляющей, особенно в случае Яндекса и/или не особо трастового сайта. Документ, попадающий в индекс спустя месяц — это заурядность.

  2. Логика поисковиков, оставляющих в индексе одни документы, и не помещающих в индекс другие документы, может быть очень странной. Причём тот индекс ещё и не статичен, и никогда не содержит всех документов сайта.

  3. Вы не можете влиять на сниппет поисковой выдачи.
    А сниппет тот может быть ещё и весьма ублюдочным по виду.

  4. С надлежащим оформлением выдачи тоже могут быть проблемы. Обычно это ифрейм, или что-то на Джаве. С тем и другим работать непросто.

  5. Ну и самое важное — алгоритм поиска Вам не подчиняется, как и перечень документов, по которым тот поиск осуществляется. А потому поиск по сайту силами Яндекса или Гугла ничем не лучше собственно поиска Яндекса или Гугла, и нашу задачу вообще никак не решает.

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

Вменяемый поиск в ЛастоБлоге.

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

За основу был взят проект phpMorphy Владимира Камаева, а также словари для русского, английского и немецкого языков к нему.

Также на просторах Интернета накопилось много кода с реализацией разных алгоритмов поиска на основе данной библиотеки, однако тщательное вкуривание всего этого добра в стиле объекто-ориентированного программирования с его классами, объектами и методами, показало, что работает оно непозволительно медленно, и память жрёт, как не в себя.

Пришлось писать собственное решение.
Для любящих знать, как оно устроено внутри, оговорим и это.

Как работает индексирование контента?

Без индекса документов никуда не деться, это понятно.

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

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

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

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

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

Процедура индексирования ресурсоёмка, но не сильно. Работа с 15 частями речи на примере самого большого поста с блога местного автора (74 kB HTML кода) заняла по времени 0.8 секунды на локальном компьютере под Денвером, и порядка 0.5 секунды на сервере. То есть вполне приемлемо.

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

Учитывая, что не у всех блоггеров посты длиной с товарный состав, как это практикуется местным автором, Ваш индекс может вмещать и 1000 Ваших постов. Это зависит от оперативки — на хостере местного автора всё исправно пашет при объёме индекса 2 мегабайта, без жалоб, стенаний и плача.

Как работает поиск по постам блога?

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

Как строится выдача, Вы уже должны догадаться.

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

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

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

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

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

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

То есть по качеству морфологический поиск не идёт ни в какое сравнение с тем, что было раньше (прямое вхождение ключа плюс вероятностное по Левенштейну, что уже костыль).

Издержки морфологического поиска.

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

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

Это не тот случай, когда морфология чем-то поможет. Ведь на этапе индексации контента слова, принадлежащие к непонятным частям речи, тупо отсеются, и в индекс даже не попадут.

Следовательно, таким сайтам морфологический поиск категорически противопоказан.

Про «похожие статьи».

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

Логичнее делать иначе, более правильно.

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

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

Про поисковые запросы.

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

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

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

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

Да, периодически накопленные поисковые запросы подвергаются селекции, и те, что наиболее слабо коррелируют с контентом сайта, подпадают под сокращение. Причём этот процесс не затрагивает запросы, пересекающиеся с «преференциями».

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

Поддерживаемые языки.

Прямо из коробки должны работать русский и английский.

Возможна работа с немецким, однако расшифровки сокращений морфологического словаря для немецкого языка у местного автора нет, и какие части речи за этими сокращениями скрываются, он не знает. Сами сокращения такие: ADJ, PA1, PA2, ADV, ART, EIG, INJ, KON, NEG, PRO, PROBEG, PRP, SUB, ZUS, VER, INF, ZAL

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

Когда и как это станет доступно?

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

Если для Вашего блога критично, чтобы он находил поиском не только слова русского языка (или английского/немецкого, в зависимости от языка блога), а и разные коммерческие аббревиатуры, то морфологический поиск Вам не подойдёт. Вы остаётесь с текущей версией скрипта «Long Dozen 26.12.14» - в дальнейшем он обновляться не будет.

По окончании января 2015 года будет издан официальный релиз ЛастоБлога с морфологическим поиском на борту, и всеми теми сопутствующими няшками, про которые выше было говорено. Он пойдёт лёгким апгрейдом (без перестановки движка), с наследованием контента, настроек и дизайна, производимых посредством пары тыков.

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

Все остальные дожидаются релиза.

На блоге автора уже живёт обновлённая версия, и её можно тестировать. На первый взгляд нерусские слова типа «Яндекс», «Гугл», «АдСенс», и прочая затейливость, вполне встроенным поиском понимаются. Как и точно отсутствующие в словаре русского языка «покемон» и «пепетун».

Комментарии к этой заметке больше не принимаются.
Все заметки категории «Бездомные заметки»