Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Moderators
Δημοσ.

Χαιρετω για ακομη μια φορα με μια νεα απορια.

μια φιλη μου φτιαχνει ενα εορτολογιο για android για την πτυχιακη της και την βοηθαω οταν χρειαζεται.

Την διαδικασια της αναζητησης μεσα στο χμλ κτλ το εχει κανει δουλευουν ολα οκ.

αυτο που ηθελα να ρωτησω ειναι πως θα γινει η αναζητηση να μην κοιταει τονους?

δηλαδη πχ σημερα γιορταζει ο Δημήτρης. Αν καποιος κανει αναζητηση με το ονομα Δημητρης(χωρις τόνο) δεν θα επιστρεψει

την γιορτη. Αυτο υπαρχει καποιος τροπος να το διορθωσουμε χωρις την προσθηκη του ονοματος στο χμλ?(δηλαδη χωρις να εχω στο χμλ και το Δημήτρης και το Δημητρης)

  • Απαντ. 42
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Δεν ξέρω με ποιον τρόπο κάνει την αναζήτηση στο XML, αλλά μπορεί είτε να χρησιμοποιήσει regular expression είτε να αποθηκεύσει όλα το ονόματα στο XML χωρίς να χρησιμοποιεί τόνους και όταν ο χρήστης κάνει αναζήτηση να αντικαθιστά τα γράμματα που έχουν τόνο με τα αντίστοιχα που δεν έχουν και μετά να κάνει αναζήτηση. Δηλαδή αν ο χρήστης γράψει "Γιώργος" το πρόγραμμα να κάνει αναζήτηση για "Γιωργος"

Δημοσ.

Ένας τρόπος για τέτοιου είδους 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, που πραγματικά με βοήθησε να στήσω μια πιο γενική μορφή αναζήτησης σε λανθασμένες και ανορθόγραφες λίστες ονομάτων.

Δημοσ.

Ένας τρόπος παραπλήσιος με αυτόν που περιέγραψε ο φίλος 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
Δημοσ.

σας ευχαριστω για τις απαντησεις.

μαλλον θα κοιταξω τον τροπο του nspyrou γιατι νομιζω οτι καλυπτει μεγαλυτερο ευρος ονοματων.

θα το δοκιμασω και αν εχω καμια αλλη ερωτηση θα επανελθω

Δημοσ.

σας ευχαριστω για τις απαντησεις.

μαλλον θα κοιταξω τον τροπο του nspyrou γιατι νομιζω οτι καλυπτει μεγαλυτερο ευρος ονοματων.

θα το δοκιμασω και αν εχω καμια αλλη ερωτηση θα επανελθω

Έχει ένα μικρό μειονέκτημα ο τρόπος του nspyroy, το οποίο όμως είναι αμελητέο αν δεν πρόκειται να χρησιμοποιήσετε πτώσεις ονομάτων. Δηλαδή, το "Δημήτρη" και το "Δήμητρα" βγάζουν ακριβώς ίδιο normalized αποτέλεσμα.

 

EDIT:

 

Χμ... δεν είναι μόνο οι πτώσεις. Τα "Χάρης" (άντρας) και "Χάρις" (γυναίκα) βγάζουν επίσης ίδιο normalized αποτέλεσμα.

Δημοσ.

Για την ιστορία που λέμε..

 

Για το τμήμα αναζήτησης ενός ανάλογου προγράμματος αλλά για απλά κινητά τηλέφωνα (J2ME) όπου μεταξύ άλλων ήθελα να λάβω υπόψη μου στην αναζήτηση διάφορα υποκοριστικά (πολλές φορές εντελώς μακριά από την κανονική ονομασία) κατέληξα στην χρήση HASH που οδηγούσε πάντα στο ανάλογο κανονικό όνομα - η αιτία της επιλογής αυτής της υλοποίησης ήταν πως αν και παραδοσιακά τα απλά κινητά παρέχουν σχετικά "ικανές" CPU δεν παρείχαν εξίσου αρκετή μνήμη (αποθήκευσης) ώστε να έχω όλη την ΒΔ άνετα καταχωρημένη οπότε το HASH φάνηκε το καλύτερο trade-off μεταξύ χώρου & ταχύτητας για αυτές τις μικρο-συσκευές.

 

Τώρα σε Android τα πράματα είναι σαφέστατα διαφορετικά (έχουμε και μνήμη + ταχύτητα και την εξαιρετική.. SQLite!!) :D

Δημοσ.

Για την ιστορία που λέμε..

 

Για το τμήμα αναζήτησης ενός ανάλογου προγράμματος αλλά για απλά κινητά τηλέφωνα (J2ME) όπου μεταξύ άλλων ήθελα να λάβω υπόψη μου στην αναζήτηση διάφορα υποκοριστικά (πολλές φορές εντελώς μακριά από την κανονική ονομασία) κατέληξα στην χρήση HASH που οδηγούσε πάντα στο ανάλογο κανονικό όνομα - η αιτία της επιλογής αυτής της υλοποίησης ήταν πως αν και παραδοσιακά τα απλά κινητά παρέχουν σχετικά "ικανές" CPU δεν παρείχαν εξίσου αρκετή μνήμη (αποθήκευσης) ώστε να έχω όλη την ΒΔ άνετα καταχωρημένη οπότε το HASH φάνηκε το καλύτερο trade-off μεταξύ χώρου & ταχύτητας για αυτές τις μικρο-συσκευές.

 

Τώρα σε Android τα πράματα είναι σαφέστατα διαφορετικά (έχουμε και μνήμη + ταχύτητα και την εξαιρετική.. SQLite!!) :D

Με τι hash function γινόταν το hashing? Δεν μου έρχεται τώρα στο μυαλό πως μπορούν να γίνουν hashed ποικίλα υποκοριστικά στο κανονικό όνομα, εκτός αν μιλάμε για hardcoded πέρασμά τους στον κώδικα και την db.

 

Υπάρχει τέτοιο (χρησιμότατο) hash function?

  • Moderators
Δημοσ.

Έχει ένα μικρό μειονέκτημα ο τρόπος του nspyroy, το οποίο όμως είναι αμελητέο αν δεν πρόκειται να χρησιμοποιήσετε πτώσεις ονομάτων. Δηλαδή, το "Δημήτρη" και το "Δήμητρα" βγάζουν ακριβώς ίδιο normalized αποτέλεσμα.

 

EDIT:

 

Χμ... δεν είναι μόνο οι πτώσεις. Τα "Χάρης" (άντρας) και "Χάρις" (γυναίκα) βγάζουν επίσης ίδιο normalized αποτέλεσμα.

 

δεν βλεπω που ειναι το προβλημα :P

πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος?

Δημοσ.

δεν βλεπω που ειναι το προβλημα :P

πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος?

Yeap! Για αυτό έγραψα πως είναι αμελητέο αν δεν σκοπεύετε να χρησιμοποιήσετε πτώσεις.

 

Από την άλλη μεριά, το "Χάρης" μπορεί να προέρχεται από το "Χαράλαμπος" ή από το "Χαρίλαος" ενώ η "Χάρις" να προέρχεται από το "Χαρίκλεια" ή από το "Έυχαρις" (μη γελάς σε βλέπω :lol: ... btw έχω γνωστή που ονομάζεται Εύχαρις").

 

Σε γενικές γραμμές υπάρχουν διάφορες δυσκολίες στην ονοματολογία. Βέβαια τα πάντα εξαρτώνται από το πόσο σφαιρικό επιθυμείτε να κάνετε το εορτολόγιο.

Δημοσ.

δεν βλεπω που ειναι το προβλημα :P

πχ στο Δημήτρη και το Δήμητρα και ας εχουν το ιδιο αποτελεσμα θα εμφανισει οτι γιορταζει καποια επαφη. αρα θα επιστρέψει το αποτελεσμα που θελω. Τωρα στο μονο που θα ειναι λαθος ειναι αν δυο ονοματα πμε ιδιο rormalized αποτελεσμα γιορταζουν διαφορετικη μερα. μονο τοτε θα ειναι το προβλημα ή κανω λαθος?

 

Είναι το ίδιο με τη Μαρία που γιορτάζει 15 Αυγούστου και τη Μαρία που γιορτάζει 21 Νοεμβρίου,,, έχεις τρόπο να τις διαχωρίσεις??? ;)

Δημοσ.

Είναι το ίδιο με τη Μαρία που γιορτάζει 15 Αυγούστου και τη Μαρία που γιορτάζει 21 Νοεμβρίου,,, έχεις τρόπο να τις διαχωρίσεις??? ;)

Δεν είναι το ίδιο, γιατί για παράδειγμα ο Χάρης δεν πρέπει είναι listed στον κατάλογο της Χαρίκλειας και της Εύχαρις.

Δημοσ.

Ρίξε μια ματιά στον Double Metaphone, θα δείς οτι πολλές από τις απορείες σου, τις ικανοποιεί ...

Δημοσ.

Ρίξε μια ματιά στον Double Metaphone, θα δείς οτι πολλές από τις απορείες σου, τις ικανοποιεί ...

Εμένα εννοείς ή τον ~Spect;

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...