Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyszukiwanie tagów na podstonach
Forum PHP.pl > Forum > Przedszkole
Nazad
Witam serdecznie! Jest to mój pierwszy post, choć od dawna korzystałem z pomocy udzielonej tutaj innym.

Tym razem nie znalazłem odpowiedzi na mój problem (możliwe że przez fakt, że nie wiedziałem jak zapytać).

Postawiono przede mną zadanie napisania tag cloud'a, który wyszukiwał by słowa zawarte w <div class="keywords">, następnie porządkował je według częstotliwości występowania. Problem jest taki, że podstron jest pewnie ponad 2000, a na każdej kilka keywordów.

Bardzo chciał bym przedstawić Wam napisany przeze mnie kod, niestety moja wiedza z zakresu PHP pozwoliła mi jedynie na bezproduktywne poszukiwania w google.

Jeśli ktoś był by w stanie pchnąć mnie w odpowiednim kierunku będę bardzo wdzięczny!

Pozdrawiam!

PS. Przeczytałem wymogi odnośnie postowania, starałem się udzielić tyle informacji ile mogłem.
mortus
Ważną rzeczą jest również sposób generowania tych podstron (treści). Podstrony są generowane z bazy danych, czy może inaczej jest to rozwiązane? Chmura tagów ma się pojawiać na każdej podstronie, czy tylko na jednej konkretnej?
Nazad
Dziękuję za szybki odzew i przepraszam za niezawarcie tych informacji w pierwszym poście.

Strony są generowane przez bazę danych, a chmurę chciałbym wygenerować na każdej stronie. Jest to wykonalne?
mortus
Oczywiście. Dane można wyciągnąć za pomocą kilku, lub nawet jednego zapytania do bazy danych. Stopień trudności zapytań(nia) zależy od struktury bazy. Może się zdarzyć, że w przypadku, gdy baza będzie źle zaprojektowana, wydajniejsze będzie "obrobienie" danych wyciągniętych z bazy za pomocą PHP. Rozumiem również, że chmura poprzez tagi ma wskazywać najpopularniejsze artykuły, newsy, itp. ze wszystkich artykułów, newsów, itp.? Ogólnie popularność odpowiednich tagów możemy uzyskać z bazy danych, później zostaje tylko kwestia wyświetlania tej chmury.
Nazad
Nie do końca winksmiley.jpg

Chodzi o to, żeby największe były tagi, które najczęściej występują w artykułach.

Ok, uzyskałem dostęp do bazy, wygląda to tak:

Każda z podstron dotyczy innego czasopisma, wszystkie mają takie same id dla keywordów. W bazie każde czasopismo jest skatalogowane oddzielnie i zawiera po kilkadziesiąt numerów (wydań).

Mam nadzieję że teraz dobrze nakreśliłem problem. Wybaczcie proszę, po prostu nie wiem co jest ważne, a co zbędne winksmiley.jpg
mortus
No ale tagi są podpinane pod konkretne artykuły? Czyż nie? Wszystko zależy od relacji pomiędzy artykułami i tagami, czyli od tego w jaki sposób jedno łączy się z drugim. To czy dany artykuł znajduje się w wydaniu 50 czasopisma "Na czasie", to nas nie interesuje. Nie wiem, jak to jest tam rozwiązane, bo tego nie widzę. Potrafiłbyś opisać relacje pomiędzy tagami i artykułami? Ewentualnie jakiś zrzut bazy danych, screen obrazujący tabele i relacje, cokolwiek?
Nazad
Każdy artykuł jest opisany następującymi "rubryczkami":

id, autor, adres, tytul, summary, keywords, tresc, references

Po id jest on wywoływany na stronę, reszta to już kwestia wyświetlania. Nie wiem jak to dokładniej opisać, niestety to nie ja tworzyłem bazę sad.gif

Wychodzi na to, że do każdego ID jest przypisany artykuł a w nim keywords?
mortus
No widzisz, już jakieś konkrety. Teraz jeszcze trzeba ustalić co znajduje się w kolumnie keywords. Jest tam jakiś konkretny tekst, czy może id prowadzący do innej tabeli? Jeśli id, to przedstaw mi również strukturę tej tabeli (tak jak zrobiłeś to wyżej)? Jeśli tekst, to w jaki sposób jest on formatowany?
Nazad
Tutaj akurat wszystko wygląda prosto, są to słowa kluczowe oddzielone przecinkami - wprowadzone "z palca".

Jest jeszcze jedna sprawa, baza jest lekko zaniedbana i poza poszczególnymi czasopismami jest tam też troszkę "śmiecia", da redę to załatwić tak, żeby poszukiwał keywordów tylko w czasopismach?
mortus
Da się, podejrzewam, że pole references w artykułach ma z tym coś wspólnego, czyż nie?
Nazad
Niestety, references to tylko pole do wstawienia bibliografii danego artykułu smile.gif

Ta tabela jest bardzo prosta, żadna z kategorii nie dzieli się na podtabele ani nic takiego.
mortus
To w jaki sposób artykuły są przypisane do czasopism?
Nazad
Opiszę to obrazowo (bo inaczej nie umiem smile.gif)

Kiedy wchodzę na phpmyadmin po lewej stronie mam okno gdzie znajduje się spis baz danych (?) o odpowiednich tytułach. Ty tytuły to nazwy czasopism, a wewnątrz nich znajdują się dane (ID, tytuł, keywords itp.). Dla każdego czasopisma jest to zrobione oddzielnie (a nie tak, że w atrybutach jest nazwa czasopisma).

Kiedy wchodzi się na stronę wszystkie czasopisma są w menu wyboru i przenoszą do poszczególnych spisów artykułów podzielonych na numery wydań.
mortus
Jeżeli czasopisma są tabelami w bazie danych, to ja Ci życzę powodzenia (jeśli czasopisma to osobne bazy danych, to jeszcze większego powodzenia Ci życzę). Dodatkowo słowa kluczowe, które w wielu przypadkach mogą się powtarzać umieszczone są w jednej tabeli w postaci łańcucha znaków. Moim zdaniem powinna istnieć tabela opisująca relację wiele do wielu pomiędzy artykułami, a tagami. W każdym bądź razie rozwiązanie dla jednej tabeli (czy bazy danych jest proste):
  1. <?php
  2. // nawiązujemy połączenie z serwerem baz danych
  3. // wybieramy bazę danych
  4. $query ="SELECT keywords FROM articles";
  5. $results = mysql_query($query) or die("Błąd zapytania: " . mysl_error());
  6. if(mysql_num_rows($results) > 0) {
  7. // przetwarzamy wyniki z bazy danych
  8. while($row = mysql_fetch_array($results)) {
  9. $article_keywords = explode(', ', $row['keywords']);
  10. foreach($article_keywords as $keyword) {
  11. $keywords[] = $keyword;
  12. }
  13. }
  14. }
  15. echo '<pre>';
  16. print_r($keywords);
  17. echo '</pre>';
  18.  
  19. $najczestsze_tagi = array_count_values($keywords);
  20. arsort($najczestsze_tagi);
  21. echo '<pre>';
  22. print_r($najczestsze_tagi);
  23. echo '</pre>';
Za pomocą takiego kodu możemy wyświetlić najpopularniejsze tagi, a co za tym idzie również tematy artykułów dla danego (tylko jednego) czasopisma.
Nazad
Bardzo dziękuję za Twoją pomoc! Nie spodziewałem się że w sieci można nadal spotkać tak cierpliwych ludzi winksmiley.jpg

Jeszcze jedno pytanko, bez przebudowy bazy danych raczej nie uda się połączyć wszystkich keywordów?
mortus
Pewnie się da, bo przecież w PHP możemy wylistować tabele w danej bazie danych, a nawet same bazy danych. Później należałoby się poruszać po odpowiednich tabelach (bazach) z listy i dla każdej tabeli wykonywać takie samo zapytanie. Wynik dopisywać do naszych keyword-ów. Nie wiem jaka będzie wydajność, ale podejrzewam, że mizerna. Pseudokod:
1. pobieramy z serwera listę baz danych (oczywiście do każdej musimy mieć dostęp), możemy do tego wykorzystać mysql_list_dbs(), przechodzimy do punktu 2,
2. poruszając się po wynikach uzyskanych w pierwszym punkcie wykonujemy:
2a. sprawdzamy, czy nasza baza danych to baza danych czasopisma (np. baza taka może się charakteryzować przedrostkiem czasopismo_, jeśli więc nazwa kolejnej bazy danych zawiera przedrostek czasopismo_, to znaczy, że z tej bazy musimy pobrać dane, przechodzimy do punktu 2b,
2b. łączymy się z tą bazą danych poprzez mysql_select_db(), przechodzimy do punktu 2c,
2c. wykonujemy odpowiednie zapytanie, a wyniki przetwarzamy tak, jak już wspomniałem i zapisujemy do tablicy słów kluczowych (tagów), przechodzimy do punktu 2d,
2d. jeśli była to ostatnia baza danych czasopism, to kończymy działanie i przechodzimy do punktu 3, jeśli nie to wracamy do punktu 2a,
3. zliczamy wartości w tablicy słów kluczowych - array_count_values() i sortujemy od największej do najmniejszej - arsort().
W taki oto sposób otrzymaliśmy listę wszystkich tagów występujących we wszystkich artykułach każdej bazy danych czasopism, posortowanych według popularności. Teraz pozostaje tylko kwestia wyświetlania.
Powyższy algorytm można zrealizować w 21 czytelnych linijkach w czasie 20-30 minut. Pozostaje kwestia wydajności. Przy dużych bazach danych może być z tym problem.
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.