Ik ben bezig met een database voor oud Hollandsche archieven gebaseerd op Zend met MySQL. Aan een archief stuk kan ik tags hangen zoals personen, materialen, plaatsen, etc.
Nu wil ik graag tags aan elkaar kunnen relateren dus als iemand zoekt op goudsmit dat daar dan ook de gerelateerde tags goudtsmit en goudsmid aan worden gekoppeld. Hoe kan ik dit database technisch goed oplossen? Zelf denk ik aan een tabel die er als volgt uit ziet:
tag_tag id PK tag1 FK (tag.id) tag2 FK (tag.id)
Maar hoe ga ik hier mee om? Wat moet ik doen met mijn query's om deze koppeling ook backwards te laten werken, zonder dat ik alle mogelijkheden met relaties in de database moet zetten? De relatie wordt handmatig aangemaakt in eerste instantie.
Ik heb hier totaal nog geen kaas van gegeten. Wie kan me hier mee helpen?
Kijk eens naar [php]similar_text[/php]
Die is daarvoor gemaakt. Eventueel is [php]soundex[/php] ook gebruikbaar, maar wel minder.
Zodra iemand zoekt op 'goudsmid' kan je kijken welke tags daar veel op lijken (met similar_text dus). En die voeg je dan ook toe als 'tag'.
Maar ga jij een archief (ik neem aan, getranscribeerd) ook taggen als 'goudtsmid'? Of houd je het bij correcte spelling?
Mij lijkt het logisch als het alleen tagt als 'goudsmid'. En dan vervalt 'goudtsmit', want dat is niet correct. Ook niet als dat wel in de tekst staat.
Zeker als je handmatig tagt, is dat geen probleem. 't Wordt pas leuk als je automatisch de tekst moet laten taggen (dmv woordenlijsten)
[size=xsmall]Toevoeging op 24/08/2012 09:18:37:[/size]
Of een leuke: [php]metaphone[/php], maar dan voor (oud-)Nederlands maken.
Dat zal werken als een olifant, en nog leuk ook!
Immers is een woord als 'werdt' en 'werd' gewoon hetzelfde. En 'mens' en 'mensch' ook....
Het voorbeeld dat ik gaf lijkt misschien een beetje te veel op elkaar. Het kan ook zijn dat iemand gewoon totaal anders genoemd wordt. Schilder of kunstenaar; die ga je er met similar_text niet uithalen.
Daarnaast is de similar_tekst een php oplossing (moet ik alle tags vergelijken in een loop bij elke weergave?), kan dat niet door SQL afgehandeld worden?
Je zou met PHP vooraf links kunnen maken tussen alle tags inderdaad. Om dat on-the-fly te doen: euh... nee.
Schilder/kunstenaar zijn inderdaad synoniemen (daar zijn ook wel lijsten voor.... toch?). Die zou je ook moeten linken.
Om een volledige database van dit te krijgen is wel heel wat werk (en records) nodig. Wel een leuk project...
Oke, dat zijn wel handige tips voor het genereren van de links tussen de tags die van elkaar verschillen. Handmatige optie lijkt me ook nog wel te doen maar de database breid uit en zal straks niet geheel overzichtelijk meer zijn. Dan is automatiseren wel lekker. Combinatie met similar_tekst, synomiemen via mijnwoordenboek.nl etc is dan een leuke om hem te vullen.
Maar hoe sla ik dat dan op om niet continu alle controles te doen, en belangrijker nog: hoe haal ik het er efficiënt uit? Wat voor query's krijg ik als ik een structuur aanhoud zoals in mijn eerste post?
De norm is het basiswoord. Zoals "goudsmid".
Synoniemen (naja... bijna) zijn woorden die bij de norm horen. Zoals "goudtsmit", "goudsmit", "edelsmidt" etc.
Je tagt je archief alleen met de norm-tags (in je taglijst een boolean of de tag een norm is of niet).
En bij zoeken (want daar komt "goudsmidt" voor) kijk je of dat woord een norm-tag is. Zo niet: wat is dan de normtag van dat woord? En dan zoek je op die norm-tag.
Wordt wel 1 of 2 queries meer, maar dat is echt geen probleem.
[size=xsmall]Toevoeging op 24/08/2012 10:42:38:[/size]
O... je kan natuurlijk ook bij een zoekwoord norm-tags en synoniem-tags vinden met similair_text... Gewoon alle tags even met 1 query in een array gooien. Wellicht niet heel efficient, maar hoe je zoiets doet met SQL weet ik niet. Zal eens zoeken.
[size=xsmall]Toevoeging op 24/08/2012 10:45:57:[/size]
Het liefst maak ik geen onderscheid tussen basis tags - hoe weet je wanneer iemand waar op zoekt?
Kan je dan niet beter groepen maken? Dus zoiets:
group
id - PK
tag_group
id - PK
tag - FK
En uiteindelijk de opties weergeven van alles wat in die groep staat als gerelateerd. Iets eenvoudiger te overzien en te beheren volgens mij, of mis ik nu iets?
Ja, komt eigenlijk wel overeen met die groepen.
En hoe 'benoem' je een groep? Met een woord... het normwoord. Komt op hetzelfde neer eigenlijk, alleen heb jij een tabel extra. Kan ook sneller/efficienter zijn hoor!
Hoe je weet waar iemand op zoekt.... euh... $_POST['zoekopdracht'] uitlezen?
Wat voor archieven heb je? Wat voor tags ga je maken?
Archief "Weeskamers Dordt 1823" zal tag Dordrecht, 1823, 19e eeuw, kinderen, ouders, wezen, weeskinderen (maar dat is gelijk aan wezen), armen, moeder etc krijgen. Maar ook de naam van het huis/pand, de directeur, jaartallen etc.
De tags wijs ik alleen toe naar delen die uit de tekst komen. Zie ook onderstaande ERD
Mijn bedoeling is om de zoekopdracht uit te lezen, en dan te kijken in welke groep die voorkomt (waarna ik alle tags in die groep weergeef). Group hoeft dus alleen maar een id te hebben als wijze van bundel identificatie. De relatie met de zoekterm wordt gezocht in de tabel tag_group. Hopelijk snap je wat ik bedoel.