1. Чего хотим


АЗ Сутра — это система для общения в сети как на форумах или в жж, только лучше. Слова «как на форумах и в жж» означают, что основа сутры та же: разговор — это совокупность отдельных сообщений, опубликованных пользователями. Чтобы было лучше, мы придумываем для этой совокупности некоторое оснащение. Одна из идей сутры — показывать пользователю ветку общения в виде выборки (например, разговор состоит из 100 сообщений, а пользователь задает такой масштаб просмотра, что система показывает ему всего 6 сообщений, или 10, или сколько захочет сам юзер). Показатель, по которому сообщения будут отбираться для показа, мы назвали видимостью (то есть для каждого сообщения при определенных условиях просмотра надо определить число, которое будет называться видимостью этого сообщения при данных условиях просмотра). Ниже находится рассказ о том, как вычислять видимость.

2. Элементы и обозначения


Рассмотрим какое-нибудь сообщение и обозначим его m. У сообщения m, кроме его содержания, есть атрибуты, которые запоминает система.

Важно, кто и когда опубликовал сообщение: через σ(m) будем обозначать автора сообщения m, через t0(m) обозначается момент публикации сообщения m.

Каждое сообщение снабжено одним или несколькими тематическими ярлыками. В каждом ярлыке сообщению приписывается (вычисляется) значимость. Грубо-приблизительно говоря, значимость сообщения — это количество «плюсиков», выставленных сообщению читателями. Напомню: в сутре плюсик ставится не просто сообщению, а сообщению в определенном ярлыке: например, сообщение на тему «Тараканы в русской классической литературе», помеченное ярлыками «литература» и «энтомология», может заслужить горячее одобрение филологов, но остаться незамеченным энтомологами: в результате этого в ярлыке «литература» у этого сообщения будет большая значимость, а в ярлыке «энтомология» — маленькая. Сами «плюсики» тоже неравнозначны: вес оценки зависит от веса того, кто её выставляет (у пользователей тоже есть своя значимость) — но это пока оставим за скобками. Как именно вычисляется значимость, мы обсудим в другой раз. Введем обозначение: значимость сообщения m в ярлыке s обозначается e[s](m) = e[s](m, t) (t — это время, значимость зависит от времени). Каждому сообщению m можно приписать зависящий от времени вектор значимостей

e(m) = (e[s1](m), e[s2](m),..., e[sN](m)),

где s1, s2,..., sN — все ярлыки, имеющиеся в системе.

Учитываются генетические связи между самими сообщениями: у каждого сообщения могут быть «потомки» и «предки» («предшественники»). Если сообщение m2 написано в ответ на сообщение m1, то сообщение m1 будем называть непосредственным предком или предшественником для m2, а m2 — непосредственным потомком. Если сообщение m2 написано в ответ на сообщение, являющееся непосредственным потомком сообщения m1, то m2 будем называть прямым потомком (или просто потомком) сообщения m1. Если сообщение m2 написано в ответ на сообщение, являющееся потомком сообщения m1, то m2 будем также называть (прямым) потомком сообщения m1. Аналогично определяются прямые предки (предшественники).

3. Из чего будет собираться видимость


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

Нефокусное сообщение, для которого вычисляется видимость, назовем сообщением-кандидатом.

Имеет делать видимость зависимой от: (1) значимостей сообщения-кандидата, (2) степени родства фокусного сообщения и сообщения-кандидата, (3) тематической близости фокусного сообщения и сообщения-кандидата, (4) предполагаемого интереса наблюдателя к сообщению-кандидату и (5) времени.

4. Попытка сборки формулы видимости


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

Как учитывать значимость сообщения-кандидата? Понятно, что более значимое сообщение должно быть и более видимым. Но значимость — многомерная характеристика, она (скорее всего) не определяет линейный порядок на множестве сообщений (если пытаться сравнить два сообщения, то мы всегда можем сказать, какое из них более значимо в конкретном ярлыке, но какое из них просто «более значимо», мы сможем сказать далеко не всегда). Можно просто просуммировать значимости сообщения-кандидата по всем ярлыкам или иным способом вычислить норму вектора значимостей, но такой подход выглядит прямолинейно, туповато. Представляется более интересным делом учитывать преимущественно значимости сообщения-кандидата в тех ярлыках, в которых значимо фокусное сообщение. Например, можно использовать скалярное произведение

e(m), e(p) = ∑j e[sj](m)e[sj](p)

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

Это скалярное произведение убивает, кроме первого зайца «значимость», еще и зайца № 3 — тематическую близость сообщений (это не идеальный вариант вычисления тематической близости, но можно взять его на первое время). Выпишем первую пробную формулу для видимости:

V(m; α, p, t) = e(m), e(p).

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

Степень родства может влиять на видимость так: чем более близкими родственниками являются фокусное сообщение и сообщение-кандидат, тем более видимым будет кандидат. Для определения родственной близости естественно рассматривать структуру сутры как графа-дерева, в котором сообщение связано ребром с каждым своим непосредственным (но не прямым!) потомком и с (единственным) непосредственным предшественником. Можно просто подсчитывать количество ребер между сообщениями p и m, и называть это коэффициентом родственности (обозначим его b(p, m)). C учетом родственности формулу видимости можно скорректировать так:

V(m; α, p, t) = e(m), e(p)/(3 + b(p, m)).

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

Два слова об учете предполагаемого интереса наблюдателя к сообщению-кандидату. Можно (хотя спорный вопрос: нужно ли) ввести в формулу некий бонус или повышающий коэффициент для тех сообщений-кандидатов, которые имеют вы- сокую значимость по тем ярлыкам, в которых и сам наблюдатель имеет высокую значимость. Аргумент против этого коэффициента — таким образом мы препятствуем расширению кругозора наблюдателя, что нехорошо.

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

V(m; α, p, t) = ϕ(tt0(m))e(m), e(p)/(3 + b(p,m)))

где t — текущее время (момент просмотра), а функция ϕ — это какая-нибудь разумная функция, которая принимает большие значения при малых значениях аргумента и близкие к 1 значения, если аргумент большой.

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

5. Заключение


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

Описание работы системы AZ.
Бета-версия системы AZ.