当前位置: 移动技术网 > IT编程>开发语言>c# > 关键词匹配优化(第2篇)—— 用C#实现demo

关键词匹配优化(第2篇)—— 用C#实现demo

2020年04月14日  | 移动技术网IT编程  | 我要评论
上一篇文章用python实现了计算文本相似度计算的过程,这次用C 做个demo。 不得不说用python是真的方便,不懂计算过程也能实现结果。C 也有类似NumPy的库: "NumSharp" 。经过测试还是有区别的,有些功能没有(也可能是因为我没看文档)。最后还是自己研究计算过程去写。 用C 写E ...

上一篇文章用python实现了计算文本相似度计算的过程,这次用c#做个demo。

不得不说用python是真的方便,不懂计算过程也能实现结果。c#也有类似numpy的库:numsharp。经过测试还是有区别的,有些功能没有(也可能是因为我没看文档)。最后还是自己研究计算过程去写。

用c#写excel公式有两种开发方式:vsto和exceldna。看了一下vsto的部署感觉比较麻烦,所以这里用exceldna的方式。

求两个词向量的余弦相似度的c#代码如下

        /// <summary>
        /// 求余弦相似度,输入两个只有1行且列数相同的二维数组
        /// </summary>
        /// <param name="vector_a">向量a</param>
        /// <param name="vector_b">向量b</param>
        /// <returns>返回两个向量的余弦相似度</returns>
        public static double cos_sim(int[,] vector_a, int[,] vector_b)
        {
            double num = 0;
            //计算向量a和 向量b转置 的乘积
            //python中的:float(vector_a * vector_b.t)
            for(int i = 0; i < vector_a.getlength(1); i++)
            {
                num += vector_a[0, i] * vector_b[0, i];
            }
            
            double denom =  norm(vector_a) * norm(vector_b);
            double sim = num / denom;
            return sim;
        }

        /// <summary>
        /// 求向量范数,输入一个只有1行的二维数组
        /// </summary>
        /// <param name="vector">输入的向量</param>
        /// <returns>返回向量的范数</returns>
        //类似numpy中的np.linalg.norm
        public static double norm(int[,] vector)
        {
            double sumi = 0;
            foreach(int i in vector)
            {
                sumi += i * i;
            }

            return math.sqrt(sumi);
        }

这个只是初步实现了余弦相似度计算,还有优化的空间。比如这里输入的向量是一行的二维数组,改成用一维数组或者list都可以,类型也可以不用int改成double。

输入的部分先用excel选区输入,后面会改到数据库中,实现效果如下:

返回的字符串后面跟的数字是两个词的相似度,后续删掉即可。

前面的单元格区域“测试!a1:jh154”是目标关键词和向量,之后会把这部分去掉,整理一下存储到数据库中。按照目前的one-hot编码,后续增加关键词时直接给每个关键词后加一个值是0的维度即可,如果改成tf-idf编码,就需要在增加关键词后重新计算向量了。不过怎么说也比维护100多个elseif要方便,后续优化还可以把拆分字换成分词,减少计算量,提高准确度。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网