Пример #1
0
        public void Levenshtein_distance_throws_exception_if_input_string__is_null()
        {
            var levenshtein = new Levenshtein();

            Assert.ThrowsException <ArgumentNullException>(() => levenshtein.CalculateDistance("test", null));
            Assert.ThrowsException <ArgumentNullException>(() => levenshtein.CalculateDistance(null, "test"));
            Assert.ThrowsException <ArgumentNullException>(() => levenshtein.CalculateDistance(null, null));
        }
Пример #2
0
        public void Levenshtein_distance_calculation_if_strings_are_different()
        {
            var levenshtein = new Levenshtein();

            Assert.AreEqual(1, levenshtein.CalculateDistance("test1", "test2"));
            Assert.AreEqual(1, levenshtein.CalculateDistance("test", "tst"));
            Assert.AreEqual(2, levenshtein.CalculateDistance("test", "tset"));
            Assert.AreEqual(2, levenshtein.CalculateDistance("test", "tste"));
            Assert.AreEqual(3, levenshtein.CalculateDistance("test", "etts"));
        }
        public void Test_grid_over_2GB()
        {
            var webClient = new WebClient();
            var html1     = webClient.DownloadString("http://www.google.com");
            var s         = html1.Substring(0, 23743); // 4*23743^2 = 2.1gb memory

            var distance = Levenshtein.CalculateDistance(s, s, 1);

            distance.Should().Be(0);
        }
Пример #4
0
        public void Levenshtein_distance_calculation_with_specified_equality_comparer()
        {
            var equalityComparer = new Mock <IEqualityComparer <char> >(MockBehavior.Strict);

            equalityComparer
            .Setup(t => t.Equals(It.IsAny <char>(), It.IsAny <char>()))
            .Returns <char, char>((x, y) => x == 't' || y == 't');
            var levenshtein = new Levenshtein(equalityComparer.Object);

            Assert.AreEqual(2, levenshtein.CalculateDistance("test", "test"));
        }
Пример #5
0
        public async Task <List <Tag> > SearchTagsAsync(Snowflake guildId, string searchQuery)
        {
            var tags = await RetrieveTagsAsync(guildId);

            return(tags
                   .Select(x => (Levenshtein.CalculateDistance(x.Name, searchQuery, 2), x))
                   .Where(x => x.Item1 <= 5)
                   .OrderBy(x => x.Item1)
                   .Select(x => x.Item2)
                   .ToList());
        }
Пример #6
0
        public void WhatDoTheNumbersMean()
        {
            const string input      = "339 E 200 S";
            const string candidate1 = "339 E 200 S";
            const string candidate2 = "339 E 200 N";

            var xDistance = Levenshtein.CalculateDistance(input, candidate1, 1);
            var yDistance = Levenshtein.CalculateDistance(input, candidate2, 1);

            var comparison = xDistance.CompareTo(yDistance);

            // since smaller is better
            Assert.That(comparison, Is.EqualTo(-1));
        }
Пример #7
0
        private static string hidden = "germany lost"; //Only for lowercase chars and numbers, you can customize accordingly.

        public static int Try(string text, int found)
        {
            Random rand = new Random();
            int    fix  = rand.Next(-1, 0);

            switch (found)
            {
            case 1: break;

            case 2: Console.Write("Fixed: " + (fix + Levenshtein.CalculateDistance(hidden, text, 1)) + " ");
                Console.Write("Original: " + Levenshtein.CalculateDistance(hidden, text, 1) + "\n");
                break;
            }
            return(fix + Levenshtein.CalculateDistance(hidden, text, 1));
        }
Пример #8
0
        public static Card GetCardByName(string input, ICollection <Card> collection)
        {
            float closest     = float.MaxValue;
            Card  closestCard = null;

            foreach (var card in collection)
            {
                float distance = Levenshtein.CalculateDistance(input, card.name, 1) / (float)card.name.Length;
                if (distance < closest)
                {
                    closest     = distance;
                    closestCard = card;
                }
            }
            return(closestCard);
        }
Пример #9
0
        public int Compare(Candidate x, Candidate y)
        {
            var compareTo = y.Score.CompareTo(x.Score);

            if (compareTo != 0)
            {
                return(compareTo);
            }

            var weight = y.Weight.CompareTo(x.Weight);

            if (weight != 0)
            {
                return(weight);
            }

            var xDistance = Levenshtein.CalculateDistance(_address, x.Address, 1);
            var yDistance = Levenshtein.CalculateDistance(_address, y.Address, 1);

            return(xDistance.CompareTo(yDistance));
        }
Пример #10
0
        public DplSearchResult SearchDpl(DplSearch searchQuery)
        {
            if (searchQuery == null)
            {
                throw new ArgumentNullException(nameof(searchQuery));
            }

            var clauses = searchQuery.GetClauses();

            if (!clauses.Any())
            {
                throw new ArgumentException("DPL Search does not contain any clauses.", nameof(searchQuery));
            }

            IEnumerable <DplEntry> entries = Repository.DplEntries;

            foreach (var clause in clauses)
            {
                switch (clause.MatchType)
                {
                case DplSearchMatchType.Exact:
                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => string.Equals(x.City, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => string.Equals(x.CountryCode, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => string.Equals(x.Name, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => string.Equals(x.Notes, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => string.Equals(x.StateCode, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;
                    }

                    break;

                case DplSearchMatchType.Similar:
                    float threshold = 0.3125f;

                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.City, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.CountryCode, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Name, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Notes, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.StateCode, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;
                    }

                    break;

                case DplSearchMatchType.Contains:
                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => x.City.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => x.CountryCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => x.Name.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => x.Notes.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => x.StateCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;
                    }
                    break;

                default:
                    throw new ArgumentException($"{nameof(DplSearchMatchType)} value not defined.", nameof(searchQuery));
                }
            }

            var hits   = entries.ToList();
            var result = new DplSearchResult()
            {
                Hits           = hits,
                TotalHits      = hits.Count,
                ReportDateTime = DateTime.Now
            };

            return(result);
        }
Пример #11
0
 public void One_letter_to_empty()
 {
     Levenshtein.CalculateDistance("a", "", 2).Should().Be(1);
 }
Пример #12
0
 public void One_substitution_cost2()
 {
     Levenshtein.CalculateDistance("a", "b", 2).Should().Be(2);
 }
Пример #13
0
        public void Levenshtein_distance_is_zero_if_the_two_string_are_equal()
        {
            var levenshtein = new Levenshtein();

            Assert.AreEqual(0, levenshtein.CalculateDistance("test", "test"));
        }
Пример #14
0
 public void Three_substitutions_cost2()
 {
     Levenshtein.CalculateDistance("abc", "def", 2).Should().Be(6);
 }
Пример #15
0
 public void Kitten_to_sitting_substitutions_cost_1()
 {
     Levenshtein.CalculateDistance("kitten", "sitting", 1).Should().Be(3);
 }
Пример #16
0
 public void Empty_to_1_letter()
 {
     Levenshtein.CalculateDistance("", "s", 2).Should().Be(1);
 }
Пример #17
0
        public void ArbitrateBetweenTags()
        {
            /*
             *  Arbitrage de quels tags sont gardés pour le nouveau fichier.
             *  Si l'ancien est vide, on met le nouveau.
             *  Si l'ancien n'est pas vide, on garde Artiste / Album / Titre (probablement fiable),
             *  et on update les genres si on a plus d'infos que avant (plus riche probablement)
             *
             *  Todo:
             + Checker plus fin pour les genres (comparer la liste, et garder tous les tags, sans doublons
             */
            string emptyTag = string.Empty;

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

            PropertyInfo[] tagsProps = typeof(TagHandler).GetProperties();

            foreach (var propName in Enum.GetValues(typeof(PropertiesForUser)))
            {
                foreach (PropertyInfo p in tagsProps)
                {
                    if (propName.ToString() == p.Name)
                    {
                        // S'il le tag n'a pas changé, on ne fait rien.
                        if (p.GetValue(NewTags) != p.GetValue(AcrTags))
                        {
                            // Pour tous, on check si l'ancien est vide. Dans ce cas on overide le nouveau
                            if (p.GetValue(NewTags).ToString() == emptyTag)
                            {
                                p.SetValue(NewTags, p.GetValue(AcrTags));
                                compareTags.Add($"{p.GetValue(OriginalTags)} to {p.GetValue(AcrTags)}");
                            }
                            else
                            {
                                // Puis on gère les cas particuliers
                                switch (p.Name)
                                {
                                case "Genre":
                                    if (p.GetValue(NewTags).ToString().Length < p.GetValue(AcrTags).ToString().Length)
                                    {
                                        p.SetValue(NewTags, p.GetValue(AcrTags));
                                        compareTags.Add($"{p.GetValue(OriginalTags)} to {p.GetValue(AcrTags)}");
                                    }
                                    break;
                                }

                                if (p.Name != "Year")
                                {
                                    string s1 = p.GetValue(NewTags).ToString();
                                    string s2 = p.GetValue(AcrTags).ToString();

                                    if (s1 != s2)
                                    {
                                        float ratio = 1 - (float)Levenshtein.CalculateDistance(s1, s2, 1) / (float)s2.Length;

                                        if (ratio >= 0.75)
                                        {
                                            p.SetValue(NewTags, p.GetValue(AcrTags));
                                            compareTags.Add($"{p.GetValue(OriginalTags)} to {p.GetValue(AcrTags)}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            Logger.Instance.ArbitrateNewTagsLog(this, compareTags);
        }