Moderators Spect~ Δημοσ. 28 Μαΐου 2012 Moderators Δημοσ. 28 Μαΐου 2012 Χαιρετω για ακομη μια φορα με μια νεα απορια. μια φιλη μου φτιαχνει ενα εορτολογιο για android για την πτυχιακη της και την βοηθαω οταν χρειαζεται. Την διαδικασια της αναζητησης μεσα στο χμλ κτλ το εχει κανει δουλευουν ολα οκ. αυτο που ηθελα να ρωτησω ειναι πως θα γινει η αναζητηση να μην κοιταει τονους? δηλαδη πχ σημερα γιορταζει ο Δημήτρης. Αν καποιος κανει αναζητηση με το ονομα Δημητρης(χωρις τόνο) δεν θα επιστρεψει την γιορτη. Αυτο υπαρχει καποιος τροπος να το διορθωσουμε χωρις την προσθηκη του ονοματος στο χμλ?(δηλαδη χωρις να εχω στο χμλ και το Δημήτρης και το Δημητρης)
NikosKallithea Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 θα κανει αναζητηση με ολους τους τρόπους "Δημητρης" "Δημήτρης" "Διμητρης" κλπ
nilosgr Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Δεν ξέρω με ποιον τρόπο κάνει την αναζήτηση στο XML, αλλά μπορεί είτε να χρησιμοποιήσει regular expression είτε να αποθηκεύσει όλα το ονόματα στο XML χωρίς να χρησιμοποιεί τόνους και όταν ο χρήστης κάνει αναζήτηση να αντικαθιστά τα γράμματα που έχουν τόνο με τα αντίστοιχα που δεν έχουν και μετά να κάνει αναζήτηση. Δηλαδή αν ο χρήστης γράψει "Γιώργος" το πρόγραμμα να κάνει αναζήτηση για "Γιωργος"
nspyrou Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Ένας τρόπος για τέτοιου είδους normalization που χρησιμοποιούσαμε ως μέθοδο ομαλοποίησης σε διαχείριση δεδομένων, ήταν η αντικατάσταση όλων των φωνηέντων με κενά. Αυτό επέτρεπε την απαλοιφή των τονούμενων καθώς και των λανθασμένων ονομάτων μέσα σε μια συγκεκριμένη λίστα αναζήτησης.. Στη προκειμένη περίπτωση το ΔΗΜΗΤΡΗΣ ή ΔΙΜΗΤΡΙΣ ή ΔΙΜΙΤΡΙΣ ή ΔΙΜΙΤΡΗΣ κλπ θα γινόταν ΔΜΤΡΣ ή δμτρσ ή δμτρς. Οπότε η αναζήτησή σου γίνεται πολύ πιο εύκολη και κάνοντας απλώς UpperCase το λεκτικό αναζήτησης και το source σου. > private String Normalize( String strSource ) { return strSource.toLowerCase().Replace("α", "").Replace("ά", "").Replace("ε", ""). Replace("έ","").Replace("ι","").Replace("ί","").Replace("η",""). Replace("ή","").Replace("υ","").Replace("ύ","").Replace("ο",""). Replace("ό","").Replace("ω","").Replace("ώ","").toUpperCase(); } Αυτό θα σου δώσει ΔΜΤΡΣ είτε γράψεις ΔΗΜΗΤΡΙΟΣ είτε ΔΗΜΗΤΡΗΣ κλπ ... Άρα μπορείς να ψάξεις: > if ( Normalize(sourceStr).Contains( Normalize(targetSearchStr) ) ) { // Εχεις αποτέλεσμα ... } else { // Δεν έχεις αποτέλεσμα ... } Παρόμοια κατάσταση γίνεται βάσει αυτού του αλγόριθμου Double Metaphone, που πραγματικά με βοήθησε να στήσω μια πιο γενική μορφή αναζήτησης σε λανθασμένες και ανορθόγραφες λίστες ονομάτων.
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Ένας τρόπος παραπλήσιος με αυτόν που περιέγραψε ο φίλος nspyroy είναι να φτιάξετε μια custom ρουτίνα toUpper() η οποία θα κεφαλαιοποιεί κανονικά τα σύμφωνα αλλά τα φωνήεντα θα τα κεφαλαιοποιεί άτονα. Παράλληλα θα μετατρέπει τα τονισμένα κεφαλαία σε άτονα κεφαλαία. Επειδή αν τη γράψω σε Java σίγουρα θα την κάνω λάθος, παραθέτω μια τέτοια ρουτίνα σε C θεωρώντας πως είναι εύκολο να μετατραπεί σε Java από κάποιον που ασχολείται ενεργά με τη γλώσσα... > /*********************************************************//** * ************************************************************* */ int toUpper( int c ) { int ret = 0; char *cp = NULL; char abLower[] = "αάβγδεέζηήθιίϊΐκλμνξοόπρσςτυύϋΰφχψωώΆΈΉΊΌΎΏ"; char abUpper[] = "ΑΑΒΓΔΕΕΖΗΗΘΙΙΪΪΚΛΜΝΞΟΟΠΡΣΣΤΥΥΫΫΦΧΨΩΩΑΕΗΙΟΥΩ"; if ( strchr(abUpper, c) ) ret = c; else if ( NULL != (cp = strchr(abLower, c)) ) ret = (int) abUpper[ cp - abLower ]; else ret = toupper(c); return ret; } /*********************************************************//** * ************************************************************* */ char *s_toUpper( char *s ) { char *ret = NULL; /* sanity checks */ if ( !s ) return NULL; if ( !*s ) return s; for ( ret=s; (*s=toUpper(*s)); s++ ) ; return ret; } EDIT: Ξαναβλέπω την toUpper() και διαπιστώνω πως το 1ο if είναι αχρείαστο (και βαρύ) overhead. Μάλλον πρέπει να αλλάξει ως εξής ο κώδικας της... > int toUpper( int c ) { int ret = 0; char *cp = NULL; char abLower[] = "αάβγδεέζηήθιίϊΐκλμνξοόπρσςτυύϋΰφχψωώΆΈΉΊΌΎΏ"; char abUpper[] = "ΑΑΒΓΔΕΕΖΗΗΘΙΙΪΪΚΛΜΝΞΟΟΠΡΣΣΤΥΥΫΫΦΧΨΩΩΑΕΗΙΟΥΩ"; if ( NULL != (cp = strchr(abLower, c)) ) ret = (int) abUpper[ cp - abLower ]; else ret = toupper(c); return ret; } Αφήνω και τις 2 εκδόσεις, γιατί δεν είμαι σίγουρος αν δουλεύει απροβλημάτιστα η 2η (και για να είμαι ειλικρινής βαριέμαι τώρα να τη δοκιμάσω με ανομοιογενή test-cases... λογικά πρέπει να είναι οκ όμως).
Moderators Spect~ Δημοσ. 28 Μαΐου 2012 Μέλος Moderators Δημοσ. 28 Μαΐου 2012 σας ευχαριστω για τις απαντησεις. μαλλον θα κοιταξω τον τροπο του nspyrou γιατι νομιζω οτι καλυπτει μεγαλυτερο ευρος ονοματων. θα το δοκιμασω και αν εχω καμια αλλη ερωτηση θα επανελθω
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 σας ευχαριστω για τις απαντησεις. μαλλον θα κοιταξω τον τροπο του nspyrou γιατι νομιζω οτι καλυπτει μεγαλυτερο ευρος ονοματων. θα το δοκιμασω και αν εχω καμια αλλη ερωτηση θα επανελθω Έχει ένα μικρό μειονέκτημα ο τρόπος του nspyroy, το οποίο όμως είναι αμελητέο αν δεν πρόκειται να χρησιμοποιήσετε πτώσεις ονομάτων. Δηλαδή, το "Δημήτρη" και το "Δήμητρα" βγάζουν ακριβώς ίδιο normalized αποτέλεσμα. EDIT: Χμ... δεν είναι μόνο οι πτώσεις. Τα "Χάρης" (άντρας) και "Χάρις" (γυναίκα) βγάζουν επίσης ίδιο normalized αποτέλεσμα.
Directx Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Για την ιστορία που λέμε.. Για το τμήμα αναζήτησης ενός ανάλογου προγράμματος αλλά για απλά κινητά τηλέφωνα (J2ME) όπου μεταξύ άλλων ήθελα να λάβω υπόψη μου στην αναζήτηση διάφορα υποκοριστικά (πολλές φορές εντελώς μακριά από την κανονική ονομασία) κατέληξα στην χρήση HASH που οδηγούσε πάντα στο ανάλογο κανονικό όνομα - η αιτία της επιλογής αυτής της υλοποίησης ήταν πως αν και παραδοσιακά τα απλά κινητά παρέχουν σχετικά "ικανές" CPU δεν παρείχαν εξίσου αρκετή μνήμη (αποθήκευσης) ώστε να έχω όλη την ΒΔ άνετα καταχωρημένη οπότε το HASH φάνηκε το καλύτερο trade-off μεταξύ χώρου & ταχύτητας για αυτές τις μικρο-συσκευές. Τώρα σε Android τα πράματα είναι σαφέστατα διαφορετικά (έχουμε και μνήμη + ταχύτητα και την εξαιρετική.. SQLite!!)
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Για την ιστορία που λέμε.. Για το τμήμα αναζήτησης ενός ανάλογου προγράμματος αλλά για απλά κινητά τηλέφωνα (J2ME) όπου μεταξύ άλλων ήθελα να λάβω υπόψη μου στην αναζήτηση διάφορα υποκοριστικά (πολλές φορές εντελώς μακριά από την κανονική ονομασία) κατέληξα στην χρήση HASH που οδηγούσε πάντα στο ανάλογο κανονικό όνομα - η αιτία της επιλογής αυτής της υλοποίησης ήταν πως αν και παραδοσιακά τα απλά κινητά παρέχουν σχετικά "ικανές" CPU δεν παρείχαν εξίσου αρκετή μνήμη (αποθήκευσης) ώστε να έχω όλη την ΒΔ άνετα καταχωρημένη οπότε το HASH φάνηκε το καλύτερο trade-off μεταξύ χώρου & ταχύτητας για αυτές τις μικρο-συσκευές. Τώρα σε Android τα πράματα είναι σαφέστατα διαφορετικά (έχουμε και μνήμη + ταχύτητα και την εξαιρετική.. SQLite!!) Με τι hash function γινόταν το hashing? Δεν μου έρχεται τώρα στο μυαλό πως μπορούν να γίνουν hashed ποικίλα υποκοριστικά στο κανονικό όνομα, εκτός αν μιλάμε για hardcoded πέρασμά τους στον κώδικα και την db. Υπάρχει τέτοιο (χρησιμότατο) hash function?
Moderators Spect~ Δημοσ. 28 Μαΐου 2012 Μέλος Moderators Δημοσ. 28 Μαΐου 2012 Έχει ένα μικρό μειονέκτημα ο τρόπος του nspyroy, το οποίο όμως είναι αμελητέο αν δεν πρόκειται να χρησιμοποιήσετε πτώσεις ονομάτων. Δηλαδή, το "Δημήτρη" και το "Δήμητρα" βγάζουν ακριβώς ίδιο normalized αποτέλεσμα. EDIT: Χμ... δεν είναι μόνο οι πτώσεις. Τα "Χάρης" (άντρας) και "Χάρις" (γυναίκα) βγάζουν επίσης ίδιο normalized αποτέλεσμα. δεν βλεπω που ειναι το προβλημα πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος?
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 δεν βλεπω που ειναι το προβλημα πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος? Yeap! Για αυτό έγραψα πως είναι αμελητέο αν δεν σκοπεύετε να χρησιμοποιήσετε πτώσεις. Από την άλλη μεριά, το "Χάρης" μπορεί να προέρχεται από το "Χαράλαμπος" ή από το "Χαρίλαος" ενώ η "Χάρις" να προέρχεται από το "Χαρίκλεια" ή από το "Έυχαρις" (μη γελάς σε βλέπω ... btw έχω γνωστή που ονομάζεται Εύχαρις"). Σε γενικές γραμμές υπάρχουν διάφορες δυσκολίες στην ονοματολογία. Βέβαια τα πάντα εξαρτώνται από το πόσο σφαιρικό επιθυμείτε να κάνετε το εορτολόγιο.
nspyrou Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 δεν βλεπω που ειναι το προβλημα πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος? Είναι το ίδιο με τη Μαρία που γιορτάζει 15 Αυγούστου και τη Μαρία που γιορτάζει 21 Νοεμβρίου,,, έχεις τρόπο να τις διαχωρίσεις???
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Είναι το ίδιο με τη Μαρία που γιορτάζει 15 Αυγούστου και τη Μαρία που γιορτάζει 21 Νοεμβρίου,,, έχεις τρόπο να τις διαχωρίσεις??? Δεν είναι το ίδιο, γιατί για παράδειγμα ο Χάρης δεν πρέπει είναι listed στον κατάλογο της Χαρίκλειας και της Εύχαρις.
nspyrou Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Ρίξε μια ματιά στον Double Metaphone, θα δείς οτι πολλές από τις απορείες σου, τις ικανοποιεί ...
migf1 Δημοσ. 28 Μαΐου 2012 Δημοσ. 28 Μαΐου 2012 Ρίξε μια ματιά στον Double Metaphone, θα δείς οτι πολλές από τις απορείες σου, τις ικανοποιεί ... Εμένα εννοείς ή τον ~Spect;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα