Context
Ik ben samen met een medestudent bezig met een afstudeerproject. Het afstudeerproject is het maken van een kennisbank voor artikelen, personen, bedrijven, commentaren, een FAQ etc. We hebben een vrij solide database ontwerp gemaakt, een strikt gescheiden MVC ontwerp voor de backend en interface.
Een van de onderdelen van de kennisbank is de zoekmachine. De zoekmachine moet van een gegeven term relevante resultaten in alle objecten in de database kunnen geven (een persoon, een bedrijf of een artikel bv). Een artikel heeft bijvoorbeeld een body en/of een attachment. De zoekmachine zoekt ook in attachments (HTML-, Word-, PDF bestanden etc).
Ontwerp
Het ontwerp van de database is zo generiek mogelijk gemaakt, zodat het eenvoudig toegepast kan worden als kennisbank van diverse onderwerpen. In grote lijnen is een gedeelte van de database als volgt:
OBJECT
objectid
creationdate
modifydate
ARTICLE
objectid --> OBject.objectid
Title
Abstract
Body
PERSON
Objectid --> Object.objectid
Name
Address
Telephone
ATTACHMENT
Objectid --> Object.objectid
FileType
FileName
Path
OBJECT_ATTACHMENT #Link tabel om artikelen en attachments te linken
Objectid1
Objectid2
INTERN_LINK #Link tabel om artikelen te linken
Objectid1
Objectid2
Zoekmachine
Ik heb mijn zoekmachine als volgt opgebouwd. Er is een lijst met tabelnamen, hiervan vraag ik alle velden op:
1) Ik lex alle termen die in de velden voorkomen
2) Van elke term bepaal ik de Term Frequency
3) Ik zet de term, met de Term Frequency in een 'indextabel'
4) Nu heb ik alle termen uit alle objecten uit de database. Nu loop ik de indextabel af
5) Voor elke term bepaal ik nu de Term Frequency - Inverse Document Frequency
6) Ik bepaal daarna voor elke term het gewicht (komt het in een titel voor weeg het zwaarder dan in een body bv)
7) Ik neem het product van het gewicht en de TFIDF ( = totaalgewicht)
Ik verwijder alle termen met een lager totaalgewicht dan een bepaalde drempel
9) Ik heb nu een index van alle termen die in de database voorkomen, met het gewicht van die term en bij welk object het hoort
Bij een zoekopdracht kan ik nu eenvoudig een select statement uitvoeren als
Dit werkt op zich correct. Ik krijg redelijk relevante zoekresultaten terug.
Vragen
Deze werkwijze heb ik bedacht door wat manieren te combineren, namelijk TFIDF en Termgewicht. Ik wil dit nog combineren met Pagerank
Welke manieren hebben jullie toegepast om relevante zoekresultaten te vinden? Ik kan me bijvoorbeeld indenken dat je de spreiding van een term over een document bepaald, en deze ook meeweegt. Als ik Google mag geloven zijn er tientallen, zoniet honderden algorithmes die meetellen... Ik heb moeite een goed document te vinden over het bouwen van een goede zoekmachine.
Wat vinden jullie van de hierboven beschreven manier?
Wat voor tips hebben jullie nog meer over het bouwen van een index van een zoekmachine?
Hoe ga je normaliter om met meerdere zoektermen? Ik kan bijvoorbeeld (bij 2 zoektermen) apart zoeken naar beide termen, en een intersectie van de resultaten als resultaat teruggeven. Maar dit kan weer niet als men de beide termen bij elkaar wil zoeken (zoals Google bv). Dan zou ik de hele context van een term moeten cachen.
Alle tips over zoekmachinebouw zijn welkom
Ik ben samen met een medestudent bezig met een afstudeerproject. Het afstudeerproject is het maken van een kennisbank voor artikelen, personen, bedrijven, commentaren, een FAQ etc. We hebben een vrij solide database ontwerp gemaakt, een strikt gescheiden MVC ontwerp voor de backend en interface.
Een van de onderdelen van de kennisbank is de zoekmachine. De zoekmachine moet van een gegeven term relevante resultaten in alle objecten in de database kunnen geven (een persoon, een bedrijf of een artikel bv). Een artikel heeft bijvoorbeeld een body en/of een attachment. De zoekmachine zoekt ook in attachments (HTML-, Word-, PDF bestanden etc).
Ontwerp
Het ontwerp van de database is zo generiek mogelijk gemaakt, zodat het eenvoudig toegepast kan worden als kennisbank van diverse onderwerpen. In grote lijnen is een gedeelte van de database als volgt:
OBJECT
objectid
creationdate
modifydate
ARTICLE
objectid --> OBject.objectid
Title
Abstract
Body
PERSON
Objectid --> Object.objectid
Name
Address
Telephone
ATTACHMENT
Objectid --> Object.objectid
FileType
FileName
Path
OBJECT_ATTACHMENT #Link tabel om artikelen en attachments te linken
Objectid1
Objectid2
INTERN_LINK #Link tabel om artikelen te linken
Objectid1
Objectid2
Zoekmachine
Ik heb mijn zoekmachine als volgt opgebouwd. Er is een lijst met tabelnamen, hiervan vraag ik alle velden op:
1) Ik lex alle termen die in de velden voorkomen
2) Van elke term bepaal ik de Term Frequency
3) Ik zet de term, met de Term Frequency in een 'indextabel'
4) Nu heb ik alle termen uit alle objecten uit de database. Nu loop ik de indextabel af
5) Voor elke term bepaal ik nu de Term Frequency - Inverse Document Frequency
6) Ik bepaal daarna voor elke term het gewicht (komt het in een titel voor weeg het zwaarder dan in een body bv)
7) Ik neem het product van het gewicht en de TFIDF ( = totaalgewicht)
9) Ik heb nu een index van alle termen die in de database voorkomen, met het gewicht van die term en bij welk object het hoort
Bij een zoekopdracht kan ik nu eenvoudig een select statement uitvoeren als
code:
1
| 'SELECT ObjectId FROM INDEXDATA WHERE Term LIKE '%<zoekterm%' ORDER BY Totaalgewicht'' |
Dit werkt op zich correct. Ik krijg redelijk relevante zoekresultaten terug.
Vragen
Deze werkwijze heb ik bedacht door wat manieren te combineren, namelijk TFIDF en Termgewicht. Ik wil dit nog combineren met Pagerank
Welke manieren hebben jullie toegepast om relevante zoekresultaten te vinden? Ik kan me bijvoorbeeld indenken dat je de spreiding van een term over een document bepaald, en deze ook meeweegt. Als ik Google mag geloven zijn er tientallen, zoniet honderden algorithmes die meetellen... Ik heb moeite een goed document te vinden over het bouwen van een goede zoekmachine.
Wat vinden jullie van de hierboven beschreven manier?
Wat voor tips hebben jullie nog meer over het bouwen van een index van een zoekmachine?
Hoe ga je normaliter om met meerdere zoektermen? Ik kan bijvoorbeeld (bij 2 zoektermen) apart zoeken naar beide termen, en een intersectie van de resultaten als resultaat teruggeven. Maar dit kan weer niet als men de beide termen bij elkaar wil zoeken (zoals Google bv). Dan zou ik de hele context van een term moeten cachen.
Alle tips over zoekmachinebouw zijn welkom