Подгонка облака тегов к доступному пространству
Учитывая слова и их частоты, а также область экранного пространства, каковы хорошие подходы для подгонки облака тегов к пространству? Вот две переменные, которыми я могу управлять:
- Размер шрифта (как абсолютный, так и градиентный)
- Число слов
Все подходы, которые я могу придумать, требуют итерации, например, устанавливают верхнюю границу для количества слов, а затем используют бинарный поиск по размеру шрифта до тех пор, пока слова не будут соответствовать области. Я бы предпочел аналитическое решение.
Одним из осложнений моей ситуации является то, что размеры облаков изменяются, поэтому алгоритм должен уметь обрабатывать 100x100 пикселей или 1000x1000 пикселей достаточно хорошо.
Изменить: я должен был сказать, что это для многофункционального клиентского приложения, а не для Интернета (следовательно, возможность изменения размера). Кроме того, я надеялся услышать что-то вроде: "Никто никогда не просматривает более 100 слов в облаке тегов, поэтому не беспокойтесь о их отображении".
3 ответа
Что мы делаем в Software Cartographer
- иметь максимальный размер шрифта,
- карта
Math.sqrt(term.frequency)
в этот диапазон (так как слова являются 2D областями), - показывать только верхние 30 (или около того) терминов,
- исключить любой мелкий шрифт, т. е. размер шрифта меньше 6 пт,
- сортировать термины в облаке по алфавиту.
альтернативы
- Вместо показа 30 лучших, выберите верх
k
такой, что нет полос прокрутки. - Вместо сопоставления наиболее часто встречающегося слова с максимальным размером шрифта используйте глобальное сопоставление, чтобы размер слова был сопоставим между облаками (это зависит от вашего варианта использования).
Насколько мне известно, эмпирические исследования облаков терминов недоступны (возможно, Джонатан Файнберг, известный в Ворльде, знает об этом больше).
Это звучит как проблема ранца, но перевернутая и с большим количеством переменных. Тривиального полного решения не существует, но, скорее всего, вы сможете найти эвристический алгоритм, который в большинстве случаев приближается к оптимальному решению.
PS: Вы можете сделать это надежно только с размерами шрифта, измеренными в пикселях. Размеры шрифта, измеряемые в пикселях, являются плохой вещью в хорошем веб-дизайне.
Вы можете создать предопределенный набор диапазонов инцидентов, которые затем могут быть связаны с размером шрифта в вашем облаке. Например:
- 0 - 100: 1
- 101 - 500: 1,2 часа
- 501 - 1000: 1,4 см, полужирный
- 1001 - 1500: 1,8 см полужирный
- 1501 - 2000: 2,0 см. Полужирный курсив / подчеркнутый / мигающий / все, что угодно...
Вы можете масштабировать облако, добавляя фиксированное смещение ко всем диапазонам в зависимости от размера контейнера.