Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [solved] Tagi - Matematyka
Forum PHP.pl > Inne > Hydepark
eai
Według jakiego wzoru wyliczanie rangę popularności tagów?

Borykam się z problemem, jeśli częstotliwość danego tagu nie przekroczy lub nie będzie równa liczbie najwyższej rangi to nie wykorzystam najniższej rangi:

Wzór:

Rangę mam od 1 do 9;
ranga tagu = (ilość wystąpień taga/maksymalna ilość wystąpień) * ranga;

Przykładowo:
ilość wystąpień taga = 1
maksymalna ilość wystąpień = 3
ranga = 9

ranga tagu = (1/3)*9;
ranga tagu = 2.9 = 3;

W przypadku gdy jest tylko wykorzystany zakres 1-3 nie dojdziemy do najniższego zakresu 1.
Gdyby jeden tag zawierał 9 przypisań, zostanie w pełni wykorzystany zakres 1-9, pod warunkiem że najmniej popularny tag będzie miał tylko 1 przypisanie.


Czy ktoś oblicza to w inny sposób?
SHiP
Nie wiem czy o to Ci chodzi, dziwnie to wytłumaczyłeś. Na szybkiego wymyśliłem coś takiego

  1. <?php
  2. $tag = 10; // ilosc wystapien danego tagu
  3. $all = 21; // ilosc wystapien wszystkich tagow
  4. $allranks = 10; // skala rang (tutaj od 1 do 10)
  5.  
  6. $ranga = ($tag==0) ? 0 : ceil($allranks*($tag/$all));
  7. echo '<h1>'.$ranga.'</h1>';
  8. ?>
Speedy
Na tym forum w dziale "Oceny" pojawiła się kiedyś ciekawa klasa do tworzenia chmury tagów. Poszukaj winksmiley.jpg.
bim2
jak pamiętam to Balon'a smile.gif Szybciej znajdziesz
eai
znalazłem http://forum.php.pl/index.php?showtopic=52852

jednak nie jest ona doskonała, jak wyprowadze odpowiedni wzór napisze w temacie.
gdyby jednak ktoś już to rozwiązał proszę o info.

jeszcze jedno wyjaśnienie:

dane które są znane to:
1. największa ilość wystąpień jednego taga
2. najmniejsza ilość wystąpień jednego taga
3. ilość tagów
4. ilość wystąpień przetwarzanego tagu

rezultatem wzoru ma być numer wybranego zakresu od x do y, który odpowiada skali popularności tagu czyli:
najmniej popularny tag = x najbardziej popularny tag = y. to wszystko ma być wyliczone z 1 wzoru.

wiem że się da smile.gif czeka mnie dzisiaj troche matmy smile.gif
Speedy
Miałem na myśli to: http://forum.php.pl/index.php?showtopic=68963 winksmiley.jpg.
eai
http://phpfi.com/247653
http://athlan.pl/jak-zrobic-tagi/


  1. <?php
  2. $range = ceil((($iTagCount * 100) / $iMaxTag) / ceil(100 / $this->_iLevels));
  3. ?>


Athlan troche przekombinował z tym wzorem


Ten sam efekt daje mój wzór:
  1. <?php
  2. $range = round(($iTagCount/$iMaxTag)*$this->_iLevels);
  3. ?>



Wzorowi natomiast brakuje jednej wiadomej: $iMinTag tylko nie wiem jak ją podstawić, w moim wzorze oraz wzorze Athlana przyjmuje się że najmniejsze wystąpienie = 1, co nie jest prawdą bo najmniej popularny tag może mieć 3 wystąpienia.

$this->_iLevels = 9 (rangi od 1 do 9)
$iMaxTag = 9 (najbardziej popularny tag = 9)
$iTagCount = 3 (najmniej popularny tag = 3)

$range = 3;

a ze wzoru powinniśmy dostać 1 ponieważ ten tag jest najmniej popularny.



Znalazłem rozwiązanie:
  1. <?php
  2.  
  3. /**
  4.  * Zwraca popularność tagu według skali
  5.  *
  6.  * @param integer $frequency częstotliwość przetwarzanego tagu
  7.  * @param integer $frequency_min najmniejsza częstotliwość
  8.  * @param integer $frequency_max największa częstotliwość
  9.  * @param integer $range_min minimalna ranga
  10.  * @param integer $range_max maksymalna ranga
  11.  * @param integer $step skok rangi
  12.  * @return integer
  13.  */
  14. function calculate ($frequency = 1, $frequency_min = 1, $frequency_max = 1, $range_min = 1, $range_max = 9, $step = 1)
  15. {
  16. $scaleFactor = ($frequency-$frequency_min)/($frequency_max-$frequency_min);
  17. $range  = $range_max - $range_min;
  18.  
  19. return $range_min + ($step * floor($scaleFactor*($range/$step)));
  20. }
  21.  
  22.  
  23.  
  24. /** ---TESTY---- **/
  25.  
  26. $frequency_min = 6;
  27. $frequency_max = 87;
  28.  
  29. $range_min = 1;
  30. $range_max = 9;
  31. $step = 1;
  32.  
  33.  
  34. # Przykład 1 (najmniej popularny tag)
  35. $frequency = 6;
  36. echo calculate ($frequency, $frequency_min, $frequency_max, $range_min, $range_max, $step);
  37. // 1
  38.  
  39. # Przykład 2 
  40. $frequency = 18;
  41. echo calculate ($frequency, $frequency_min, $frequency_max, $range_min, $range_max, $step);
  42. // 2
  43.  
  44. # Przykład 3 
  45. $frequency = 28;
  46. echo calculate ($frequency, $frequency_min, $frequency_max, $range_min, $range_max, $step);
  47. // 3
  48.  
  49. # Przykład 4 
  50. $frequency = 56;
  51. echo calculate ($frequency, $frequency_min, $frequency_max, $range_min, $range_max, $step);
  52. // 5
  53.  
  54. # Przykład 5 (najbardziej popularny tag)
  55. $frequency = 87;
  56. echo calculate ($frequency, $frequency_min, $frequency_max, $range_min, $range_max, $step);
  57. // 9
  58.  
  59. ?>


Teraz tylko zlepić klasę i dać do oceny tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.