Спиральное облако тэгов

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

72 73 74 75 76 77 78 79 80 81
71 42 43 44 45 46 47 48 49 82
70 41 20 21 22 23 24 25 50 83
69 40 19 6 7 8 9 26 51 84
68 39 18 5 0 1 10 27 52 85
67 38 17 4 3 2 11 28 53 86
66 37 16 15 14 13 12 29 54 87
65 36 35 34 33 32 31 30 55 88
64 63 62 61 60 59 58 57 56 89
99 98 97 96 95 94 93 92 91 90


Я не стал тут описывать как это облако нарисовать div-но в html или как сделать наглядной картинку слов при помощи логарифмов когда их частота использования может в сотни раз различаться. Основная загвоздка стала в создании матрицы. Поэтому я написал относительно простую функцию без координат, синусов и косинусов: function spiralSort(&$arrWords){ $maxDiameter=ceil(sqrt(count($arrWords))); $intMx=ceil($maxDiameter/2)-1; $intMy=ceil($maxDiameter/2)-1; $intMr=1; //radius $intMp=0; //position $intTurn=1; //position foreach($arrWords as $key=>&$arrWord){ $arrMatrix[$intMx][$intMy]=$arrWord; $intMp++; switch($intTurn){ case 1: $intMx++; break; case 2: $intMy++; break; case 3: $intMx--; break; case 4: $intMy--; break; } //changing direction if(!($intMp % $intMr)){ $intTurn++; if($intTurn==2 || $intTurn==4){ //$intMx++; $intMr++; } if($intTurn==5){ $intTurn=1; } } } return $arrMatrix; }

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

  • Зависят ли тэги от языка статей/объектов?
  • Организованы ли слова между собой в дерево категорий что-бы избежать проблем различного семантического значения?
  • Ограничены существительными, длиной символов или знаками?
  • Чуствительны к регистру?

По теме можно посмотреть

 

RSS

Комментарии

  • Sam
    Если сделать log($weight), где $weight — вес слова, будет совсем другая картина…
  • Артём Курапов
    Ага, поэтому я сначала беру средний вес от всех полученных слов в качестве золотой середины для 1em, а потом вычисляю размер по эмпирической формуле log(1.5+round($arrWord['pop']/$intAvgFontSize,2));
  • kikaha
    Естественно, что распределение должно быть логарифмическим, я сразу его использовал в своем блоге. А за идею: 5+ ! Получается семантически верно - глаз сразу упирается в центр и видит там самые упоминаемые понятия
  • imp
    Чуть менее красивое облако можно сгенерировать более быстрым и простым способом.
    Суть в том, что упорядоченный по возрастанию весов массив тэгов мы делим на два: в первом - только нечетные элементы в исходном порядке, во втором только четные в обратном порядке. И затем выводим подряд элементы первого и второго массива
    Т.е. из послеовательности 1-2-3-4-5-6-7 получаем - два массива: 1-3-5-7 и 6-4-2, которые выводим друг за другом: 1-3-5-7-6-4-2.
    Получили семантически очень похоже - в середине наиболее "весомые" тэги.
    От оригинала отличается тем, что уменьшение весов в облаке происходит не от центра к переферии, а только по вертикали: средние строки самые "массивные", а верхние и нижние - самые легкие. При этом в строках элементы располагаются либо только по возрастанию (верхние строки), либо только по убыванию (нижние строки).
  • Никита
    Идей предложить можно много, но эффективно ли это? Взгляните на вашу систему со стороны юзера обладающего знаниями интернета и не обладающего, можно сразу заметить, что область в центре будет не самая кликаобильная, а как я понял вы хотите самые востребованные слвоа поставить в центр, так вот я считаю это не эффективным. Пользователь должен сразу увидеть часто используемый тег, т.к. востребованность его больше, а значит то, что он по нему перейдёт ещё больше, а значит он задержится на сайте.