Since I am writing lots of Vector Space implementations in Go, Python etc… I thought I would add another one in C#. This one is a little more verbose then either the Python or Go implementations. The verbosity is mostly due to not using any of the nice C# LINQ functionality which would really reduce the size.
In any case here it is in case you are looking for a simple implementation of this useful class.
class Program
{
static void Main(string[] args)
{
var v = new VectorCompare();
var con1 = v.Concordance("this is a test");
var con2 = v.Concordance("this is another test");
var t = v.Relation(con1, con2);
Console.WriteLine(t);
Console.ReadLine();
}
}
public class VectorCompare
{
public double Magnitude(Dictionary<string, int> con)
{
Double total = 0;
foreach (var t in con)
{
total += Math.Pow(Convert.ToDouble(t.Value), 2);
}
return Math.Sqrt(total);
}
public double Relation(Dictionary<string, int> con1, Dictionary<string, int> con2)
{
var relevance = 0;
var topvalue = 0;
foreach(var t in con1)
{
if(con2.ContainsKey(t.Key))
{
topvalue += t.Value * con2[t.Key];
}
}
var mag = Magnitude(con1) * Magnitude(con2);
if(mag != 0)
{
return topvalue / mag;
}
return 0;
}
public Dictionary<string, int> Concordance(string document)
{
var con = new Dictionary<string, int>();
foreach (var word in document.ToLower().Trim().Split(' '))
{
if (!string.IsNullOrWhiteSpace(word))
{
if (con.ContainsKey(word))
{
con[word] = con[word] + 1;
}
else
{
con[word] = 1;
}
}
}
return con;
}
}