Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasyfikator treści
Forum PHP.pl > Forum > PHP
nimda
Witam,
zabiram się do napisania skryptu, a właściwie systemu ekspertowego, do klasyfikowania wpisów na podkategorie wg ich treści. Założenia są ogólnie proste, dodajemy wpisy, wpis zawiera treść, temat oraz kategorie główną, np. Rodzina. Po dodaniu wpisu dokonywana jest analiza treści i tematu, w zależności od kategorii (wstępna klasyfikacja podana przez uzytkownika) wybierany jest zestaw podkategorii (np. dla kategorii Rodzina byłoby to mama, tata, dziadek, babcia itd.) i wśród nich odpowiednio do treści wybieranybyłby najbardziej pasujący. Zastanawiam się jak się do tego zabrać, na pewno potrzebna będzie duża baza słownikowa, mam 10 kategorii głównych, no i sam algorytm będzie rzeczą najtrudniejszą. Jeśli ktoś z Was spotkał się z takim problemem, albo ma jakis pomysł na rozwiązanie tego zagadnienia, byłbym bardzo wdzięczny za pomoc,

pozdrawiam
cudny
Zastanów się czy podkategorii będziesz miał nieskończenie wiele (czy to będzie drzewko) czy będziesz miał tylko kat. nadrzędną i do niej jakieś kategorie podrzędne bez złożonych struktur.
Jeśli będzie to drzewko kategorii do tego tworzone dynamicznie i nie wiadomo jaka będzie to ilość podkategorii to mówimy tu o czymś bardzo ciekawym co ostatnio robiłem w kilku projektach smile.gif
Mój pomysł to:
  1. $categories = array('id' => 1, 'parent_id' => 1, 'name' => 'rodzina', 'descript' => 'jakiś opis rodzinki');
  2. $categories = array(
  3. 1 => array('id' => 1, 'parent_id' => 1, 'name' => 'rodzina', 'descript' => 'jakiś opis rodzinki', 'categories' => array()),
  4. 2 => array('id' => 2, 'parent_id' => 2, 'name' => 'zwierzeta_w_domu', 'descript' => 'jakiś opis teściów', 'categories' => array())
  5. );
  6. $categories[1]['categories'] = array(
  7. 3 => array('id' => 3, 'parent_id' => 1, 'name' => 'babcia', 'descript' => 'jakiś opis babci', 'categories' => array()),
  8. 4 => array('id' => 4, 'parent_id' => 1, 'name' => 'tata', 'descript' => 'jakiś opis taty', 'categories' => array())
  9. );
  10. $categories[2]['categories'] = array(
  11. 5 => array('id' => 6, 'parent_id' => 2, 'name' => 'tesciowa', 'descript' => 'jakiś opis teściowej', 'categories' => array()),
  12. 6 => array('id' => 5, 'parent_id' => 2, 'name' => 'tesc', 'descript' => 'jakiś opis teścia', 'categories' => array())
  13. )

i tak dalej robisz sobie złożoną strukturę kategorii i podrzędnych im podkategorii.
Najłatwiej to zrobić w BD ale jak można zauważyć aby pobrać całe drzewko rekurencyjnie każdą z podkategorii trza by zapytaniem ładować co zabija server.
Ja to włożyłem do XML i hula jak złoto smile.gif
Do szukania używam xpach(); ale szukam tylko po id, wiec tobie by wypadało zrobić dla XML relację w bazie po ID i tam wkładać opisy dla podkategorii - wtedy zwykły opis like('%babcia%') i wyciąga ci wszystkie ID, a jak chcesz pobrać drzewko to nie siepiesz zapytań do bazy tylko normalnie robisz rekurencyjnie tablicę wielowymiarową z XML biggrin.gif
nimda
no właśnie nie sprecyzowałem, do jednego wpisu dodajemy jedną podkategorie. Podkategorie nie mają już swoich podkategorii więc to nie będzie drzewko. to będzie mniej więcej coś na zasadzie tagów do wpisów dodawanych automatycznie. Wszystko opierać się będzie na bazie danych MySQL, gdzie trzymałbym baze wiedzy i reguł
cudny
No powiem Ci że sporo mielenia będzie. Ile planujesz słów kluczowych w danej podkategorii ? Bo jeśli nie dużo to pokusił bym się o regexp w mysql, ale jeśli dużo keywordsów będziesz miał to trzeba by to jakoś trzymać osobno i raczej w php zrobić algorytm. Napisz też ile podkategorii (pi razy drzwi) średnio będzie w każdej z kategorii głównej.
Jak się wybierze metodę wyszukiwania już to dalej sprawa będzie w miarę prosta.
Proponuję pobrać keywordsy z każdej z podkategorii (załóżmy, że każda z nich to 10 keywordsów) i porównać ile keywordsów z danej podkategorii pasuje do textu i tematu. Zwycięzca dostaje nagrodę - do niego przypisujemy wpis biggrin.gif
Daj znać co z pierwszą częścią mojego posta to się coś wymyśli smile.gif
nimda
ogolnie strukture w bazie widziałbym mniej więcej tak

Kod
kategoria     podkategoria   słownik
rodzina         Matka       mama, mamy, mamie ...
rodzina         Tata        tata, tacie, taty, tatą ...
.
.
.

podkategorii będzie około 10 dla każdej kategorii głównej, ale co do słownika to nie mam pojęcia, pewnie mniej jak 20 dla jednej pozycji to na pewno nie... zastanawiałem się też nad rozwiązaniem które zaproponowałeś, Twoje rozwiązanie tak na prawdę nasuwa się na myśl jako pierwsze, tylko czy jest najbardziej skuteczne? ja wiem, że sie czepiam ; ) ale algorytm zliczający słowa nie zawsze będzie działał poprawnie, z drugiej strony nie mam pojęcia co mozna by było zrobić wzamian..
cudny
A ja wiem czy nie da ci odzwierciedlenia ? Dla mnie to jedyne logiczne rozwiązanie, komputer to nie człowiek, trzeba po prostu nadać punkty i zliczyć je aby dowiedzieć się, które ze słów kluczowych jest najlepiej punktowane do textu.
Przejrzałem funkcje mysql dotyczące stringów i nie znalazłem nic sensownego co by mogło nam pomoc wiec... zostają wiec funkcje php lub wyrażenia regularne smile.gif

Ostatnio thek z tego forum w innym poście podsuną funkcję, która fajnie się do tego nadaje: http://pl.php.net/str_word_count lub jeśli nie chce ci się bawić i wystarczy ci w miarę proste rozwiązanie to szybko i sprawnie będzie to załatwić tym: http://pl.php.net/manual/en/function.substr-count.php

Czyli tak:
Pobierasz z bazy wszystkie podkategorie z tej wskazanej przez użytkownika, pobierasz keywordsy i parsujesz explode(',', $keywords); i potem oczywiście pętelka dla każdej z podkategorii i używasz swojego algorytmu opartego, na którejś z funkcji podanych wyżej (do pierwszej musisz napisać sobie obsługę z użyciem in_array(); druga zwróci ci gotowy wynik ale nie odzwierciedla rzeczywistości, która w tym wypadku w cale moim zdaniem nie jest taka ważna.
Potem już wiadomo - wyłaniamy zwycięzcę i skrypt skończony biggrin.gif
Sorki że nie mogłem wcześniej odpisać ale nie miałem jak smile.gif
nimda
dzięki wielkie, póki co rozważałem teoretyczne podstawy projektu, jak się wezme do pisania na pewno pojawi sie więcej problemów, temat otwarty nadal, wszystkie pomysły mile widziane, cudny dostajesz punkcik i licze na wsparcie w razie kłopotów ; )

Witam ponownie, tak jak pisałem wcześniej pojawiły się problemy. Metoda zliczania słów kluczowych nie zawsze działa tak jak powinna. Skrypt działa w ten sposób, zlicza wystąpienie słów kluczowych, ale potrzebny tez jest jakis warunek po którego przejściu przypiszemy tag do wpisu. I tu pojawia mi się problem, bo nie wiem jak taki warunek skonstruować. 10% wszystkich słów to słowa kluczowe? działa dla krótkich tekstów.. po zmniejszeniu warunku do np 5% dla długich tekstów tez to nie działa jak powinno. Poza tym słowo kluczowe np. 'Mama' moze pojawić się raz czy dwa razy w tekscie, a dalej mozemy się odnosić przez słowa typu 'ona, jej' itd. I tak na prawdę nie widze żadnej uniwersalnej metody dla rozwiązania tego problemu.. szukam juz drugi dzien i nic ciekawego nie mogę znaleźć a projekt moze otrzeć sie o pracę dyplomową.. Jeżeli ktoś orientuje się w temacie, zna się na lingwistyce komputerowej, to prosiłbym o jakies podpowiedzi. Dzięki za pomoc, pozdrawiam
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.