• 余弦相似度


    引自:http://hi.baidu.com/zzpppork/blog/item/c1c79cfadbfe0a6e034f5683.html

    在向量空间模型中,文本泛指各种机器可读的记录。用D(Document)表示,特征项(Term,用t表示)是指出现在文档D中且能够代表该文档内容的基本语言单位,主要是由词或者短语构成,文本可以用特征项集表示为D(T1,T2,…,Tn),其中Tk是特征项,1<=k<=N。例如一篇文档中有a、b、c、d四个特征项,那么这篇文档就可以表示为D(a,b,c,d)。对含有n个特征项的文本而言,通常会给每个特征项赋予一定的权重表示其重要程度。即D=D(T1,W1;T2,W2;…,Tn,Wn),简记为D=D(W1,W2,…,Wn),我们把它叫做文本D的向量表示。其中Wk是Tk的权重,1<=k<=N。在上面那个例子中,假设a、b、c、d的权重分别为30,20,20,10,那么该文本的向量表示为D(30,20,20,10)。在向量空间模型中,两个文本D1和D2之间的内容相关度Sim(D1,D2)常用向量之间夹角的余弦值表示,公式为:

    其中,W1k、W2k分别表示文本D1和D2第K个特征项的权值,1<=k<=N。
    在自动归类中,我们可以利用类似的方法来计算待归类文档和某类目的相关度。例如文本D1的特征项为a,b,c,d,权值分别为30,20,20,10,类目C1的特征项为a,c,d,e,权值分别为40,30,20,10,则D1的向量表示为D1(30,20,20,10,0),C1的向量表示为C1(40,0,30,20,10),则根据上式计算出来的文本D1与类目C1相关度是0.86
    那个相关度0.86是怎么算出来的?

    是这样的,抛开你的前面的赘述
    在数学当中,n维向量是 V{v1, v2, v3, ..., vn}
    他的模: |v| = sqrt ( v1*v1 + v2*v2 + ... + vn*vn )
    两个向量的点击 m*n = n1*m1 + n2*m2 + ...... + nn*mn
    相似度 = (m*n) /(|m|*|n|)
    物理意义就是两个向量的空间夹角的余弦数值
    对于你的例子
    d1*c1 = 30*40 + 20*0 + 20*30 + 10*20 + 0*10 = 2000
    |d1| = sqrt(30*30 +20*20 + 20*20 + 10*10 + 0*0) = sqrt(1800)
    |c1| = sqrt(40*40 + 0*0 + 30*30 + 20*20 + 10*10) = sqrt(3000)
    相似度 = d1*c1/(|d1|*|c1|)= 2000/sqrt(1800*3000)= 0.86066

     

     

    JAVA版本

    引自: http://hlzhou.iteye.com/blog/687345

    package hlzhou;

    import java.util.ArrayList;
    import java.util.List;

    public class ComputerDecision {

        List<Integer> vector1 = new ArrayList<Integer>();
        List<Integer> vector2 = new ArrayList<Integer>();

        public ComputerDecision(String string1, String string2) {
            //把输入字符串中多个空格变为一个
            String[] vector1String = string1.trim().replaceAll("\\s+", " ").split(" ");
            String[] vector2String = string2.trim().replaceAll("\\s+", " ").split(" ");

            for (String string : vector1String) {
                vector1.add(Integer.parseInt(string));
            }
            for (String string : vector2String) {
                vector2.add(Integer.parseInt(string));
            }
        }

        // 求余弦相似度
        public double sim() {
            double result = 0;
            result = pointMulti(vector1, vector2) / sqrtMulti(vector1, vector2);

            return result;
        }

        private double sqrtMulti(List<Integer> vector1, List<Integer> vector2) {
            double result = 0;
            result = squares(vector1) * squares(vector2);
            result = Math.sqrt(result);
            return result;
        }

        // 求平方和
        private double squares(List<Integer> vector) {
            double result = 0;
            for (Integer integer : vector) {
                result += integer * integer;
            }
            return result;
        }

        // 点乘法
        private double pointMulti(List<Integer> vector1, List<Integer> vector2) {
            double result = 0;
            for (int i = 0; i < vector1.size(); i++) {
                result += vector1.get(i) * vector2.get(i);
            }
            return result;
        }
       
        public static void main(String[] args) {

            String string = "0 0 1 1 1 1 1 1  0 0 0 0 0 0 0 0 1 1 1 0 0 0";
            String string2 = "0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0";
            ComputerDecision computerDecition = new ComputerDecision(string,
                    string2);
            System.out.println(computerDecition.sim());
        }
    }

    上面来源于网络,已标明出处,。

    C# 版本就可以略了,替换 java 版本中相应关键字即可。

  • 相关阅读:
    Java后端WebSocket的Tomcat实现
    Shiro session和Spring session一样吗?
    HTTP请求类
    JSP页面中的时间显示问题
    Oracle在linux中相关设置操作
    关于BigDecimal类型在jsp页面中进行除法运算问题
    Spring与Redis的实现
    gson介绍
    busybox介绍
    vsftp中426 Failure writing network stream的错误解决
  • 原文地址:https://www.cnblogs.com/zbw911/p/2252934.html
Copyright © 2020-2023  润新知