Click here to Skip to main content
15,891,253 members
Articles / Desktop Programming / WPF

Document Clustering with Non Negative Matrix Factorization

Rate me:
Please Sign up or sign in to vote.
4.40/5 (5 votes)
20 Feb 2017MIT3 min read 45.2K   1.3K   20  
A WPF application that uses Non Negative Matrix Factorization to cluster documents.
using NNMFSearchResultClustering.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace NNMFSearchResultClustering
{
	/// <summary>
	/// Interaction logic for Result.xaml
	/// </summary>
	public partial class Result : Border
	{
        readonly AAAIDocument _document;

        public Result(AAAIDocument document, Color[] colourList)
		{
            _document = document;
			InitializeComponent();

            float topWeight = document.ClusterMembership.Max();
			for(int i = 0; i < document.ClusterMembership.Length; i++) {
				RectangleGeometry rect = new RectangleGeometry(new Rect(0, 0, 16, 16), 4, 4);
				Path path = new Path();
				path.Fill = new SolidColorBrush(colourList[i%colourList.GetLength(0)]);
				path.Margin = new Thickness(0, 0, 2, 2);
				path.Stroke = Brushes.DimGray;
				path.StrokeThickness = 1;
				path.Data = rect;
				path.Opacity = document.ClusterMembership[i] / topWeight;
				path.SnapsToDevicePixels = true;
				topPanel.Children.Insert(0, path);
			}

			titleTextBlock.Text = document.Title;
            textTextBlock.Text = String.Join(", ", document.Group);
            urlTextBlock.Text = document.Abstract;

            this.MouseDown += delegate (object sender, MouseButtonEventArgs e) {
                if (Clicked != null)
                    Clicked(this, document.Title);
            };
        }

        public AAAIDocument Document { get { return _document; } }

        public delegate void ClickedDelegate(object sender, string query);
		public event ClickedDelegate Clicked;

	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Founder Ice Blue Digital
Australia Australia
I am the founder of Ice Blue Digital - a Sydney based software company in the natural language processing and machine learning space.

Comments and Discussions