余弧相似度

maven 引入jar包pom文件


        
            org.apdplat
            word
            1.2
        

 

java代码

import java.util.ArrayList;
import java.util.List;
import org.apdplat.word.WordSegmenter;
import org.apdplat.word.segmentation.SegmentationAlgorithm;
import org.apdplat.word.segmentation.Word;
import org.slf4j.Logger;

public class CompareStrSimPercentUtil {
    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(CompareStrSimPercentUtil.class);
//    正向最大匹配算法:MaximumMatching
//    逆向最大匹配算法:ReverseMaximumMatching
//    正向最小匹配算法:MinimumMatching
//    逆向最小匹配算法:ReverseMinimumMatching
//    双向最大匹配算法:BidirectionalMaximumMatching
//    双向最小匹配算法:BidirectionalMinimumMatching
//    双向最大最小匹配算法:BidirectionalMaximumMinimumMatching
//    全切分算法:FullSegmentation
//    最少分词算法:MinimalWordCount
//    最大Ngram分值算法:MaxNgramScore
    private static final String WORD_SEGMENTATION_ALGORITHM = "全切分算法";
    /**
     * word分词
     * @param text
     * @return
     */
    public static List segMore(String text) {
        List wordList = null;
        for(SegmentationAlgorithm segmentationAlgorithm : SegmentationAlgorithm.values()){
            if(segmentationAlgorithm.getDes().equals(WORD_SEGMENTATION_ALGORITHM)) {
                wordList = seg(text, segmentationAlgorithm);
                break;
            }
        }
        return wordList;
    }
    //获取全量算法后分词数据
//    public static Map segMore(String text) {
//        Map map = new HashMap<>();
//        for(SegmentationAlgorithm segmentationAlgorithm : SegmentationAlgorithm.values()){
//            map.put(segmentationAlgorithm.getDes(), seg(text, segmentationAlgorithm));
//        }
//        return map;
//    }
    private static List seg(String text, SegmentationAlgorithm segmentationAlgorithm) {
        List wordList = new ArrayList();
        for(Word word : WordSegmenter.segWithStopWords(text, segmentationAlgorithm)){
            wordList.add(word.getText());
        }
        return wordList;
    }
    
    /**
     * 余弧相似度
     *                                  x1 * x2      +     y1 * y2
     *     公式 cosθ =     ___________________________________________
     *                         _______________           __________________
     *                    √  x1²  +  x2²       *    √  y1²    +    y2²   
     * @param a
     * @param b
     * @return
     */
    public static double sim(String [] sourcesArray, String [] targetArray) {
        String[] result=new String[sourcesArray.length+targetArray.length]; 
        for(int i=0;i             result[i]=sourcesArray[i];
        }
        for(int k=0;k             result[sourcesArray.length+k]=targetArray[k];
        }
        List list = new ArrayList();
        for(int i=0;i             if(!list.contains(result[i])){
                list.add(result[i]);    
            }
        }
        String[] newStr = list.toArray(new String[1]); 
        int[] vectorSource=returnA(newStr,sourcesArray);
        int[] vectorTarget=returnA(newStr,targetArray);
        int m=0;
        int num1=0;
        int num2=0;
        for(int i=0;i             //计算: x1 * x2      +     y1 * y2
            m+=vectorSource[i]*vectorTarget[i];
            // 计算:x1²  +  x2²
            num1+=(vectorSource[i])*(vectorSource[i]);
            //计算: y1²    +    y2²
            num2+=(vectorTarget[i])*(vectorTarget[i]);
        }
        logger.info("m:"+m);
        logger.info("num1:"+num1);
        logger.info("num2:"+num2);
        //    计算:    ______________
        //              √  x1²  +  x2²   
        double realN1 = Math.sqrt(num1);
        //        计算:    ______________
        //                  √  y1²  +  y2²   
        double realN2 = Math.sqrt(num2);
        //向量余弦公式
        double resultValue = m/(realN1*realN2);
        return resultValue;
    }
    /**
     * 字符串数组转向量
     * 计算词频
     * @param newStr
     * @param a
     * @return
     */
    public static int[] returnA(String[] newStr, String[] a) {
        int[] mew_a = new int[newStr.length];
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < newStr.length; i++) {
            int cou = 0;// 各个元素出现的次数,顺序是按照 合并后数组中的字母顺序
            for (int j = 0; j < a.length; j++) {
                if (a[j].equals(newStr[i])) {
                    cou++;
                }
            }
            mew_a[i] = cou;
            sb.append(cou + ",");
        }
        logger.info(sb.toString());
        return mew_a;
    }
//    public static void main(String[] args) {
//        // 余弧相似度
//        List sourceList = segMore("这只皮靴号码大了。那只号码合适");
//        List targetList = segMore("这只皮靴号码不小,那只更合适");
//        String [] sourcelist = sourceList.toArray(new String[1]); 
//        String [] targetlist = targetList.toArray(new String[1]); 
//        double result = sim(sourcelist, targetlist);
//        System.out.println(result);
//    }
}
 

你可能感兴趣的:(余弧相似度)