2008-09-23 16 views
19

To jest prawdziwy problem, który dotyczy ogólnie znaczników (i tak, dotyczy to również StackOverflow, i nie, to nie jest pytanie o StackOverflow).Hierarchie znaczników i obsługa

Cały problem z tagowaniem pomaga w grupowaniu podobnych przedmiotów, niezależnie od ich pozycji (dowcipy, posty na blogu, więc pytania itp.). Jednak istnieje (zazwyczaj, ale nie ściśle) hierarchia znaczników, co oznacza, że ​​niektóre znaczniki też oznaczają inne znaczniki. Aby użyć znanego przykładu, znacznik "C#" oznacza również ".net"; inny przykład, w bazie żartów, znacznik "blondynki" oznacza "szyderczy" znacznik, podobnie jak "irlandzki" lub "belge" lub "kanadyjski" itp. w zależności od kraju pochodzenia żartu.

Jak sobie z tym poradziłeś, jeśli masz, w swoich projektach? Przekażę odpowiedź opisującą dwie różne metody, z których korzystałem w dwóch oddzielnych przypadkach (właściwie ten sam mechanizm, ale wdrożony w dwóch różnych środowiskach), ale interesują mnie nie tylko podobne mechanizmy, ale także twoja opinia na temat hierarchii .

Odpowiedz

1

Mechanizm, który zaimplementowałem, polegał na tym, aby nie używać samych znaczników, ale pośredniej tablicy odnośników (nie ściśle określonych terminów DBMS), która łączy znacznik z wieloma domniemanymi znacznikami (oczywiście, tag jest powiązany z samym sobą, aby to działało).

W projekcie Pythona tabela wyszukiwania jest słownikiem wpisanym w znaczniki, z wartościami zestawów znaczników (gdzie znaczniki są zwykłymi ciągami znaków).

W projekcie bazy danych (obojętny, który zarządzania bazą danych silnik to), były następujące tabele:

[Tags] 
tagID integer primary key 
tagName text 

[TagRelations] 
tagID integer # first part of two-field key 
tagID_parent integer # second part of key 
trlValue float 

gdzie trlValue jest wartością w (0, 1], przestrzeń stosowany do uzyskania wagi dla każdego połączonego tagu, relacja self-to-self zawsze nosi wartość 1,0 w trlValue, podczas gdy reszta jest obliczana algorytmicznie (nie ma znaczenia jak dokładnie). Pomyśl o przykładowej bazie żartów, którą dałem: a ['blonde', ' derisive ", 0,5] rekord byłby skorelowany z ['pondian', 'drisive', 0.5], a więc sugerować wszystkie drwiące żarty pod innym

6

To jest trudne zadanie n. Te dwie skrajności to ontologia (wszystko jest hierarchiczne) i folksonomia (tagi nie mają hierarchii). Mam answered this on WikiAnswers, z odniesieniem do artykułu "Ontologia jest przereklamowana" Claya Shirky'ego, który twierdzi, że nie powinieneś ustawiać żadnej hierarchii.

+0

Clay Shirky była bardzo interesująca. Oczywiście współczynnik bliskości (w przykładzie bazy danych) został wprowadzony w celu złagodzenia warunków powiązanych (w przykładowym artykule "gej" i "queer"). – tzot

+2

Z jakiegoś powodu nie mogłem znaleźć linku do artykułu Claya Shirky'ego na stronie WikiAnswers. Oto ona: http://www.shirky.com/writings/ontology_overrated.html. Też to lubiłem. –

4

Właściwie powiedziałbym, że nie jest to system hierarchiczny, ale sieć semantyczna z odczuwanymi dystansami między znacznikami. Co mam na myśli: matematyka jest bliższa fizyce eksperymentalnej niż ogrodnictwu.

Możliwość zbudowania takiej sieci: Zbuduj pary znaczników i pozwól osądzić postrzeganą odległość (przy użyciu miary takiej jak 1-10, oznaczającej coś w stylu [synonimy, podobne, ..., antonimy], ...) a podczas wyszukiwania szukaj wszystkich tagów w pewnej odległości.

Czy środek musi być jednakowej odległości, jeśli pochodzi z przeciwnego kierunku ([a, b] zamknij -> [b, a,] zamknij)? Czy bliskość implikuje [a, b] zamknięcie i [b, c] zamknięcie -> [a, b] zamknięcie?

Być może pierwsze słowo wywoła domyślnie inne pole semantyczne? Jeśli zaczynasz od "pracownika socjalnego", "analityk" jest bliski. Jeśli zaczniesz od "programisty", również "analityk" jest blisko. Ale zaczynając od któregoś z tych punktów, prawdopodobnie nie będziesz liczyć drugiego jako bliskiego ("sozial worker" nie jest bynajmniej blisko "programisty").

W związku z tym, będziesz mieć tylko pary osądzone i ocenione w obu kierunkach (w kolejności losowej).

[TagRelations] 
tagId integer 
closeTagId integer 
proximity integer 

Przykład wyboru podobnych znaczników article

select closeTagId from TagRelations where tagId = :tagID and proximity < 3 
+0

Odległość jest jednokierunkowa; gdyby było dwukierunkowe, wstawiono inny rekord z inną odległością. – tzot

+0

@malach: Jako problem z UX, jeśli chodzi o użycie hierarchii, powiedziałbym, że (i) oprogramowanie powinno wykorzystywać metodę sieci semantycznej opisaną przez ciebie w oparciu o matematykę, ale (ii) użytkowników, którzy chcą robić "ogrodnictwo" na swoim zbiory znaczników osobistych powinny być * dozwolone na *, ale nie * zmuszane do * układania znaczników w hierarchie, ponieważ * niektórzy * użytkownicy będą czuli się bardziej komfortowo niż listy płaskie. W systemach oprogramowania, w których "personalizacja" tagów nie wchodzi w rachubę, można zastosować listę płaską, chyba że eksperci domeny postanowili inaczej. – rwong

Powiązane problemy