Skip to content

PiStefania/syspro-search-engine

Repository files navigation

Ονοματεπώνυμο: Στεφανία Πάτσου
Α.Μ.: 1115201400156

Μεταγλώττιση Προγράμματος: make

Εκτέλεση Προγράμματος: ./minisearch -i 'file' -k 'K' ή ./minisearch -k 'K' -i 'file' ή ./minisearch -i 'file'

Δοκιμή Προγράμματος:
-Το πρόγραμμα εκτελείται επιτυχώς για τα αρχεία: dfSmall.txt, tfSmall.txt, searchSmall.txt, dfBig.txt, tfBig.txt, searchBig.txt.
-Η εκτέλεση των search queries έχει κάποια απόκλιση τιμών για κάποια documents λόγω του τύπου του score.
-Στο παραδοτέο υπάρχει και ένα μικρό αρχείο dataset 'in_file' το οποίο και χρησιμοποίησα για την δοκιμή του προγράμματος προτού εκτελέσω τα προαναφερθέντα.
-Για την σύγκριση των αρχείων df, tf, αρχικά τα ταξινόμησα με την εντολή : sort -k 1,1 'file' > 'new file', και έπειτα τα σύγκρινα.

Δομές:
-generalnfo.h: Γενική δομή που χρησιμοποιείται για τον υπολογισμό του score κάθε λέξης στο /search. Περιέχει το σύνολο όλων των λέξεων, το σύνολο όλων τον κειμένων, k1, b.
-index.h: Περιέχει την δομή map index η οποία περιέχει πόσες λέξεις έχει ένα document και το ίδιο το document. 
-invertedIndex.h: Περιέχει 4 δομές. Την ρίζα του trie απ'όπου και ξεκινά το populate αλλά και το query. Τον κάθε κόμβο ενός trie (trieNode) το οποίο περιέχει τον χαρακτήρα, τον επόμενο κόμβο στο ίδιο επίπεδο, έναν δείκτη για την κεφαλή του επόμενου επιπέδου, την ουρά posting Lists, το μέγεθος της συγκεκριμένης ουράς και το αν είναι πρώτος χαρακτήρας της λέξης. Την ουρά κάθε επιπέδου η οποία έχει ένα αρχικό κόμβο και έναν δείκτη στο τελικό και τον κόμβο ενός postingLists ο οποίος περιέχει το id του document, το term  frequency και τον επόμενο κόμβο.
-dfQuery.h: Περιέχει τον κόμβο του stack και την δομή stack. Ο κάθε κόμβος περιέχει αν έχει πολλές εναλλακτικές(πολλές λέξεις),τον χαρακτήρα και το αν είναι τελευταίος χαρακτήρας λέξης.
-searchQuery.h: Περιέχει έναν πίνακα από scoreNode, δηλαδή κόμβους που περιέχουν τις λέξεις που πρέπει να μαρκάρουμε, το document id και το score.

Αλγόριθμοι:
-tfQuery: Η αναζήτηση γίνεται γραμμικά για κάθε κόμβο της λίστας κάθε επιπέδου. Όταν βρούμε τον κόμβο με την postingLists λίστα, την ψάχνουμε και αυτή γραμμικά μέχρι να βρούμε το document id που επιθυμούμε.
-dfQuery: Κάνω αναζήτηση DFS και εισάγω το κάθε γράμμα σε μία στοίβα. Όταν φτάσω στο τελευταίο γράμμα, εκτυπώνω το κάθε γράμμα κάνοντας pop από την στοίβα μόνο αν δεν έχει άλλες εναλλακτικές ή αν αποτελεί ενδιάμεσο γράμμα της λέξης. 
-searchQuery: Δημιουργώ έναν πίνακα από scoreNodes τα οποία τα εισάγω στον πίνακα χρησιμοποιώντας binary insertion sort με βάση τα document ids. Την συγκεκριμένη την χρησιμοποίησα διότι η εύρεση συγκεκριμένου κόμβου με την binary search έχει πολυπλοκότητα Ο(logn) και η εισαγωγή έχει πολυπλοκότητα 0(1). Έπειτα χρησιμοποιώ heapSort για να ταξινομήσω τον πίνακα με βάση τα scores με πολυπλοκότητα Ο(nlogn).

Σημειώσεις:
-Για την εισαγωγή των δεδομένων στις δομές, πρώτα δημιούργησα το map index και έπειτα μέσω αυτού δημιούργησα το trie(invertedIndex).
-Για τον υπολογισμό του score για κάθε document, χρησιμοποίησα log10().
-Ως term frequency χρησιμοποίησα το πόσες φορές υπάρχει μία συγκεκριμένη λέξη μέσα στο συγκεκριμένο κείμενο.
-Αν δοθεί εντολή /search με παραπάνω από μία ίδιες λέξεις, υπολογίζεται ξανά το score, το πρόγραμμα συμπεριφέρεται σαν η λέξη να είναι μοναδική.
-Ένα document στο map index μπορεί να είναι NULL, απλά δεν λαμβάνεται υπόψη για τις υπόλοιπες λειτουργίες του προγράμματος.
-Το πρόγραμμα δουλεύει για πολλές λέξεις στο query /df.
-Το πρόγραμμα δεν δουλεύει για πολλές λέξεις στο query /tf.
-Το πρόγραμμα δουλεύει είτε για '/query' είτε για '\query'.
-Το πρόγραμμα δεν ταξινομεί το output του query /df.

About

Project 1 of Syspro Spring Semester 2018

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published