java 查找英语单词相似度,用于单词匹配,法1

import java.math.BigDecimal;

/**
* 计算两个单词的差距
*/
public class EnglisOperate {

/\*\*
 \* 比较两个字符串的相识度
 \* 核心算法:用一个二维数组记录每个字符串是否相同,如果相同记为0,不相同记为1,每行每列相同个数累加
 \* 则数组最后一个数为不相同的总数,从而判断这两个字符的相识度
 \*/

private static int compare(String key, String target) {

    System.out.println("--------------------比较:"+key+"=="+target);

    int row = key.length();//循环目标
    int col = target.length();//key

    if (row == 0) {
        return 0;
    }
    if (col == 0) {
        return 0;
    }




    char col1; // key的
    char row1; // target的
    int temp; // 记录相同字符,在某个矩阵位置值的增量,

// abstract
// String key = “abundance”;
// String b = “abundant”;

    int samesums = 0;
    String sames = "";
    for (int i0 = 0; i0 < row; i0++) {// 遍历少的

        int tmp = 0;
        int samesum = 0;//计相同数
        String same = "";
        for (int i = i0; i < row; ) {// 遍历少的,一个个去找
            row1 = key.charAt(i);// 去匹配target

            boolean isfinde = false;
            for (int j = tmp; j < col; j++) {//循环多的,用少的在多的里来找
                col1 = target.charAt(j);
                if (row1 == col1) {//表字符相等
                    if(0 == tmp){//第一进来
                        tmp = j + 1;//当前在  tmp(0) + j   这个位置找到第一匹配的
                    }else if(j == tmp){//是上一个的下一个位置
                        tmp = j + 1;
                    }else if(j != tmp){//第二或三或四个位置没找到
                        break;
                    }

                    samesum++;
                    same += col1;
                    isfinde = true;
                    break;
                }
            }
            if (!isfinde) {//没找到
                break;
            }
            i++;
        }
        System.out.println("相同数:"+samesum+">"+same);

        if(samesums < samesum){
            samesums = samesum;
            sames = same;
        }

    }
    System.out.println("最终最大相同数:"+samesums+">"+sames);

    return samesums;
}

/\*\*
 \* 获取最小的值
 \*/
private static int min(int one, int two, int three) {
    return (one = one < two  one : two) < three  one : three;
}

/\*\*
 \* 获取两字符串的相似度
 \*/


public static double getSimilarityRatio(String key, String target) {
    int max = Math.max(key.length(), target.length());
    int sames = 0;
    if(key.length() < target.length()){
        sames = compare(key,target );//前少后多
    }else {
        sames = compare(target, key);
    }

// int keylen = target.length();
System.out.println(sames+“/”+max);
if(0 == sames){
return 0;
}
double f1 = new BigDecimal((float)sames/max).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// System.out.println(“ddd===”+f1);
return f1;
// return 0;
}

public static void main(String\[\] args) {

// abandon>>vt.离弃,丢弃;遗弃,抛弃;放弃
abdomen>>n.腹,下腹(胸部到腿部的部分)
abide>>vi.(abode,abided)(by)遵守;坚持
ability>>n.能力;本领;才能,才干;专门技能,天资
able>>a.有(能力、时间、知识等)做某事,有本事的
abnormal>>a.反常的,不正常的,不规则的
aboard>>ad.&prep.在船(飞机、车)上;ad.上船(飞机)
abolish>>vt.废除(法律、习惯等);取消
abound>>vi.大量存在;(in,with)充满,富于
about>>ad.在周围;大约 prep.关于;在周围 a.准备
above>>a.上述的 ad.在上面 prep.在…之上,高于
abroad>>ad.到国外,在国外;在传播,在流传
abrupt>>a.突然的,出其不意的;(行为等)粗鲁无礼的
absence>>n.缺乏,不存在;缺席,不在;缺席的时间
absent>>a.缺席的;缺乏的,不存在的;心不在焉的
absolute>>a.绝对的,完全的;确实的,肯定的
absorb>>vt.吸收(水、光、蒸汽等);使全神贯注
abstract>>a.抽象的 n.摘要,梗概 vt.提取;摘录要点
absurd>>a.荒谬的,荒诞的,荒唐可笑的;不合理的
abundance>>n.丰富,充裕,大量
abundant>>a.大量(充足)的;(in)丰富(富裕)的

    String key = "standpoint";
    String standard = "abandon";
    double dis = getSimilarityRatio(key, standard);
    System.out.println("相似度:" + dis);

    int max = Math.max(key.length(), standard.length());
    double keyrate = getdisRate(max);
    if(dis >= keyrate) {//相似度
        System.out.println("ok");
    }
}


public static double getdisRate(int stlen){
    //权重,越短,比较越高

// int stlen = standard.length();
double keyrate = 0.3;
switch (stlen){
case 2:
keyrate = 0.9;
break;
case 3:
keyrate = 0.6;
break;
case 4:
keyrate = 0.7;
break;
case 5:
case 6:
keyrate = 0.7;
break;
case 7:
case 8:
keyrate = 0.6;
break;
case 9:
case 10:
case 11:
keyrate = 0.5;
break;
case 12:
case 13:
case 14:
keyrate = 0.4;
break;
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
keyrate = 0.3;
break;
}
return keyrate;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值