Хмара тегів на Delphi, Різне, Програмування, статті

Сьогодні розглянемо цікаву тему – розробка хмари тегів на Delphi. Справа в тому, що в Інтернет повно різного роду php-і js-скриптів по цій темі, а ось до Delphi руки особливо у програмістів не доходять. Тим часом хмари тегів широко використовуються в програмних продуктах, наприклад в блог-клієнтів і знання про те, як ці хмари будуються будуть далеко не зайвими.


cloud


Перш, ніж приступати до розробки, звернемося до wiki що б усвідомити, що з себе представляє хмара тегів:



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


Отже, перше, що відразу беремо на замітку – чим вище релевантність, тим більше зображення тега. Тепер визначимо для себе, що ми повинні отримати на вході і виході нашого проекту.


На вхід надходить неструктурований набір (список) тегів. Це може бути таблиця бази даних або простий список типу TStrings і пр.


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


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


Тепер приступаємо до розробки нашого міні-додатки.


1. Підготовка до розробки хмари тегів на Delphi


Для того, щоб досягти поставленої мети нам необхідно:



  1. Отримати список тегів

  2. Сортувати його, враховуючи релевантність кожного тега, тобто отримати пари значень “тег – кількість згадок”

  3. Визначити розмір зображення тега в хмарі

  4. Показати хмара користувачеві.

Щоб довго не засиджуватися над малозначними (поки що) для нас деталями, будемо представляти загальний список тегів у вигляді списку в TListBox , А для виведення хмари – простий RichEdit.


Крім того, необхідно відразу визначити мінімальний розмір шрифту для тега – залишимо це на милість користувача. При розробці інтерфейсу майбутньої програми у мене вийшла приблизно наступна форма програми:


Головна форма програми

Головна форма програми


У список зліва заноситься набір тегів, в RichEdit (Він праворуч зверху) виводиться саме хмара, а знизу в ListBox виноситься список тегів відсортований в порядку згадування в списку. Останнє зроблено просто для наочності роботи додатку. Крім того, користувач сам задає мінімальний розмір шрифту для хмари.


2. Розробка “нутрощів” програми.


Отже, перше, що слід здолати – це оголосити наступний типи даних:

type
TCloud = record Tag: string; / / тег Incoming: integer ;/ / кількість згадувань в списку FontSize: integer ;/ / розмір шрифту
end;

Власне цей тип буде у нас основоположним у всій програмі. Тепер додамо глобальні змінні:

var Cloud: array of TCloud; / / хмара тегів min_incom: integer; / / мінімальне число входжень тега в список min_font: integer; / / мінімальний розмір шрифту

Перша процедура, яка відразу приходить на думку – додавання нового тега в список. Я її реалізував наступним чином:

procedure Add2Cloud(Tag: string);
var i:integer; incloud: boolean; / / true – якщо тег є в хмарі
begin
for I:=0 to length(Cloud)-1 do
begin
if Cloud[i].Tag=Tag then
begin inc (Cloud [i]. Incoming); нарощуємо число входжень тега на 1, якщо він знайдений в хмарі
incloud:=true;
break;
end;
end; if not incloud then / / додаємо новий тег в хмару
begin
setlength(Cloud, length(Cloud)+1);
Cloud[length(Cloud)-1].Tag:=Tag;
Cloud[length(Cloud)-1].Incoming:=1;
end;
end;

Тобто, береться хмара і сканується на предмет наявності додається тега. Якщо тег знайдений, то просто нарощуємо лічильник його входжень на 1, інакше вносимо новий тег в хмару.


Тепер складемо процедуру сортування хмари в порядку зростання релевантності. Для цього я вирішив використовувати бульбашковий метод сортування + вставки. На мій погляд цей метод найбільш простий у реалізації і досить добре себе показує при роботі з невеликими масивами даних. Процедура сортування хмари представлена ​​нижче:

procedure SortCloud;
var i,j: integer;
Temp: TCloud;
begin {Нульової прохід} / / Проходимо від останнього елемента до першого
for i:=length(Cloud)-1 downto 1 do
begin {Нижній елемент менше (“легше”) верхнього – піднімаємо його вище}
if Cloud[i].Incoming<Cloud[i-1].Incoming then
begin
Temp:=Cloud[i];
Cloud[i]:=Cloud[i-1];
Cloud[i-1]:=Temp;
end;
end; / / Сортуємо частину масиву
i:=length(Cloud)-1;
repeat / / Прохід від останнього до j-го елемента зверху
for j:=length(Cloud)-1 downto length(Cloud)-i do
begin
if Cloud[j].Incoming<Cloud[j-1].Incoming then
begin
Temp:=Cloud[j];
Cloud[j]:=Cloud[j-1];
Cloud[j-1]:=Temp;
end;
end;
i:=i-1;
until i<=0;
end;

Спочатку “піднімаємо” наверх елемент хмари з найменшою релевантностью, а потім просуваємося “знизу – вверх” до ni-го елемента хмари сортуючи елементи в необхідному нам порядку. Процедура виведення відсортованого хмари в ListBox виглядає наступним чином:

procedure GetSortCloud;
var i:integer;
begin SortCloud; / / сортуємо хмара ListBox2.Clear; / / стираємо попередній результат
for i:=0 to Length(Cloud)-1 do
ListBox2.Items.Add(Cloud[i].Tag+” (“+IntToStr(Cloud[i].Incoming)+”)”);
end;

Результат сортування хмари в працюючій програмі буде виглядати ось так:


tagcloud_2


Спочатку виписується тег, а за ним в дужках – кількість згадок в загальному списку.


По суті справи вже зараз ми отримали на 90% працюючу програму,. Е. визначили Глан – пари “тег – релевантність”.


Залишилася справа за малим – призначити кожному тегом свій розмір шрифту і вивести всі хмара в RichEdit .


Я не став сильно заглиблюватися в питання оптимізації хмари і вибору оптимального алгоритму призначення розмірів шрифту, тому що це дуже сильно відвернуло б нас від основного завдання, а зробив просто:


самому рідко згадується тегом призначив мінімальний розмір шрифту, а іншим – збільшив шрифт на стільки крапок, скільки разів він згадується в загальному списку … звучить може і кілька мудріший, але реалізується досить просто:

procedure GetCloudFonts;
var i:integer;
begin / / Визначаємо мінімальне входжень тегів в хмару
min_incom:=Cloud[0].Incoming;
for i:=0 to Length(Cloud)-1 do
if Cloud[i].Incoming<min_incom then
min_incom:=Cloud[i].Incoming; / / Призначаємо розмір шрифту для кожної групи
for i:=0 to Length(Cloud)-1 do
begin
if Cloud[i].Incoming=min_incom then
Cloud[i].FontSize:=min_font
else
Cloud[i].FontSize:=min_font+Cloud[i].incoming
end;
end;

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

procedure PaintCloud;
var i:integer;
begin
RichEdit1.Clear;
for i:=0 to Length(Cloud)-1 do
begin
RichEdit1.SelAttributes.Size:=Cloud[i].FontSize;
Randomize;
RichEdit1.SelAttributes.Color:=RGB(random(255),random(255),random(255));
RichEdit1.SetSelText(Cloud[i].Tag+” (“+IntToStr(Cloud[i].Incoming)+”)”+”, “);
end;
end;

В результаті, наше хмара тегів на Delphi буде виглядати наступним чином:


tagcloud_3


Як бачите в хмарі представлені всі теги в залежності від їх згадки у списку, а також, для наочності, в дужках вказано кількість входжень конкретного тега в список.


Звичайно, в строгому сенсі це не зовсім хмара, а швидше заготовка для розробки хмари тегів, але для вирішення нашої задачі цього цілком достатньо. До речі, хмара тегів в популярному блог клієнта Zoundary Raven виглядає приблизно також:


Raven_tagcloud


Можете трохи потренуватися і вивести хмара відсортовані за алфавітом, як це показано на малюнку. В принципі особливих труднощів з сортуванням строкових значень виникнути у Вас не повинно, якщо вже ви вирішили зацікавитися хмарами тегів на Delphi. А я тим часом, постараюся доопрацювати сво ю програму і отримати хмара згідно з визначенням з wiki, тобто не просто слова, а гіперпосилання на відповідні статті. Якщо вийти – обов’язково поділюся результатами з Вами.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*