using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LDA.LdaModel
{
    public static class TopicSimilarityCos
    {
        public static double SimilarityCos(List<string> lstr1, List<string> lstr2)
        {          
            //List<string> lstr1 = new List<string>();
            //lstr1.Add("稀疏");
            //lstr1.Add("信号");
            //lstr1.Add("算法");
            //lstr1.Add("方法");
            //lstr1.Add("轴承");
            //lstr1.Add("故障");
            //lstr1.Add("贝叶斯");
            //lstr1.Add("模型");
            //lstr1.Add("发动机");
            //lstr1.Add("降低");
            //List<string> lstr2 = new List<string>();
            //lstr2.Add("测量");
            //lstr2.Add("发动机");
            //lstr2.Add("叶尖");
            //lstr2.Add("间隙");
            //lstr2.Add("性能");
            //lstr2.Add("控制");
            //lstr2.Add("微波");
            //lstr2.Add("叶片");
            //lstr2.Add("降低");
            //lstr2.Add("自主");

            //求并集
            var strUnion = lstr1.Union(lstr2);
            //求向量
            List<int> int1 = new List<int>();
            List<int> int2 = new List<int>();
            foreach (var item in strUnion)
            {
                //加概率
                int1.Add(lstr1.Count(o => o == item));
                int2.Add(lstr2.Count(o => o == item));
            }

            double s = 0;
            double den1 = 0;
            double den2 = 0;
            for (int i = 0; i < int1.Count(); i++)
            {
                
                //求分子
                s += int1[i] * int2[i];
                //求分母（1）
                den1 += Math.Pow(int1[i], 2);
                //求分母（2）
                den2 += Math.Pow(int2[i], 2);
            }
            //Console.WriteLine(cos);
            return s / (Math.Sqrt(den1) * Math.Sqrt(den2));
        }
    }
}
