Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Διόρθωση Αναγραμματισμού Ονομάτων...

Îåêßíçóå áðü ôï ìÝëïò SetN=asxetos.... Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 02-11-2007, 10:15. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  31-10-2007, 11:19 36827

    Διόρθωση Αναγραμματισμού Ονομάτων...

    καλημέρα!!!Λοιπόν σκέφτομαι να φτιάξω ένα είδος λεξικού κυρίων ονομάτων κάτι σαν Τ9, ώστε να μειώσω τα λάθη αναγραμματισμού κατα την καταχώρηση των ονομάτων στη βάση. Είχα σκεφτεί να φυλάω τα σωστά ονόματα σε ένα πίνακα ας τον πούμε Τ9 και με την εντολή Replace να αντικαθιστώ το όνομα με το σωστό. Το θέμα είναι πώς να εντοπίσω τα λάθη Αναγραμματισμού....Π.χ.  έχει καταχωρηθεί το όνομα "Χριτσίνα" και θέλω να το εντοπίζει και να το αντικαθιστά με το σωστό "Χριστίνα" το οποίο θα είναι στον Τ9.Πως γίνεται??? 
  •  31-10-2007, 23:45 36847 σε απάντηση της 36827

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Ψάχνεις μια καθαρά database λύση; Ότι σου δίνει η βάση και η SQL, ή και πιθανές λύσεις σε .NET κώδικα;


    Angel
    O:]
  •  01-11-2007, 16:31 36860 σε απάντηση της 36827

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Απορία:

    Αν το λανθασμένο όνομα είναι: ίνα , τότε ποιο θα είναι το σωστό, Νίνα ή Μίνα ή Λίνα (για παράδειγμα) ???
    Εννοώ όταν υπάρχουν δυο,τρεις όμοιες επιλογές... τι θα γίνεται???
    :)

    Σύνταξη στα 18,
    Στράτευση στα 100.
  •  01-11-2007, 17:13 36862 σε απάντηση της 36860

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Η ιδανική λύση θα πρέπει να δίνει σαν output όλους τους δυνατούς συνδυασμούς Smile
    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  01-11-2007, 17:18 36863 σε απάντηση της 36860

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Συνημμένα: SimilarityRank.txt
    Η συνηθισμένη απάντηση σε τέτοιους προβληματισμούς, είναι ένας similarity ranking αλγόριθμος, που εξετάζει 2 λέξεις/φράσεις, και σου δίνει ένα double αποτέλεσμα με κάποιο ποσοστό ομοιότητας ανάμεσα στα 2 strings. Οπότε π.χ. αν το λάθος σου είναι 'ίνα' και δεν υπάρχει κάτι άλλο στο string σου, τα 'Μίνα', 'Λίνα' κτλ κτλ ... μάλλον θα δώσουν την ίδια απάντηση. Και λογικό δεν είναι;

    Κοίταγα χτές το βράδυ πως θα μπορούσε να γίνει κάτι τέτοιο σχετικά εύκολα στη βάση, και δεν βρήκα τίποτα σχετικό στα 10 λεπτά που έδωσα ... αλλά ...

    Αν η βάση σου είναι SQL Server, τότε μπορείς να γράψεις σε .NET γλώσσες δικά σου "extentions" στον SQL.

    Έτσι, και μιας και το δεύτερο link στο Google για "similarity ranking algorithm C#" μου επέστρεψε μια υλοποίηση σε ... Java ... κάθησα λίγο στο VS και την έκανα C# για SQL Server - ένα user function που μπορείς να χρησιμοποιήσεις μέσα στην SQL σου, κάπως έτσι:

    SELECT [dbo].[SimilarityRank] ( 'aggeloa karantzalia'  ,'aggelos karantzalis')

    ... αυτό μου γυρίζει 0.875, το οποίο μου φαίνεται λογικό νούμερο με 2 γράμματα λάθος στα 19-20.

    Τέλος πάντων όμως, αυτό δεν είναι το κύριο πρόβλημά σου. Το κύριο πρόβλημα σου είναι ότι χρειάζεσαι ένα "Dictionary" με τα πιθανά permutations, και πώς περιορίζεις το μέγεθός του ...

    Επειδή έχω μόνο VS 2008 σπίτι, κάνω απλώς copy paste τον κώδικα, sorry about that, και το κάνω attach σαν .txt ( γιατί ρε παιδιά δεν μπορούμε να ανεβάσουμε .cs ;;; )

    using System;

    using System.Data;

    using System.Data.SqlClient;

    using System.Data.SqlTypes;

    using Microsoft.SqlServer.Server;

     

    using System.Collections;

    using System.Collections.Generic;

     

    public partial class UserDefinedFunctions

    {

        /// <summary>

        /// Calculates a similarity ranking value for the two specified strings

        /// </summary>

        /// <returns></returns>

        [Microsoft.SqlServer.Server.SqlFunction]

        public static SqlDouble SimilarityRank(string strValue1, string strValue2)

        {

            IList<string> pairs1 = WordLetterPairs(strValue1);

            IList<string> pairs2 = WordLetterPairs(strValue2);

     

            int intersection = 0;

            int union = pairs1.Count + pairs2.Count;

     

            foreach(string pair1 in pairs1){

                for (int j = 0; j < pairs2.Count; j++)

                {

                    string pair2 = pairs2[j];

                    if (pair1.Equals(pair2))

                    {

                        intersection++;

                        pairs2.RemoveAt(j);

                        break;

                    }

                }

            }

     

            return new SqlDouble((2.0 * intersection) / union);

        }

     

        /// <summary>

        /// Splits the input into "words" and collects all character pairs

        /// </summary>

        /// <param name="str"></param>

        /// <returns></returns>

        private static IList<string> WordLetterPairs(string str)

        {

            List<string> allPairs = new List<string>();

            // Tokenize the string and put the tokens/words into an array

            string[] words = str.Split(' ', '\n', '\t');

            // For each word

            foreach (string word in words)

                foreach (string pairInWord in LetterPairs(word))

                    allPairs.Add(pairInWord);

     

            return allPairs;

        }

     

        /// <summary>

        /// Retrieves all the character pairs in the given string

        /// </summary>

        /// <param name="str"></param>

        /// <returns></returns>

        private static string[] LetterPairs(string str)

        {

            int numPairs = str.Length - 1;

            string[] pairs = new string[numPairs];

            for (int i = 0; i < numPairs; i++)

            {

                pairsIdea = str.Substring(i, 2);

            }

            return pairs;

        }

    };

     

     



    Angel
    O:]
  •  01-11-2007, 18:14 36866 σε απάντηση της 36863

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Πολύ ωραίος Άγγελε!

    Μια εναλλακτική λύση (δεδομένου ότι έχεις στα χέρια σου ένα dictionary) είναι να χρησιμοποιήσεις το fuzzy lookup transformation του SSIS Wink


    Vir prudens non contra ventum mingit
  •  01-11-2007, 19:24 36869 σε απάντηση της 36866

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Φίλε πιστεύεις ότι αυτό συζητάγαμε τώρα με το Μήτσο και το Γιάννη ( φίλοι στη δουλειά, άσχετοι με το θέμα μας ... ) στη βεράντα της δουλειάς, τον SSIS, για αυτό ακριβώς το θέμα ;;; 
    ( βασικά η δική μου συμβολή στη συζήτηση ήταν το ... "τί σημαίνουν τα αρχικά SSIS;;;" .. πάντα το άκουγα Integration Services κι ούτε πήγε το μυαλό μου ... )

    ... ε και φαντάζομαi ότι ναί, ο αλγόριθμός τους πρέπει να είναι μερικές χιλιάδες φορές καλύτερος απο αυτόν που βρήκα στο δεύτερο link του Google Big Smile. Κάπου έπρεπε να δοκιμάσω κι εγώ SQLCLR όμως Stick out tongue

    Angel
    O:]
  •  02-11-2007, 08:19 36878 σε απάντηση της 36869

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

    Γι αυτό λένε "τα μεγάλα πνεύματα συναντιώνται" Stick out tongue


    Vir prudens non contra ventum mingit
  •  02-11-2007, 10:15 36882 σε απάντηση της 36869

    Απ: Διόρθωση Αναγραμματισμού Ονομάτων...

        Το Fuzzy Lookup του SSIS το είχα χρησιμοποιήσει πριν από μερικά χρόνια σε μία εφαρμογή διαχείρισης έργων για να "καθαρίσω" ονόματα νομών, περιφερειών, κωδικών δραστηριοτήτων και άλλων φορολογικών. Βλέπετε, μπορεί η λίστα με τις δραστηριότητες ή τους νομούς να είναι η ίδια αλλά οι συντμήσεις και οι ανορθογραφίες της κάθε υπηρεσίας, εφορίας, υπουργείου δεν είναι!
        Αποδείχτηκε πολύ εύκολο στη χρήση και αρκετά αποτελεσματικό, ειδικά επειδή σου έδινε ένα πιθανό όνομα αλλά και ένα confidence value. Έτσι π.χ. μπορείς να χρησιμοποιήσεις άμεσα τα lookups με confidence >0.95 και να κρατήσεις για έλεγχο τα υπόλοιπα, ή (τί σκέφτηκα ο άτιμος!) να χρησιμοποιήσεις άλλο αλγόριθμο για όσα δεν υπάρχει αρκετή βεβαιότητα!

    Μήπως άραγε μπορεί κανείς να καλέσει τον αλγόριθμο και χωρίς το SSIS, γνωρίζοντας ποιό είναι το κατάλληλο assembly? Χμμμμ.

        Μιά και πιάσαμε τα SSIS, το ξέρατε ότι μπορείτε να χρησιμοποιήσετε τα μοντέλα Data Mining που έχετε φτιάξει και μέσα στα SSIS, π.χ. για να βαθμολογήσετε αιτήσεις δανείων ή ... να καθαρίσετε ονόματα? Και το αντίστροφο, μπορείτε να φτιάξετε το δικό σας αλγόριθμο και να τον ενσωματώσετε στο SSIS?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems