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)); } }
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 )); }