Облако тегов: линейная зависимость vs логарифмическая

    Этот пост меня сподвигли написать две вещи. Автокадабра и некто под ником napisal, кто активно не соглашался с моим постом

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

    Первоё что пришло на ум — заменить линейную зависимость логарифмической, что я и сделал. Результат мне так понравился, что я решил проделать то же с облаком тегов. После чего написал пост на Mmm… tasty.

    Так изменилось облако тегов в компактном варианте (оно мение наглядно чем облако клубов, зато не такое большое):

    Линейная зависимость (до)

    Логарифмическая зависимость (после)


    Собственно, почему я решил всё таки написать об этом на Хабре? Потому что, в процессе спора с napisal, я нагуглил вот такую любопытную статью. Любопытно в ней то, что в виде облака там показаны не теги, не блоги, а статистика использования доменов первого уровня. Что навело меня на глубокие философские размышления о логарифмах статистике и космосе :-)

    Вот картинка из статьи:


    UPD из Википедии: Нормальное распределение, также называемое распределением Гаусса, — распределение вероятностей, которое играет важнейшую роль во многих областях знаний, особенно в физике. Физическая величина подчиняется нормальному распределению, когда она подвержена влиянию огромного числа случайных помех. Ясно, что такая ситуация крайне распространена, поэтому можно сказать, что из всех распределений в природе чаще всего встречается именно нормальное распределение — отсюда и произошло одно из его названий.

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

    Подробнее
    Реклама
    Комментарии 47
    • +4
      Да, наглядная демонстрация преимущества логарифмического вывода облака над линейным. Если когда-нибудь буду делать облако тегов на каком-нибудь сайте - обязательно возьму на вооружение эту методику:)
      • +1
        Любопытно!
        • +9
          Приведение экспоненциального ряда к линейному - стандартный метод в статистике. Не понимаю, почему в облаке тегов это редко применяется, ведь такая визуализация выглядит гораздо удобнее. Поставил бы плюс, если б мог - нужно нести мудрость в массы :)
          • +1
            опа, как раз сейчас делаю маленький сайт, целиком основанный на облаке тегов. Переделаю его, пока не поздно и посмотрю что получится, спасибо.
            • +1
              Один мудрий человек высказыался о бессмысленности данного облака на большинстве сайтов. много где теги нужны, но вот прыгающий шрифт иногда не помогает, а наоборот затрудняет поиск нужного тега.
              • 0
                Согласен, тоже не понимаю практической пользы вообще от любых облаков тегов - на мой взгляд они только выглядят красиво, но представления о блоге практически не дают, а уж о поиске в хаотично размещенных словах и говорить нечего.
                • 0
                  Верно. Да и вообще где-то 2/3 информации, представляемых на страницах современных блогов не только не читаются пользователями, но и в принципе малоинформативны (как ни странно).
                  Как и ранее, важен контент, а не средства его поиска. Дайте пользователю поле поиска, он и сам сможет ввести искомые фразы. Облако тегов, просто напросто, превращается в "феничку" для сеошников.
                  • +2
                    Облако тэгов не очень нужно, но вот тэги под статьей бывают полезными, когда ищешь другие материалы на данную тему.
                    • 0
                      почти не встречал облака тегов на лытдыбрах, а вот на тематических блогах без него туговато. ведь если есть контент, то искать некоторые вещи будет значительно проще если есть это самое облако. всё просто - оно нужно там где оно нужно для поиска.
                    • 0
                      Для завсегдатаев они не нужны, но для новичков - очень даже полезны. Вот тут рассказывается как их можно по тексту строить - очень даже наглядно. Для русского, впрочем, нужна морфология...
                      • 0
                        По тексту их нельзя строить никак. Тут необходимо понимание смысла, а далеко не только морфология.
                        Тег отражающий главную тему поста может совсем не присутствовать в тексте.
                        • 0
                          тег средство для поиска. иногда оно нужно именно завсегдатаю, что бы найти какой-либо пост - по тегу значительно проще, чем вспоминать ключевые слова из самого поста.
                        • 0
                          Можно, как идею, предложить под облаком тегов сделать ссылку типа "Уровнять для наглядности", по нажатию на которую простейший скрипт на jQuery делает все теги одинакового размера для того, чтобы поиск стал проще.
                      • +1
                        канешно любопытно, но может вы не корректно считаете линейную зависимость веса тага и размера шрифта?

                        как делаю сам, и не жалуюсь:
                        define(FONT_MIN, 11);
                        define(FONT_MAX, 22);
                        /**
                        * Считает размер шрифта для тага
                        *
                        * @param integer $n вес текушего тага
                        * @param integer $min максимальный вес тага
                        * @param integer $max минимальный вес тага
                        * @param integer $count обшее количество тагов
                        * @return integer
                        */
                        function tags_size($n, $min, $max, $count)
                        {
                        // $n = log($n + 1); // зачем снижать точность?
                        $step = ((FONT_MAX - FONT_MIN) / ($max - $min));
                        $size = FONT_MIN + ($n - 1) * $step;
                        return floor($size);
                        }

                        ---
                        в данном случае логарифм только испортит все
                        • 0
                          эмм, а зачем во входных параметрах $count? раньше он использовался, а сейчас нет?
                          • 0
                            да (: куски старого кода - $count нафик не нужен
                            • 0
                              и еще вопрос, а если вес тега - 0, то он заранее где-то фильтруется или он будет размером на (-1)*$step меньше чем FONT_MIN?
                              • 0
                                нулевой вес не может быть, потому как на этапе сборки тагов делается INNER JOIN с таблицое данных.
                                с FONT_MIN ни как не связано.
                                скажем так, количество связей тага и размер шрифта это не одно и тоже, а многие это путают - отсуда и проблемы а потом их же решения путем логарифмирования.
                          • 0
                            Ну да, так у меня и было, примерно. По тому же принципу сделан правый вариант (про домены).
                            • 0
                              пардон, но я посто не понял куда и зачем логарифм? (:
                              попробывал на своей формуле - точность сильно упала, что все стали почти одинаковые.
                              что я делаю не так?
                          • 0
                            Мне кажется в коде ошибка - нужно не $size = FONT_MIN + ($n - 1) * $step, а $size = FONT_MIN + ($n - $min) * $step;
                            Тогда получим нормальное обратное преобразование текущей абсолютной величины шрифта. Если будет -1, то величина шрифта будет выходить за пределы диапазона
                          • 0
                            Посоветуйте использовать это Last.fm)
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • 0
                                Очень интересно, как раз собирался писать облако тегов. Думал чем разнообразить, как сделать получше. Спасибо за статью. Логарифмическая зависимость нагляднее, информативнее.
                                • 0
                                  а как именно выглядит вычисление веса? как-то так?
                                  $font_size_percent = ceil ( log ( $tag_count + 1 ) * 100 );
                                  • 0
                                    Ну да. Как-то так.Только не $tag_count, а $post_count

                                    Потом надо ещё учесть, что, если вы хотите уместить размер тегов в заданный диапазон (например от 10px до 100px), то надо сначала найти вес самого маленького wMin t и самого большого тега wMax, и сделать так чтобы
                                    weight(wMin) = 10px
                                    weight(wMax) = 100px
                                    Могу подробнее привести алгоритм, когда до работы доеду
                                    • 0
                                      спасибо, я про минимум и максимум просто не дописал. мне нужна была основная формула расчёта.
                                      но вы, как доедите до работы — пишите.
                                      • +2
                                        // Размер тега будет от 10 до 100 у.е.
                                        minSize = 10
                                        maxSize = 100
                                        sizeRange = maxSize - minSize

                                        // В нашем облаке количество публикаций варьируется от ... и до ...
                                        minCount = log(Минимальное_количество_публикаций + 1)
                                        maxCount = log(Максимальное_количество_публикаций + 1)
                                        countRange = maxCount - minCount

                                        // Секретная формула :-)
                                        // count - колличество публикаций для данного тега
                                        Размер_тега(count) = minSize + log(count + 1) - minCount) * sizeRange / countRange
                                        • 0
                                          Можете объяснить, зачем в log(count+1) прибавлять единицу?
                                          • 0
                                            потому что от 1 до 0 логарифм уходит в -бесконечность
                                          • 0
                                            Размер_тега(count) = minSize + log(count + 1) — minCount) * sizeRange / countRange

                                            скобка после minCount закрывается, а открывается где?
                                            пробывал использовать но пока разброс как то крив =(
                                            • +1
                                              Вы наверно то-то наутали. Я могу подробнее объяснить:

                                              Увеличение популярности тега идёт по экспоненте:
                                              1 раз, 2 раза, 4 раза, 8 раз, 16 раз (и т.д. только основание не 2, а e)

                                              Размер тегов увеличивается линейно
                                              0.4 em, 0.7 em, 1 em, 1.3 em, 1.6 em (и т.д. с выбранным вми шагом, тут 0.3)

                                              По этому, для хорошего визуального отображения нам нужно прологарифмировать эти число постов для тега (обратная экспоненте операция) и привести результат к нужному диапазону который вы выбрали для задания размера тегов. На Хабре ипользуются стили w1, w2, w3 и т.д. до w10 (по моему)

                                              1) Если взять логарифм от числа публикаций получим число которое лежит в диапазоне от minCount = log(Минимальное_количество_публикаций + 1) до maxCount = log(Максимальное_количество_публикаций + 1)

                                              2) Если вычесть из этого числа minCount получим число от 0 до maxCount — minCount. Правильно?

                                              3) Теперь делим это число на maxCount — minCount и получаем значение от 0 до 1

                                              4) Допустим из этого мы хотим получить значение от minSize = 10 до maxSize = 100 (это возможные размеры тегов). Что для этого нужно: умножить на 90 и прибавить 10. Т.е. x*(maxSize — minSize) + minSize

                                              А дальше вы сами :)
                                              • 0
                                                очепятка на очепятке :) сори
                                                • 0
                                                  Ох спасибо, теперь все встало на свои места, разобрался…
                                                  Ман в фавы =)
                                      • 0
                                        Отлично.
                                        • +2
                                          В принципе, логарифмическая зависимость очень подходит для таких целей - при малом tag_count рост веса происходит быстрее, а затем с увеличением tag_count возрастание веса замедляется - как раз то, что нужно :-) Большое спасибо)
                                          • +2
                                            Отличная демонстрация такого явления, как "длинный хвост"!
                                            http://en.wikipedia.org/wiki/The_Long_Ta…

                                            Большое спасибо!
                                            • 0
                                              Прикольно, не слышал этого термина ещё :)
                                            • +1
                                              Спасибо за идею. Немедленно опробовал и действительно получилось нагляднее. Спасибо)))
                                              • 0
                                                Я бы добавил частотный порог для входа в облако.
                                                Было бы еще информативнее.
                                                • 0
                                                  Временной могу себе представить.
                                                  А вот частотный - не представляю
                                                • –1
                                                  Не разделяю положительные оценки других участников. Результат похож на многократное акцентирование цветом в веб-дизайне. Т.е. если есть 2 акцента, то они сразу бросаются в глаза, а когда их 10, весь смысл акцентов пропадает - самую важную информацию найти не легче, чем средней важности. Понимаете?
                                                  И пример тэгов по доменам очень подходящий - 90% юзеров нужен будет домен com, но найти его им будет не так легко.
                                                  • +2
                                                    Логарифмическая зависимость отражает тот факт, что арифметической прогрессии в природе не существует.
                                                    Если каких-то тегов больше чем других, то их больше не НА а ВО сколько-то раз.

                                                    Как бы это попроще объяснить... Если какой-то тег люди на сайте начнут употреблять чаще, то его станет больше В некое колличество раз.
                                                    • 0
                                                      Сумбур какой-то получился. Надо пообедать и получше изложить мысль
                                                      • 0
                                                        дане, нормально, понятно. никогда не задумывался. спасибо:)
                                                      • 0
                                                        Примерно понял, что вы имеете ввиду. Но это не применимо к тэгам.
                                                        Тэги это фильтр вывода информации и от того, что какой-то тэг чаще нажмут его не начнут употреблять чаще.

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

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.