public SimilaritiesReport FindForIncident(int incidentId)
        {
            using (var cmd = _uow.CreateCommand())
            {
                cmd.CommandText =
                    @"select Id, Name, Properties from IncidentContextCollections 
                            where IncidentId = @incidentId";
                cmd.AddParameter("incidentId", incidentId);

                var collections = new List <SimilarityCollection>();

                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var json       = (string)reader["Properties"];
                        var properties = CoderrDtoSerializer.Deserialize <ContextCollectionPropertyDbEntity[]>(json);
                        var col        = new SimilarityCollection(incidentId, reader.GetString(1));
                        col.GetType().GetProperty("Id").SetValue(col, reader.GetInt32(0));
                        foreach (var entity in properties)
                        {
                            var prop = new Similarity(entity.Name);
                            prop.LoadValues(
                                entity.Values.Select(x => new SimilarityValue(x.Value, x.Percentage, x.Count)).ToArray());
                            col.Properties.Add(prop);
                        }
                        collections.Add(col);
                    }
                }

                return(collections.Count == 0 ? null : new SimilaritiesReport(incidentId, collections));
            }
        }
Exemple #2
0
        public static Dictionary <List <HtmlNode>, double> GetSimilarTrees(HtmlNode rootNode, int level, double minSimilarity = 0.5)
        {
            var groups        = new List <SimilarityCollection>();
            var lastNodeTrees = HtmlHelpers.GetMaxDepthNodes(rootNode, level)
                                .Select(GenerateTree);

            foreach (var nodeTree in lastNodeTrees)
            {
                var found = false;

                foreach (var group in groups)
                {
                    var c = nodeTree.CompareTrees(group.Value[0]);

                    if (c < minSimilarity)
                    {
                        continue;
                    }

                    group.Value.Add(nodeTree);
                    group.SumSimilarity += c;
                    found = true;
                }

                if (found)
                {
                    continue;
                }

                var newPair = new SimilarityCollection();
                newPair.Value.Add(nodeTree);
                groups.Add(newPair);
            }

            return(groups
                   .Where(p => p.Value.Count > 1)
                   .ToDictionary(
                       pair => pair.Value.Select(x => x.OrigNode).ToList(),
                       pair => pair.Average
                       ));
        }