JAVA相似字符串的聚类算法

---------研究证明说脏话确实可以提高忍耐力,和降低血压。详情可见,将手放入冰水中忍耐例子(百度||google)


将多个相似的字符串进行聚类,返回一个json

导相似度的包

(由于相似度非常重要,没有大神的功力,建议还是选择用我发的)

<dependency>
    <groupId>info.debatty</groupId>
    <artifactId>java-string-similarity</artifactId>
    <version>RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.31</version>
</dependency>

函数

参数说明:

list是你的字符串的集合

simNum是相似度的程度(0-1.0之间)

 public static String julei(List<String> list,double simNum){
        NormalizedLevenshtein l = new NormalizedLevenshtein();




        HashSet<String> set_source = new HashSet<>(list);
        HashSet<String> b_source=new HashSet<>(list);

        HashSet<String> set_temp =new HashSet<>(list);

        ArrayList<String> qu = new ArrayList<>();

        StringBuffer rs=new StringBuffer();


        for(String a1: set_source){
//            System.out.println(a1);

            if(qu.contains(a1)){//用于去掉source中的元素,防止下层循环不能清除上层循环,使用什么都不做的方式
                continue;
            }



            //下一个结束时,判定是否在字符串中,如果在,则直接下一个,不在,则拼接一个尾号;

                qu.add(a1);
                rs.append(a1);






//            System.out.println("--------");
            for(String b1:b_source){
//                System.out.println(b1);
                //相似度判定
                if(qu.contains(b1)){
                    continue;
                }
                if(l.similarity(a1,b1)>simNum){
                    System.out.println(a1+":"+b1+"=>"+l.similarity(a1,b1));
                    //相似度符合,则用符号拼接字符串
                    rs.append("=>"+b1);

                    qu.add(b1);
                }


            }

            //判定最后的字符串之前是不是为!--!,是则不加,否则则添加,前提条件rslength>4
            if(rs.length()>4){
                if(rs.substring(rs.length() - 4, rs.length()).equals("!--!")){

                }else{
                    rs.append("!--!");
                }
            }


        }

        String rs_str=rs.toString();
        System.out.println(rs_str);
        //去开头
        int delStrLength = "!--!".length();
        if (rs_str.startsWith("!--!")) {
            rs_str=rs_str.substring(delStrLength);
        }
        int delStrLength2 = "=>".length();
        if (rs_str.startsWith("=>")) {
            rs_str=rs_str.substring(delStrLength2);
        }
        //去结尾
        if(rs_str.endsWith("!--!")) {
            rs_str = rs_str.substring(0, rs_str.length() - 4);
        }
        //    gc垃圾回收

        System.out.println(rs_str);
        l=null;

        JSONArray jsonArray = new JSONArray();

        for(String  r:rs_str.split("!--!")){


            String[] simArr = r.split("=>");


            jsonArray.add(simArr);

        }

        return jsonArray.toJSONString();
    }

结果:

DEMO测试

    public static void main(String[] args) {


        String arr="hibernate-osgi!--!hibernate5-infinispan!--!hibernate4-core!--!hibernate5-entitymanager!--!hibernate!--!hibernate-infinispan!--!hibernate4-proxool!--!hibernate-hikaricp!--!hibernate5-java8!--!hibernate-envers!--!hibernate5-ehcache!--!hibernate4-ehcache!--!hibernate5-osgi!--!mirrors/hibernate!--!hibernate-core!--!hibernate-c3p0!--!hibernate5-envers!--!hibernate4-infinispan!--!hibernate5-proxool!--!hibernate-entitymanager!--!hibernate4-c3p0!--!hibernate5-parent!--!hibernate5-core!--!hibernate4-testing!--!hibernate/hibernate-orm";
        String[] split = arr.split("!--!");
        List<String> split_set = (List<String>) Arrays.asList(split);

        String julei = julei(split_set,0.5);
        System.out.println(julei);


        }

Guess you like

Origin blog.csdn.net/qq_38403590/article/details/120493439