Пример #1
0
        public void CatchWordSwaps() {
            var source = SimpleTokeniser.Tokenise("how now brown cow");
            var target = SimpleTokeniser.Tokenise("how brown now cow");

            var ld2 = new LevenshteinDistance();
            Assert.AreEqual(1, ld2.DamerauLevenshteinDistance(source.ToArray(), target.ToArray()));

            LevenshteinDistance ld = new LevenshteinDistance();
            Assert.AreEqual(2, ld.Computer(source.ToArray(), target.ToArray()));
        }
Пример #2
0
        static void Main(string[] args) {
            //Console.ReadLine();
            var source = SimpleTokeniser.Tokenise("how now brown cow").ToArray();
            var target = SimpleTokeniser.Tokenise("how brown now cow").ToArray();
            const int reps = 1000000;

            var ld = new LevenshteinDistance();
            for (int i = 0; i < reps; i++) {
                ld.DamerauLevenshteinDistance(source, target);
            }
            Console.Out.WriteLine(".");
            Console.ReadLine();
        }
Пример #3
0
        public string GetCode()
        {
            LevenshteinDistance ld = new LevenshteinDistance();
            DataTable dt = SingleCodes.Instance.DataTable;
            string value = string.Empty;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                value = dt.Rows[i][2].ToString();
                decimal parent = ld.LevenshteinDistancePercent(value, code01);
                if (parent > 0.85m)
                {
                    if (!sl.ContainsKey(parent))
                    {
                        sl.Add(parent, dt.Rows[i][1]);
                    }
                }
            }

            return sl.GetByIndex(sl.Count - 1).ToString();
        }
Пример #4
0
        public void DistanceTest() {
            string source = "how now brown cow";
            string target = "how now brown crow";

            // segment
            var sourceSegs = source.Split(new char[] {' '});
            var targetSegs = target.Split(new char[] {' '});

            DateTime a = DateTime.Now;
            int reps = 10000;
            for (int i = 0; i < reps; i++ ) {
                LevenshteinDistance.EditDistance(sourceSegs, targetSegs);
            }
            Assert.AreEqual(1, LevenshteinDistance.EditDistance(sourceSegs, targetSegs));
            var b = DateTime.Now - a;

            DateTime c = DateTime.Now;
            var ld = new LevenshteinDistance();
            for (int i = 0; i < reps; i++ ) {
                ld.Computer(sourceSegs, targetSegs);
            }
            Assert.AreEqual(1, ld.Computer(sourceSegs, targetSegs));
            var d = DateTime.Now - c;

            // the static way is slower
            Assert.IsTrue(b > d);

            // no matter the order
            a = DateTime.Now;
            for (int i = 0; i < reps; i++) {
                LevenshteinDistance.EditDistance(sourceSegs, targetSegs);
            }
            Assert.AreEqual(1, LevenshteinDistance.EditDistance(sourceSegs, targetSegs));
            b = DateTime.Now - a;
            Assert.IsTrue(b > d);

            var sourceChars = CharacterTokeniser.Tokenise(source);
            var targetChars = CharacterTokeniser.Tokenise(target);

            Assert.AreEqual(1, ld.Computer(sourceChars.ToArray(), targetChars.ToArray()));
        }
Пример #5
0
        /// <summary>
        /// 根据样本识别并计算结果
        /// </summary>
        /// <param name="pics"></param>
        public int Calculate(Bitmap[] pics)
        {
            List <code>         codes = new List <code>();
            LevenshteinDistance ld    = new LevenshteinDistance();

            string result = string.Empty;
            int    a      = 0;
            int    b      = 0;
            int    total  = 0;
            string option = string.Empty;

            codes.Clear();
            using (StreamReader sr = new StreamReader(path + @"\DigitalDotMatrix.ini"))
            {
                while (!sr.EndOfStream)
                {
                    string[] temp = sr.ReadLine().Split(':');
                    code     c    = new code();
                    c.Key   = temp[1];
                    c.Value = temp[0];
                    codes.Add(c);
                }
            }

            for (int i = 0; i < 3; i++)
            {
                string code = vfc.GetSingleBmpCode(pics[i], 128);//得到代码串

                decimal max   = 0.0M;
                string  value = "";

                for (int m = 0; m < codes.Count; m++)
                {
                    code    c      = codes[m];
                    decimal parent = ld.LevenshteinDistancePercent(code, c.Key);
                    if (parent > max)
                    {
                        max   = parent;
                        value = c.Value;
                    }
                }
                if (IsNumeric(value) && i == 0)
                {
                    a = int.Parse(value);
                }
                else if (IsNumeric(value) && i == 2)
                {
                    b = int.Parse(value);
                }
                else
                {
                    option = value;
                }
                result = result + value;
            }
            switch (option)
            {
            case "-":
            {
                total = a - b;
                break;
            }

            case "+":
            {
                total = a + b;
                break;
            }

            default:
                break;
            }
            return(total);
        }
Пример #6
0
        public void RaceTime() {
            var source = SimpleTokeniser.Tokenise("how now brown cow").ToArray();
            var target = SimpleTokeniser.Tokenise("how brown now cow").ToArray();
            const int reps = 1000000;

            DateTime a = DateTime.Now;
            LevenshteinDistance ldd = new LevenshteinDistance();
            for (int i = 0; i < reps; i++) {
                ldd.DamerauLevenshteinDistance(source, target);
            }
            var b = DateTime.Now - a;

            DateTime c = DateTime.Now;
            LevenshteinDistance ld = new LevenshteinDistance();
            for (int i = 0; i < reps; i++) {
                ld.Computer(source, target);
            }
            var d = DateTime.Now - c;

            Assert.IsTrue(b > d);
        }
Пример #7
0
        public KeyValuePair <string, bool> SynonymMatch(List <string> vocabList, List <ChatIntent> intentList)
        {
            bool   hasMatch                   = false;
            string responseMessage            = contentManager.IntentPossibleMatchedResponse;
            int    counter                    = 0;
            AskMezPossibleMatch possibleMatch = new AskMezPossibleMatch(Message, Node);

            LevenshteinDistance dist   = new LevenshteinDistance();
            TFIDF         getVocab     = new TFIDF();
            List <string> responseList = new List <string>();

            foreach (string vocab in vocabList)
            {
                string json;
                url = url + vocab;
                List <string> synonymList = new List <string>();
                using (WebClient client = new WebClient())
                {
                    try
                    {
                        json = client.DownloadString(url);
                        SynonymDto synonym = Newtonsoft.Json.JsonConvert.DeserializeObject <SynonymDto>(json);
                        foreach (var def in synonym.def)
                        {
                            foreach (var tr in def.tr)
                            {
                                foreach (var mean in tr.mean)
                                {
                                    synonymList.Add(mean.text);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                }



                foreach (ChatIntent intent in intentList)
                {
                    if (possibleMatch.CheckIfRedirect(intent, intentList))
                    {
                        continue;
                    }
                    string        intentDesc      = intent.IntentDescription;
                    List <string> intentvocabList = getVocab.GetVocabulary(intentDesc);

                    bool hasSynonm = synonymList.Intersect(intentvocabList).Any();
                    if (hasSynonm && counter <= 3)
                    {
                        counter = counter + 1;
                        responseList.Add(intentDesc);
                    }
                }
            }
            responseList = (responseList.Count > 1) ? responseList.Distinct().Take(3).ToList() : responseList;
            foreach (string response in responseList)
            {
                responseMessage = responseMessage + "<br>";
                responseMessage = responseMessage + response;
            }

            responseMessage = responseMessage + "<br>" + contentManager.IntentSuggestionResponse;

            if (counter > 0)
            {
                return(new KeyValuePair <string, bool>(responseMessage, true));
            }

            return(new KeyValuePair <string, bool>(responseMessage, hasMatch));
        }
Пример #8
0
        /// <summary>
        /// Executes all mappings in this adapter and logs timing information.
        /// </summary>
        public void ExecuteProcessMappingsDebugTimer()
        {
            //Log.Info($"Processing message using adapter: {AdapterName}.");

            var s = new Stopwatch();

            s.Start();
            Mappings.ToList().ForEach(x => x.ProcessMappings(this));
            s.Stop();
            var timeTaken = s.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture);

            var allLeafNodes = OpenEhrRecord.All(new List <Component>()).Where(x =>
                                                                               x.GetType() == typeof(Leaf) &&
                                                                               Mappings.Any(y => LevenshteinDistance.Compute(y.OpenEhrFieldPath, x.Parent.Name) <= 10)).ToList();

            var totalNodeCount = allLeafNodes.Count;

            double confidence = (double)SuccessfulMappingCount / (double)totalNodeCount * 100;

            ConfidenceScore = confidence;

            //Log.Info($"Completed processing of message in {timeTaken} seconds using adapter: {AdapterName}, generated confidence of {confidence}%.\n");
        }
Пример #9
0
    public void RunAutoComplete(string input, List <string> corpus, AutocompleterInteractable[] autocompleters)
    {
        if (input.Length > 0)
        {
            char[] lastChar            = input.Substring(input.Length - 1).ToCharArray();
            string lastWord            = input.Split(' ').Last();
            char[] firstCharOfLastWord = lastWord.Substring(0).ToCharArray();

            if (firstCharOfLastWord.Length >= 1)
            {
                if (firstCharOfLastWord[0].ToString().Any(char.IsUpper))
                {
                    IsFirstLetterUpper = true;
                }
                else
                {
                    IsFirstLetterUpper = false;
                }
            }

            if (!char.IsWhiteSpace(lastChar[0]))
            {
                if (lastWord.Length < MaxWordLength)
                {
                    if (input.Length >= 0)
                    {
                        Dictionary <int, int> dict = new Dictionary <int, int> ();

                        for (int i = 0; i < corpus.Count; i++)
                        {
                            int cost = LevenshteinDistance.Compute(lastWord.ToLower(), corpus[i]);

                            if (cost >= MinLevenshteinCost && cost <= MaxLevenshteinCost)
                            {
                                dict.Add(i, cost);
                            }
                        }

                        if (lastWord.All(char.IsUpper))
                        {
                            IsUppercase = true;
                        }
                        if (lastWord.Any(char.IsLower))
                        {
                            IsUppercase = false;
                        }

                        List <int> distanceOrder = dict.OrderBy(kp => kp.Value).Select(kp => kp.Key).ToList();

                        for (int i = 0; i < distanceOrder.Count; i++)
                        {
                            if (i < autocompleters.Length)
                            {
                                if (IsUppercase)
                                {
                                    autocompleters [i].SetText(corpus [distanceOrder [i]].ToUpper());
                                }
                                else if (IsFirstLetterUpper && IsUppercase == false)
                                {
                                    autocompleters [i].SetText(char.ToUpper(corpus [distanceOrder [i]][0]) + corpus [distanceOrder [i]].Substring(1));
                                }
                                else if (!IsUppercase && IsFirstLetterUpper == false)
                                {
                                    autocompleters [i].SetText(corpus [distanceOrder [i]].ToLower());
                                }
                            }
                        }
                    }
                }
            }
        }
    }
Пример #10
0
        public Dictionary <string, string> GetListByStr(string str)
        {
            Dictionary <string, string> dic = new();
            List <Idiom> items;
            bool         queryPrevDailyIdioms    = false;//查询往日成语
            Dictionary <string, List <long> > kv = new();

            //if (str == "我全都要")
            //{
            //    items = _idioms.Find(new BsonDocument()).Sort(Builders<Idiom>.Sort.Ascending("Name")).ToList();
            //}
            if (str == "试试手气")
            {
                items = _idioms.Aggregate().AppendStage <Idiom>("{$sample:{size:5}}").ToList();
            }
            else if (str == "有待订正")
            {
                items = _idioms.Find(x => x.ToBeCorrected == true).ToList();
            }
            else if (str.StartsWith("标签:"))
            {
                items = _idioms.Find(x => x.Tags.Contains(str.Replace("标签:", ""))).ToList();
            }
            else if (str == "往日成语")
            {
                //除去deft
                List <LaunchInfo> info = _launchInfo.Find(Builders <LaunchInfo> .Filter.Ne("DateUT", DateTimeOffset.MinValue.ToUnixTimeSeconds())).Sort(Builders <LaunchInfo> .Sort.Ascending("DateUT")).ToList();
                items = new List <Idiom>();
                queryPrevDailyIdioms = true;
                if (info.Count > 1)
                {
                    foreach (LaunchInfo itemInfo in info)
                    {
                        if (itemInfo.DailyIdiom != null)
                        {
                            if (!kv.ContainsKey(itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name))
                            {
                                kv.Add(itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name, new List <long> {
                                    itemInfo.DateUT
                                });
                            }
                            else
                            {
                                kv[itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name].Add(itemInfo.DateUT);
                            }
                        }
                    }
                }
            }
            else
            {
                items = _idioms.Find(Builders <Idiom> .Filter.Regex("Name", new BsonRegularExpression(str))).Sort(Builders <Idiom> .Sort.Ascending("Name")).ToList();
            }
            if (queryPrevDailyIdioms)
            {
                foreach (var it in kv)
                {
                    StringBuilder sb = new();
                    foreach (long i in it.Value)
                    {
                        DateTimeOffset time = DateTimeOffset.FromUnixTimeSeconds(i);
                        sb.Append(string.Format("{0:D}", time.ToLocalTime()) + "、");
                    }
                    sb.Remove(sb.Length - 1, 1);
                    string[] strArr = it.Key.Split("_");
                    dic.Add(strArr[0], sb + ":" + strArr[1]);
                }
            }
            else
            {
                if (items.Count == 0 && str != "试试手气" && str != "有待订正" && !str.StartsWith("标签:") && str != "往日成语")
                {
                    AutoCollect(str);
                    ProjectionDefinition <Idiom> definition = Builders <Idiom> .Projection.Include(doc => doc.Name);

                    Dictionary <string, int> res = LevenshteinDistance.Extract(str, _idioms.Find(new BsonDocument()).ToList().Select(x => x.Name).ToList(), 5);
                    foreach (var item in res)
                    {
                        Idiom tmp = _idioms.Find(x => x.Name == item.Key).FirstOrDefault();
                        dic.Add(tmp.Id, tmp.Name);
                    }
                }
                foreach (Idiom item in items)
                {
                    dic.Add(item.Id, item.Name);
                }
            }
            if (dic.Count == 0)
            {
                //rtn = new StandardReturn(20001);
                throw new EasyException(20001);
            }
            else
            {
                return(dic);
            }
        }
Пример #11
0
 public static int FindMatch(string a, string b)
 {
     return(LevenshteinDistance.Compute(a, b));
 }
        public static async Task RecognizeSpeechAsync(bool auth)
        {
            var config = SpeechConfig.FromSubscription("YOUR SUBSCRIPTION KEY", "region");

            // Creates a speech recognizer.
            using (var recognizer = new SpeechRecognizer(config))
            {
                string   pathPrograms = "c:\\Users\\bedir\\OneDrive\\Masaüstü\\Programlar"; //
                string   pathGames    = "c:\\Users\\bedir\\OneDrive\\Masaüstü\\Oyunlar";
                string[] commands     = { "open", "close", "search", "google", "play" };    // "Open" runs an application. "Search" opens a website. "Google" makes a search on google. "Play" opens a game.
                string[] programs     = Directory.GetFiles(@pathPrograms);                  //Getting list of all files in the programs directory
                string[] games        = Directory.GetFiles(@pathGames);                     //Getting list of all files in the games directory

                // Starts speech recognition, and returns after a single utterance is recognized. The end of a
                // single utterance is determined by listening for silence at the end or until a maximum of 15
                // seconds of audio is processed.  The task returns the recognition text as result.
                // Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
                // shot recognition like command or query.
                // For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.

                var result = await recognizer.RecognizeOnceAsync();

                if (result.Text == "")
                {
                    RecognizeSpeechAsync(false).Wait();
                }

                string speech = result.Text.Substring(0, result.Text.Length - 1).ToLowerInvariant(); //Getting the phrase as text. Removing the last charachter which is a dot.

                if (speech == "hello")                                                               // First you need to say "Hello" before giving a command.
                {
                    SynthesisToSpeakerAsync("Hello sir. Tell me what to do!").Wait();
                    RecognizeSpeechAsync(true).Wait();
                }
                else if (auth)
                {
                    if (speech == "exit")
                    {
                        SynthesisToSpeakerAsync("Terminating the program").Wait();
                        Environment.Exit(1);
                    }

                    int firstIndex = speech.IndexOf(" "); // Divide the phrase to two from first space charachter.
                    if (firstIndex == -1)
                    {
                        SynthesisToSpeakerAsync("Please use more than one word to give a command!").Wait();
                    }
                    else
                    {
                        string[] phrase = { speech.Substring(0, firstIndex), speech.Substring(firstIndex + 1) }; // First phrase is command. Second phrase is the desired app to run.
                                                                                                                 // Example: if the phrase is "Open Google Chrome" then "Open" is the command and the "Google Chrome" is the app to run.

                        double maxDistanceComm = 999;                                                            // In Levenshtein algorithm, lower the score means higher similarity. So i set max distance 999.
                        double maxDistanceApp  = 999;
                        int    selectedCommand = 0;
                        string desiredApp      = "";
                        double jaro;
                        int    commandsLength = commands.Length;

                        for (int i = 0; i < commandsLength; i++)
                        {
                            jaro = LevenshteinDistance.Compute(commands[i], phrase[0]);

                            if (jaro < 3 && jaro < maxDistanceComm)
                            {
                                maxDistanceComm = jaro;
                                selectedCommand = i;
                            }
                        }

                        if (maxDistanceComm > 2)
                        {
                            SynthesisToSpeakerAsync("Command: " + phrase[0] + " does not exist!").Wait();
                        }
                        else
                        {
                            string fileName         = "";
                            string gameName         = "";
                            string selectedFileName = "";
                            string selectedGameName = "";
                            if (selectedCommand == 0 || selectedCommand == 1) // If the command is "Open" or "Close"
                            {
                                int programsLength = programs.Length;
                                for (int i = 0; i < programsLength; i++)
                                {
                                    int lastIndex = programs[i].LastIndexOf("\\");
                                    fileName = programs[i].Substring(lastIndex).ToLowerInvariant(); //Application names come with directory so i remove it
                                    jaro     = LevenshteinDistance.Compute(fileName, phrase[1]);    //Getting similarity score between phrase and applications
                                    if (jaro < maxDistanceApp)
                                    {
                                        maxDistanceApp   = jaro;
                                        desiredApp       = programs[i];
                                        selectedFileName = fileName; // Getting the most similar application to phrase that given.
                                    }
                                }
                                CmdExecuter(desiredApp, selectedFileName, selectedCommand);

                                /*
                                 * 1.parameter = App name with path
                                 * 2.parameter = App name
                                 * 3.parameter = "Open" command
                                 */
                            }
                            else if (selectedCommand == 4) // If the command is "Play"
                            {
                                int gamesLength = games.Length;
                                for (int i = 0; i < gamesLength; i++)
                                {
                                    int lastIndex = games[i].LastIndexOf("\\");
                                    gameName = games[i].Substring(lastIndex).ToLowerInvariant();
                                    jaro     = LevenshteinDistance.Compute(gameName, phrase[1]);
                                    if (jaro < maxDistanceApp)
                                    {
                                        maxDistanceApp   = jaro;
                                        desiredApp       = games[i];
                                        selectedGameName = gameName;
                                    }
                                }
                                CmdExecuter(desiredApp, selectedGameName, selectedCommand);

                                /*
                                 * 1.parameter = Game name with path
                                 * 2.parameter = Game name
                                 * 3.parameter = "Play" command
                                 */
                            }
                            else // If the command is "Google" or "Search"
                            {
                                CmdExecuter(pathPrograms + "\\Google Chrome.lnk", phrase[1], selectedCommand);

                                /*
                                 * 1.parameter = browser path
                                 * 2.parameter = search phrase or website
                                 * 3.parameter = "Google" or "Search" command
                                 */
                            }
                        }
                    }
                }
            }
            RecognizeSpeechAsync(false).Wait();
        }
Пример #13
0
        public async Task <List <RemoteSearchResult> > Search(int[] siteNum, string searchTitle, DateTime?searchDate, CancellationToken cancellationToken)
        {
            var result = new List <RemoteSearchResult>();

            if (siteNum == null || string.IsNullOrEmpty(searchTitle))
            {
                return(result);
            }

            string searchJAVID  = null;
            var    splitedTitle = searchTitle.Split();

            if (splitedTitle.Length > 1 && int.TryParse(splitedTitle[1], out _))
            {
                searchJAVID = $"{splitedTitle[0]}-{splitedTitle[1]}";
            }

            if (!string.IsNullOrEmpty(searchJAVID))
            {
                searchTitle = searchJAVID;
            }

            for (var i = 0; i < Database.SiteList.Sites[siteNum[0]].Count; i++)
            {
                siteNum[1] = i;
                var url  = Helper.GetSearchSearchURL(siteNum) + searchTitle;
                var data = await HTML.ElementFromURL(url, cancellationToken).ConfigureAwait(false);

                var searchResults = data.SelectNodesSafe("//div[@class='videos']//div[@class='video']");
                if (searchResults.Any())
                {
                    foreach (var searchResult in searchResults)
                    {
                        var    sceneURL    = new Uri(Helper.GetSearchBaseURL(siteNum) + $"/en/?v={searchResult.SelectSingleText(".//a/@id")}");
                        string curID       = Helper.Encode(sceneURL.PathAndQuery),
                               sceneName   = searchResult.SelectSingleText(".//div[@class='title']"),
                               scenePoster = $"http:{searchResult.SelectSingleText(".//img/@src").Replace("ps.", "pl.", StringComparison.OrdinalIgnoreCase)}",
                               javID       = searchResult.SelectSingleText(".//div[@class='id']");

                        var res = new RemoteSearchResult
                        {
                            ProviderIds = { { Plugin.Instance.Name, curID } },
                            Name        = $"{javID} {sceneName}",
                            ImageUrl    = scenePoster,
                        };

                        if (!string.IsNullOrEmpty(searchJAVID))
                        {
                            res.IndexNumber = 100 - LevenshteinDistance.Calculate(searchJAVID, javID, StringComparison.OrdinalIgnoreCase);
                        }

                        result.Add(res);
                    }
                }
                else
                {
                    var sceneURL = new Uri(Helper.GetSearchBaseURL(siteNum) + data.SelectSingleText("//div[@id='video_title']//a/@href"));
                    var sceneID  = new string[] { Helper.Encode(sceneURL.PathAndQuery) };

                    var searchResult = await Helper.GetSearchResultsFromUpdate(this, siteNum, sceneID, searchDate, cancellationToken).ConfigureAwait(false);

                    if (searchResult.Any())
                    {
                        result.AddRange(searchResult);
                    }
                }

                if (result.Any())
                {
                    break;
                }
            }

            return(result);
        }
Пример #14
0
 public void Test_Leveinstein_Return_1_When_Called_With_FRA_And_FRâ()
 {
     Assert.AreEqual(1, LevenshteinDistance.Compute("FRA", "FRâ"));
 }
Пример #15
0
        public async Task RunAsync(string[] args)
        {
            // {{ parameters:

            string repository = args[0];

            DateTime start = DateTime.Parse(args[1]);

            DateTime end = DateTime.Parse(args[2]);

            string targetCollection = args[3];

            // }}

            var distance = new LevenshteinDistance();

            var client = new MongoClient(_mongoconnectionStringProvider.GetConnectionString(repository));

            var database = client.GetDatabase(repository);

            var dup_detection = database.GetCollection <BsonDocument>(targetCollection);

            using (var connection = new System.Data.SqlClient.SqlConnection(_mssqlconnectionStringProvider.GetConnectionString()))
            {
                var threads = connection.Query(SqlQueryFactory.Instance.Get(QUERY_GET_THREAD_PROFILE),
                                               new
                {
                    repository = repository.ToUpper(),
                    start      = start,
                    end        = end
                })
                              .Select(m => new { Title = m.Title, Id = m.Id })
                              .ToList();

                for (int i = 0; i < threads.Count - 1; i++)
                {
                    for (int j = i + 1; j < threads.Count; j++)
                    {
                        var left = (threads[i].Title as string).ToLower();

                        var right = (threads[j].Title as string).ToLower();

                        var percentage = distance.LevenshteinDistancePercent(left, right) * 100;

                        // list all the percentage >= 50%
                        if (percentage >= 50m)
                        {
                            var md5 = Utils.ComputeStringPairMD5Hash(left, right);

                            var count = await dup_detection.Find("{_id: '" + md5 + "'}").CountAsync();

                            if (count == 0)
                            {
                                var dict = new Dictionary <string, object>()
                                {
                                    { "_id", md5 },
                                    { "left", new Dictionary <string, string> {
                                          { "thread_id", threads[i].Id as string },
                                          { "text", left as string }
                                      } },
                                    { "right", new Dictionary <string, string> {
                                          { "thread_id", threads[j].Id as string },
                                          { "text", right as string }
                                      } },
                                    { "percentage", (int)percentage }
                                };

                                var document = new BsonDocument(dict);

                                await dup_detection.InsertOneAsync(document);
                            }
                        }
                    }
                }
            }
        }
Пример #16
0
 public void Test_Leveinstein_Return_0_When_Called_With_Two_Null_Arguments()
 {
     Assert.AreEqual(0, LevenshteinDistance.Compute(null, null));
 }
Пример #17
0
 public void Test_Leveinstein_Return_0_When_Called_With_Two_Identical_Arguments()
 {
     Assert.AreEqual(0, LevenshteinDistance.Compute("FRA", "FRA"));
 }
Пример #18
0
        /// <summary>
        /// Wrapper around all sub-mapping execute method; executes all mappings in this adapter.
        /// </summary>
        public void ExecuteProcessMappings()
        {
            //Log.Info($"Processing message using adapter: {AdapterName}.");

            Mappings.ToList().ForEach(x => x.ProcessMappings(this));

            //Log.Info($"Completed processing of message using adapter: {AdapterName}.\n");

            var allLeafNodes = OpenEhrRecord.All(new List <Component>()).Where(x =>
                                                                               x.GetType() == typeof(Leaf) &&
                                                                               Mappings.Any(y => LevenshteinDistance.Compute(y.OpenEhrFieldPath, x.Parent.Name) <= 10)).ToList();

            var totalNodeCount = allLeafNodes.Count;

            var confidence = (double)SuccessfulMappingCount / (double)totalNodeCount * 100;

            ConfidenceScore = confidence;

            //Log.Info($"Completed processing of message using adapter: {AdapterName}, generated confidence of {confidence}%.\n");
        }
 public static IOrderedEnumerable <TSource> OrderBySimilarity <TSource>(this IEnumerable <TSource> sequence, Func <TSource, string> selector, string pattern)
 {
     return(sequence.OrderBy(item => LevenshteinDistance.Calculate(selector(item), pattern)));
 }
Пример #20
0
        public Task <List <LiteTag> > FindTagsAsync(ulong guildId, string name, int stop)
        {
            int tolerance = LiteConfiguration.Load().RelatedTagsLimit;
            var tags      = Tags.Where(x => x.GuildId == guildId && x.Aliases.Any(y => LevenshteinDistance.Compute(name, y) <= tolerance));
            var selected  = tags.OrderBy(x => x.Aliases.Sum(y => LevenshteinDistance.Compute(name, y))).Take(stop);

            return(Task.FromResult(selected.ToList()));
        }
Пример #21
0
        public void Invoke(ShPlayer player, string name)
        {
            var vehicle = Core.Instance.EntityHandler.Vehicles.OrderByDescending(x => LevenshteinDistance.CalculateSimilarity(x.Key, name)).FirstOrDefault().Value;
            var pos     = player.GetPosition();

            Core.Instance.SvManager.AddNewEntity(vehicle, player.GetPlace(), new Vector3(pos.x, pos.y + 7F, pos.z), player.GetRotation(), respawnable: false);
            player.TS("player_vehicle_spawned", vehicle.name);
        }
Пример #22
0
        public async Task Normalize(IReadOnlyCollection <string> recordKeys, CancellationToken cancellationToken)
        {
            await Task.Factory.StartNew(() =>
            {
                using (var autoSave = Context.I.DbContainerAutoSave)
                {
                    var dbContainer = autoSave.DBContainer;
                    var records     = dbContainer.AudioBookSet.GetRecordsAllWithCache();

                    var sw = new Stopwatch();
                    sw.Start();

                    var genres = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase);

                    // Case SENSITIVE!!! As Designed.
                    var referenceGenres = new HashSet <string>();
                    var genreParts      = new List <GenrePart>();

                    foreach (var genre in _referenceGenres)
                    {
                        var referenceGenre = genre;
                        var iofReference   = genre.IndexOf('|');
                        if (iofReference > 0)
                        {
                            referenceGenre = genre.Substring(0, iofReference);
                        }

                        referenceGenres.Add(referenceGenre);

                        var genreVariants = genre.ToLower().ReplaceAll("", " ", "-", ".").Split('|');
                        foreach (var genreVariant in genreVariants)
                        {
                            if (GenrePart.TryParse(genreVariant, referenceGenre, out var genrePart))
                            {
                                genreParts.Add(genrePart);
                            }
                            else
                            {
                                genres[genreVariant] = referenceGenre;
                            }
                        }
                    }

                    var abQuantity = 0;

                    foreach (var audioBook in records)
                    {
                        var audioBookGenres  = audioBook.GetGenres();
                        var genresNormalized = new List <string>();

                        foreach (var audioBookGenre in audioBookGenres.Where(item => item.Length > 3))
                        {
                            var genre4Resolve = _mixedCyrLatRegex.Replace(audioBookGenre, CyrLatToCyrConverter);

                            if (referenceGenres.Contains(genre4Resolve))
                            {
                                genresNormalized.Add(genre4Resolve);
                            }
                            else
                            {
                                var genreForCompare = genre4Resolve.ToLower().ReplaceAll("", " ", "-", ",", ".");

                                var results = new List <Tuple <string, int, string> >();
                                if (genres.TryGetValue(genreForCompare, out var referenceGenre))
                                {
                                    results.Add(Tuple.Create(referenceGenre, 0, "Variant"));
                                }
                                else
                                {
                                    foreach (var genreVariant in genres.Where(item =>
                                                                              Math.Abs(item.Key.Length - genreForCompare.Length) < 3))
                                    {
                                        var distance = LevenshteinDistance.Compute(genreVariant.Key, genreForCompare);

                                        if (distance <= 2)
                                        {
                                            results.Add(Tuple.Create(genreVariant.Value, distance,
                                                                     $"Distance to {genreVariant.Key}"));
                                        }
                                    }
                                }

                                if (results.Any())
                                {
                                    var candidate = results.OrderBy(item => item.Item2).First();
                                    genresNormalized.Add(candidate.Item1);
                                }
                                else
                                {
                                    var fitParts = genreParts.Where(gp => gp.IsFit(genre4Resolve))
                                                   .OrderBy(item => item.Priority).ToArray();

                                    if (fitParts.Any())
                                    {
                                        var minPriority = fitParts.Min(item => item.Priority);
                                        var res         = minPriority < int.MaxValue
                                            ? fitParts.Where(item => item.Priority == minPriority).ToArray()
                                            : fitParts;

                                        genresNormalized.Add(genre4Resolve);

                                        foreach (var genrePart in res)
                                        {
                                            genresNormalized.Add(genrePart.ReferenceGenre);
                                        }
                                    }
                                    else if (genre4Resolve != audioBookGenre)
                                    {
                                        genresNormalized.Add(genre4Resolve);
                                    }
                                }
                            }
                        }

                        if (genresNormalized.Any())
                        {
                            audioBook.Genre = string.Join(", ", genresNormalized.Distinct().OrderBy(item => item));
                            dbContainer.AudioBookSet.AddChangedRecords(audioBook);
                        }

                        cancellationToken.ThrowIfCancellationRequested();

                        ProgressMessage.ReportComplex(abQuantity++, records.Count);

                        if (sw.Elapsed > SaveTimer)
                        {
                            dbContainer.SaveChanges();
                            sw.Restart();
                        }
                    }

                    ProgressMessage.ReportComplex(records.Count, records.Count);
                }
            }, cancellationToken);
        }
Пример #23
0
        public ActionResult Index22()
        {
            AskCaro_QuestionnaireAspirateur.StackOverflowAspirateur main = new AskCaro_QuestionnaireAspirateur.StackOverflowAspirateur();

            var target   = "Is there a best practice and recommended alternative to Session variables in MVC";
            var text     = AskCaro_Web_MVC.Tools.WordsAnalyzer.StringWords2Remove(target);
            var targetHS = text.Split(' ').ToHashSet();

            var closeNeighbors = from h in _dbContext.Questions.AsEnumerable() // bring into memory
                                                                               // query continued below as linq-to-objects

                                 let score = (0.15 * LevenshteinDistance.Calculate(text, h.Tag) + 0.35 * LevenshteinDistance.Calculate(text.ToLower(), h.Tag.ToLower())) / Math.Max(text.Length, h.Tag.Length)
                                             //let lD = Tools.Class1.LevenshteinDistance(target, h.Tag)
                                             //let length = Math.Max(h.Tag.Length, target.Length)
                                             //let score = 1.0 - (double)lD / length
                                             where score > 0.25
                                             select new { h, score };
            var listttt = closeNeighbors.OrderByDescending(x => x.score).Take(10).ToList();

            return(View());
        }
Пример #24
0
 public void Test_Compute_Returns_Distance_Long_Word()
 {
     Assert.AreEqual(3, LevenshteinDistance.Compute("encyclopedia", "edcyclipexia"));
 }
Пример #25
0
        public void Invoke(ShPlayer player, string warp)
        {
            var file = Path.Combine(Core.Instance.Paths.WarpsFolder, $"{warp}.json");

            if (!File.Exists(file))
            {
                player.TS("expFileHandler_error_notFound", player.T(Core.Instance.WarpHandler.Name), warp);
                player.TS("levenshteinSuggest", Core.Instance.WarpHandler.List.OrderByDescending(x => LevenshteinDistance.CalculateSimilarity(x.Name, warp)).FirstOrDefault().Name);
                return;
            }


            Core.Instance.WarpHandler.DeleteExisting(warp);
            player.TS("expFileHandler_deleted", player.T(Core.Instance.WarpHandler.Name), warp);
        }
Пример #26
0
        /// <summary>
        ///     Fairly hefty method that looks for best match using string starts, case insensitive string starts and Levenshtein
        ///     distance
        /// </summary>
        /// <param name="choiceToValidate"></param>
        /// <returns></returns>
        public string FindNearestMatch(string choiceToValidate)
        {
            var livingContenderList = Contenders.FindAll(o => o.Score > 0);

            var beginsWithMatches = livingContenderList.FindAll(o => o.Name.StartsWith(choiceToValidate));
            var beginsWithMatchesCaseInsensitive =
                livingContenderList.FindAll(o => o.Name.ToLower().StartsWith(choiceToValidate.ToLower()));

            var containsMatches = livingContenderList.FindAll(o => o.Name.Contains(choiceToValidate));
            var containsMatchesCaseInsensitive =
                livingContenderList.FindAll(o => o.Name.ToLower().Contains(choiceToValidate.ToLower()));

            var bestMatch = "ERROR";

            // look for matches at the start of the word
            if (beginsWithMatches.Count == 1)
            {
                return(beginsWithMatches.First().Name);
            }

            // look for case insensitive matches at the start of the word
            if (beginsWithMatchesCaseInsensitive.Count == 1)
            {
                return(beginsWithMatchesCaseInsensitive.First().Name);
            }

            if (containsMatches.Count == 1)
            {
                return(containsMatches.First().Name);
            }

            if (containsMatchesCaseInsensitive.Count == 1)
            {
                return(containsMatchesCaseInsensitive.First().Name);
            }


            // fuzzy matching
            if (choiceToValidate.Length > 15)
            {
                var bestLScore = 1000;
                foreach (var c in livingContenderList)
                {
                    var lScore = LevenshteinDistance.Compute(choiceToValidate, c.Name);
                    if (lScore < bestLScore)
                    {
                        bestLScore = lScore;
                        bestMatch  = c.Name;
                    }
                }

                Console.WriteLine($"Best LScore {bestLScore} for {bestMatch}");

                if (bestLScore > 10)
                {
                    bestMatch = "ERROR";
                }
            }

            if (choiceToValidate.Length > 8)
            {
                var bestLScore = 1000;
                foreach (var c in livingContenderList)
                {
                    var lScore = LevenshteinDistance.Compute(choiceToValidate, c.Name);
                    if (lScore >= bestLScore)
                    {
                        continue;
                    }
                    bestLScore = lScore;
                    bestMatch  = c.Name;
                }

                Console.WriteLine($"Best LScore {bestLScore} for {bestMatch}");

                if (bestLScore > 6)
                {
                    bestMatch = "ERROR";
                }
            }

            if (choiceToValidate.Length <= 8)
            {
                var bestLScore = 1000;
                foreach (var c in livingContenderList)
                {
                    var lScore = LevenshteinDistance.Compute(choiceToValidate, c.Name);
                    if (lScore < bestLScore)
                    {
                        bestLScore = lScore;
                        bestMatch  = c.Name;
                    }
                }

                Console.WriteLine($"Best LScore {bestLScore} for {bestMatch}");

                if (bestLScore > 2)
                {
                    bestMatch = "ERROR";
                }
            }

            return(bestMatch);
        }
Пример #27
0
 public void Test_Compute_Returns_Distance()
 {
     Assert.AreEqual(1, LevenshteinDistance.Compute("car", "bar"));
 }
Пример #28
0
        public void LengthTests() {
            var shorter = SimpleTokeniser.Tokenise("foo bar baz bone dog cow cat frog").ToArray();
            var longer = SimpleTokeniser.Tokenise("foo bar baz bone dog sheep cow cat frog").ToArray();

            LevenshteinDistance ld = new LevenshteinDistance();
            Assert.AreEqual(1, ld.DamerauLevenshteinDistance(shorter, longer));
            Assert.AreEqual(1, ld.DamerauLevenshteinDistance(longer, shorter));

            var x = longer.ToList();
            x.Add(new Token("mouse", 0, 0));
            x.RemoveAt(1);
            longer = x.ToArray();

            Assert.AreEqual(3, ld.DamerauLevenshteinDistance(shorter, longer));
            Assert.AreEqual(3, ld.DamerauLevenshteinDistance(longer, shorter));
        }
 /// <summary>
 /// Calculates the similarity of two strings with a normalized Levenshtein distance
 /// </summary>
 /// <param name="firstLiteral">First literal to compare</param>
 /// <param name="secondLiteral">Second literal to compare</param>
 /// <returns>The similarity between two incoming literals between 0 and 1</returns>
 public static double CalculateStringSimilarity(string firstLiteral, string secondLiteral)
 {
     return(LevenshteinDistance.CalculateNormalized(firstLiteral, secondLiteral));
 }
Пример #30
0
        /// <summary>
        /// Gets the reference hub belonging to the player who's name most closely matches the string given, if any.
        /// </summary>
        /// <param name="args">Player's Name</param>
        /// <returns>ReferenceHub or null</returns>
        public static ReferenceHub GetPlayer(string args)
        {
            try
            {
                if (StrHubs.ContainsKey(args))
                {
                    return(StrHubs[args]);
                }

                ReferenceHub playerFound = null;

                if (short.TryParse(args, out short playerId))
                {
                    return(GetPlayer(playerId));
                }

                if (args.EndsWith("@steam") || args.EndsWith("@discord") || args.EndsWith("@northwood") || args.EndsWith("@patreon"))
                {
                    Log.Debug("Trying to find by UserID...");

                    foreach (ReferenceHub player in GetHubs())
                    {
                        if (player.GetUserId() == args)
                        {
                            playerFound = player;

                            Log.Debug("Found UserID match.");
                        }
                    }
                }
                else
                {
                    Log.Debug($"Trying to find by name... {args}");

                    if (args == "WORLD" || args == "SCP-018" || args == "SCP-575" || args == "SCP-207")
                    {
                        return(null);
                    }

                    int    maxNameLength = 31, lastnameDifference = 31;
                    string str1 = args.ToLower();

                    foreach (ReferenceHub player in GetHubs())
                    {
                        if (!player.GetNickname().ToLower().Contains(args.ToLower()))
                        {
                            continue;
                        }

                        if (str1.Length < maxNameLength)
                        {
                            int    x    = maxNameLength - str1.Length;
                            int    y    = maxNameLength - player.GetNickname().Length;
                            string str2 = player.GetNickname();

                            for (int i = 0; i < x; i++)
                            {
                                str1 += "z";
                            }

                            for (int i = 0; i < y; i++)
                            {
                                str2 += "z";
                            }

                            int nameDifference = LevenshteinDistance.Compute(str1, str2);
                            if (nameDifference < lastnameDifference)
                            {
                                lastnameDifference = nameDifference;
                                playerFound        = player;

                                Log.Debug("Found name match.");
                            }
                        }
                    }
                }

                if (playerFound != null)
                {
                    StrHubs.Add(args, playerFound);
                }

                return(playerFound);
            }
            catch (Exception exception)
            {
                Log.Error($"GetPlayer error: {exception}");
                return(null);
            }
        }
Пример #31
0
        public void CharacterTest() {
            var s = CharacterTokeniser.Tokenise("abcdef").ToArray();
            var t = CharacterTokeniser.Tokenise("abdcef").ToArray();

            LevenshteinDistance ld = new LevenshteinDistance();
            Assert.AreEqual(1, ld.DamerauLevenshteinDistance(s, t));
        }
Пример #32
0
 static void Main()
 {
     Console.WriteLine(LevenshteinDistance.Compute("aunt", "ant"));
     Console.WriteLine(LevenshteinDistance.Compute("Sam", "Samantha"));
     Console.WriteLine(LevenshteinDistance.Compute("flomax", "volmax"));
 }
Пример #33
0
        public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
        {
            var result = new List <RemoteSearchResult>();

            if (searchInfo == null || string.IsNullOrEmpty(searchInfo.Name))
            {
                return(result);
            }

            Logger.Info($"searchInfo.Name: {searchInfo.Name}");

            var title = Helper.ReplaceAbbrieviation(searchInfo.Name);
            var site  = Helper.GetSiteFromTitle(title);

            if (site.siteNum == null)
            {
                string newTitle;
                if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.DefaultSiteName))
                {
                    newTitle = $"{Plugin.Instance.Configuration.DefaultSiteName} {searchInfo.Name}";
                }
                else
                {
                    newTitle = Helper.GetSiteNameFromTitle(searchInfo.Name);
                }

                if (!string.IsNullOrEmpty(newTitle) && !newTitle.Equals(searchInfo.Name, StringComparison.OrdinalIgnoreCase))
                {
                    Logger.Info($"newTitle: {newTitle}");

                    title = Helper.ReplaceAbbrieviation(newTitle);
                    site  = Helper.GetSiteFromTitle(title);
                }

                if (site.siteNum == null)
                {
                    return(result);
                }
            }

            string searchTitle = Helper.GetClearTitle(title, site.siteName),
                   searchDate  = string.Empty;
            DateTime?searchDateObj;
            var      titleAfterDate = Helper.GetDateFromTitle(searchTitle);

            searchTitle   = titleAfterDate.searchTitle;
            searchDateObj = titleAfterDate.searchDateObj;
            if (searchDateObj.HasValue)
            {
                searchDate = searchDateObj.Value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            }
            else
            {
                if (searchInfo.PremiereDate.HasValue)
                {
#if __EMBY__
                    searchDateObj = searchInfo.PremiereDate.Value.DateTime;
#else
                    searchDateObj = searchInfo.PremiereDate.Value;
#endif
                    searchDate = searchInfo.PremiereDate.Value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
                }
            }

            if (string.IsNullOrEmpty(searchTitle))
            {
                return(result);
            }

            Logger.Info($"site: {site.siteNum[0]}:{site.siteNum[1]} ({site.siteName})");
            Logger.Info($"searchTitle: {searchTitle}");
            Logger.Info($"searchDate: {searchDate}");

            var provider = Helper.GetProviderBySiteID(site.siteNum[0]);
            if (provider != null)
            {
                Logger.Info($"provider: {provider}");

                try
                {
                    result = await provider.Search(site.siteNum, searchTitle, searchDateObj, cancellationToken).ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    Logger.Error($"Search error: \"{e}\"");

                    await Analitycs.Send(searchInfo.Name, site.siteNum, site.siteName, searchTitle, searchDateObj, provider.ToString(), e, cancellationToken).ConfigureAwait(false);
                }

                if (result.Any())
                {
                    foreach (var scene in result)
                    {
                        scene.ProviderIds[this.Name] = $"{site.siteNum[0]}#{site.siteNum[1]}#" + scene.ProviderIds[this.Name];
                        scene.Name = scene.Name.Trim();
                        if (scene.PremiereDate.HasValue)
                        {
                            scene.ProductionYear = scene.PremiereDate.Value.Year;
                        }
                    }

                    if (result.Any(scene => scene.IndexNumber.HasValue))
                    {
                        result = result.OrderByDescending(o => o.IndexNumber.HasValue).ThenByDescending(o => o.IndexNumber).ToList();
                    }
                    else if (!string.IsNullOrEmpty(searchDate) && result.All(o => o.PremiereDate.HasValue) && result.Any(o => o.PremiereDate.Value != searchDateObj))
                    {
                        result = result.OrderBy(o => Math.Abs((searchDateObj - o.PremiereDate).Value.TotalDays)).ToList();
                    }
                    else
                    {
                        result = result.OrderByDescending(o => 100 - LevenshteinDistance.Calculate(searchTitle, o.Name, StringComparison.OrdinalIgnoreCase)).ToList();
                    }
                }
            }

            return(result);
        }
Пример #34
0
        /// <summary>
        /// Launch the analyze function for selected files.
        /// </summary>
        private void Analyse()
        {
            // If the analyze process is not running, launch it.
            if (!isAnalyzeRunning)
            {
                int nbMusics = 0;
                foreach (MusicItem music in Musics)
                {
                    if (music.IsChecked)
                    {
                        nbMusics++;
                    }
                }

                if (nbMusics > 0)
                {
                    PercentProgress   = 0;
                    isAnalyzeRunning  = true;
                    AnalyseButtonText = "Arrêter";

                    Task.Factory.StartNew(() =>
                    {
                        double nbAnalysed = 0;

                        foreach (MusicItem music in Musics)
                        {
                            if (!isAnalyzeRunning)
                            {
                                Console.WriteLine("Stop process");
                                break;
                            }

                            if (music.IsChecked)
                            {
                                IEnumerable <MusicDao> results = null;
                                try
                                {
                                    Settings settings = Settings.Instance;
                                    results           = new MusicTagDetector(settings.ApiHost, settings.ApiKey, settings.SecretKey).Recognize(music.Path);
                                }
                                catch
                                {
                                    music.Status = MusicItemStatus.Error;
                                }

                                nbAnalysed++;
                                PercentProgress = nbAnalysed / nbMusics * 100;

                                if (results != null)
                                {
                                    App.Current.Dispatcher.BeginInvoke(() =>
                                    {
                                        music.Results.Clear();

                                        foreach (MusicDao result in results)
                                        {
                                            AnalyzeResult aResult = new AnalyzeResult(result);
                                            aResult.MatchLevel    = LevenshteinDistance.Compute(aResult.Title, SelectedMusic.Title);

                                            music.AddResult(aResult);
                                        }

                                        music.Status = MusicItemStatus.Analysed;

                                        if (AutoSet)
                                        {
                                            music.SetBestResult();
                                        }
                                    });
                                }
                            }
                        }

                        PercentProgress   = 100;
                        isAnalyzeRunning  = false;
                        AnalyseButtonText = "Analyser";
                    });
                }
                else
                {
                    MessageBox.Show("Veuillez cocher au moins une musique.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else // If the analyze process is running, stop it.
            {
                isAnalyzeRunning  = false;
                AnalyseButtonText = "Analyser";
                PercentProgress   = 0;
            }
        }
Пример #35
0
 private string GetCode(string code01)
 {
     n++;
     SortedList s = new SortedList();
     string code = string.Empty;
     string[] arrcode = Consts.ArrCode();
     LevenshteinDistance ld = new LevenshteinDistance();
     decimal parcent;
     for (int i = 0; i < arrcode.Length; i++)
     {
         parcent = ld.LevenshteinDistancePercent(arrcode[i], code01);
         Console.WriteLine("parcent{1}={0}", parcent, n);
         if (parcent > 0.8m)
         {
             if (!s.ContainsKey(parcent))
                 s.Add(parcent, i);
             //code = i.ToString();
             //break;
         }
     }
     dic.Add(n, s);
     return code;
 }
        public T GetSpecificWithName(string name, List <T> elements)
        {
            name = name.ToLower();

            // Match 1:1
            var elementByFullNameExactMatch = elements.FirstOrDefault(t => t.ComparableString.ToLower().Trim() == name.Trim());

            if (elementByFullNameExactMatch != null)
            {
                return(elementByFullNameExactMatch);
            }


            // Find closest match using Levenshtein Distance algorithm based on full name
            var closestElementOnFullName = getElementClosestToName(name, elements);

            if (closestElementOnFullName != null)
            {
                return(closestElementOnFullName);
            }



            string[] possibleNamesToLookFor = StringHelpers.GetAllArrayCombinations_Recursive(name.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries));


            // Look for any exact matches with any combination of names
            var possibleMatches = 0;
            T   matchingElement = null;

            foreach (var possibleName in possibleNamesToLookFor)
            {
                // Skip if only one name
                if (possibleName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length <= 1)
                {
                    continue;
                }

                foreach (var element in elements)
                {
                    // Skip if only one name
                    if (element.ComparableString.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length <= 1)
                    {
                        continue;
                    }

                    var      elementName          = element.ComparableString.ToLower();
                    string[] possibleElementNames = StringHelpers.GetAllArrayCombinations_Recursive(elementName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries));

                    foreach (var matchingName in possibleElementNames)
                    {
                        if (matchingName.Equals(possibleName))
                        {
                            possibleMatches++;
                            matchingElement = element;
                            break;
                        }
                    }
                }
            }

            if (matchingElement != null && possibleMatches == 1)
            {
                return(matchingElement);
            }



            // Look for any matches with any combination of names, with up to X errors
            possibleMatches = 0;
            matchingElement = null;

            foreach (var possibleName in possibleNamesToLookFor)
            {
                // Skip if only one name
                if (possibleName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length <= 1)
                {
                    continue;
                }

                foreach (var element in elements)
                {
                    // Skip if only one name
                    if (element.ComparableString.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length <= 1)
                    {
                        continue;
                    }

                    var      elementName          = element.ComparableString.ToLower();
                    string[] possibleElementNames = StringHelpers.GetAllArrayCombinations_Recursive(elementName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries));

                    foreach (var matchingName in possibleElementNames)
                    {
                        var distance = LevenshteinDistance.Calculate(possibleName, matchingName);
                        if (distance <= _settings.AcceptedNumberOfErrors)
                        {
                            if (matchingElement != null && matchingElement == element)
                            {
                                continue;
                            }
                            matchingElement = element;
                            possibleMatches++;
                        }
                    }
                }
            }

            if (matchingElement != null && (possibleMatches == 1 || _settings.AcceptMultipleResults))
            {
                return(matchingElement);
            }

            return(null);
        }