private static List <TreePatternMatches> FindIdiomsInTrees(IEnumerable <ICommonTree> treeCollection) { Stopwatch watch = Stopwatch.StartNew(); var treeCollector = FindFrequentSubtrees(treeCollection, IdiomProviderConfig.GetDefaultConfig().MinSupportPercentage); Debug.WriteLine($"\n\nFound frequent trees from {treeCollection.Count()} trees in {watch.ElapsedMilliseconds} milliseconds"); Debug.WriteLine($"There are {treeCollector.ClosedTrees.Count} closed trees\n and {treeCollector.MaximalTrees.Count} maximal trees"); Debug.WriteLine("\n\n\n*** MERGING CLOSED TREES ***"); var closedTrees = CanonicalizeFrequentTrees(treeCollector.ClosedTrees).ToList(); Debug.WriteLine("\n\n\n*** MERGING MAXIMAL TREES ***"); var maximalTrees = CanonicalizeFrequentTrees(treeCollector.MaximalTrees).ToList(); Debug.WriteLine($"After merging, there are {closedTrees.Count} closed trees\n and {maximalTrees.Count} maximal trees"); closedTrees = SubsumeFrequentTrees(closedTrees); maximalTrees = SubsumeFrequentTrees(maximalTrees); Debug.WriteLine($"After subsumption, there are {closedTrees.Count} closed trees\n and {maximalTrees.Count} maximal trees"); var orderedSubsumedMaximalTrees = maximalTrees.OrderByDescending(tup => tup.AllMatchLocations.Count()).ToList(); // var mergedIdiomPatterns = MergeFrequentIdiomTrees(orderedSubsumedMaximalTrees); // Debug.WriteLine($"\n\ndone with frequent trees in {watch.ElapsedMilliseconds} milliseconds"); // return mergedIdiomPatterns; return(orderedSubsumedMaximalTrees); }
private static TreeCollector FindFrequentSubtrees(IEnumerable <ICommonTree> treeCollection, int minSupportPercentage) { Func <ICommonTree, bool> idiomFilter = (ICommonTree x) => true; var treeConverter = new TreeConverter(); List <TextTree> textTrees = treeCollection.Select(tree => treeConverter.ConvertToCMOrderedTreeMinerTree(tree)).ToList(); var main = new Main(); main.Support = (int)((minSupportPercentage / 100.0) * textTrees.Count()); main.Support = Math.Max(main.Support, IdiomProviderConfig.GetDefaultConfig().MinSupportCount); Debug.WriteLine($"Minimum Support is {main.Support}"); var treeCollector = new TreeCollector(); treeCollector.TreeFilter = idiomFilter; main.Run(textTrees, treeCollector); return(treeCollector); }