精华内容
下载资源
问答
  • Java字符串相似度 一个实现不同字符串相似度和距离度量的库。 当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 ...
  • java字符串相似度算法

    2021-02-28 07:51:26
    本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:public class Levenshtein {private int compare(String str, String target) {int d[][]; // 矩阵int n = str.length();int m = ...

    本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:

    public class Levenshtein {

    private int compare(String str, String target) {

    int d[][]; // 矩阵

    int n = str.length();

    int m = target.length();

    int i; // 遍历str的

    int j; // 遍历target的

    char ch1; // str的

    char ch2; // target的

    int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1

    if (n == 0) {

    return m;

    }

    if (m == 0) {

    return n;

    }

    d = new int[n + 1][m + 1];

    for (i = 0; i <= n; i++) { // 初始化第一列

    d[i][0] = i;

    }

    for (j = 0; j <= m; j++) { // 初始化第一行

    d[0][j] = j;

    }

    for (i = 1; i <= n; i++) { // 遍历str

    ch1 = str.charAt(i - 1);

    // 去匹配target

    for (j = 1; j <= m; j++) {

    ch2 = target.charAt(j - 1);

    if (ch1 == ch2) {

    temp = 0;

    } else {

    temp = 1;

    }

    // 左边+1,上边+1, 左上角+temp取最小

    d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);

    }

    }

    return d[n][m];

    }

    private int min(int one, int two, int three) {

    return (one = one < two ? one : two) < three ? one : three;

    }

    /**

    * 获取两字符串的相似度

    *

    * @param str

    * @param target

    *

    * @return

    */

    public float getSimilarityRatio(String str, String target) {

    return 1 - (float) compare(str, target) / Math.max(str.length(), target.length());

    }

    public static void main(String[] args) {

    Levenshtein lt = new Levenshtein();

    String str = "ab";

    String target = "ac";

    System.out.println("similarityRatio=" + lt.getSimilarityRatio(str, target));

    }

    }

    希望本文所述对大家的Java程序设计有所帮助。

    展开全文
  • 字符串相似度比对JAVA

    2016-10-22 18:09:06
    就是一个简单的字符串相似度比较的方法,暂时还不知道有没有更好的方法,大家先看看,有更好的希望分享一下
  • Java字符串相似度匹配

    万次阅读 2018-11-16 00:30:31
    //要比较的两个字符串 String str1 = "鞋子不能在实体店买"; String str2 = "不能在实体店买鞋子"; levenshtein(str1.toLowerCase(),str2.toLowerCase()); } /** * * @param str1 * @param str2 */ ...

    原文:http://wdhdmx.iteye.com/blog/1343856#bc2319361

    package com.xfl.boot.common.utils;
    
    /**
     * Created by XFL
     * time on 2018/11/16 0:10
     * description:
     */
    public class SimilarityUtils {
        public static void main(String[] args) {
            //要比较的两个字符串
            String str1 = "鞋子不能在实体店买";
            String str2 = "不能在实体店买鞋子";
            levenshtein(str1.toLowerCase(),str2.toLowerCase());
        }
    
        /**
         *
         * @param str1
         * @param str2
         */
        public static void levenshtein(String str1,String str2) {
            //计算两个字符串的长度。
            int len1 = str1.length();
            int len2 = str2.length();
            //建立上面说的数组,比字符长度大一个空间
            int[][] dif = new int[len1 + 1][len2 + 1];
            //赋初值,步骤B。
            for (int a = 0; a <= len1; a++) {
                dif[a][0] = a;
            }
            for (int a = 0; a <= len2; a++) {
                dif[0][a] = a;
            }
            //计算两个字符是否一样,计算左上的值
            int temp;
            for (int i = 1; i <= len1; i++) {
                for (int j = 1; j <= len2; j++) {
                    if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                        temp = 0;
                    } else {
                        temp = 1;
                    }
                    //取三个值中最小的
                    dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
                            dif[i - 1][j] + 1);
                }
            }
            System.out.println("字符串\""+str1+"\"与\""+str2+"\"的比较");
            //取数组右下角的值,同样不同位置代表不同字符串的比较
            System.out.println("差异步骤:"+dif[len1][len2]);
            //计算相似度
            float similarity =1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());
            System.out.println("相似度:"+similarity);
        }
    
        //得到最小值
        private static int min(int... is) {
            int min = Integer.MAX_VALUE;
            for (int i : is) {
                if (min > i) {
                    min = i;
                }
            }
            return min;
        }
    }
    
    

    在这里插入图片描述

    展开全文
  • java字符串相似度算法本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:public class Levenshtein {private int compare(String str, String target) {int d[][]; // 矩阵int n = str....

    java字符串相似度算法

    本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:

    public class Levenshtein {

    private int compare(String str, String target) {

    int d[][]; // 矩阵

    int n = str.length();

    int m = target.length();

    int i; // 遍历str的

    int j; // 遍历target的

    char ch1; // str的

    char ch2; // target的

    int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1

    if (n == 0) {

    return m;

    }

    if (m == 0) {

    return n;

    }

    d = new int[n + 1][m + 1];

    for (i = 0; i <= n; i++) { // 初始化第一列

    d[i][0] = i;

    }

    for (j = 0; j <= m; j++) { // 初始化第一行

    d[0][j] = j;

    }

    for (i = 1; i <= n; i++) { // 遍历str

    ch1 = str.charAt(i - 1);

    // 去匹配target

    for (j = 1; j <= m; j++) {

    ch2 = target.charAt(j - 1);

    if (ch1 == ch2) {

    temp = 0;

    } else {

    temp = 1;

    }

    // 左边+1,上边+1, 左上角+temp取最小

    d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);

    }

    }

    return d[n][m];

    }

    private int min(int one, int two, int three) {

    return (one = one < two ? one : two) < three ? one : three;

    }

    /**

    * 获取两字符串的相似度

    *

    * @param str

    * @param target

    *

    * @return

    */

    public float getSimilarityRatio(String str, String target) {

    return 1 - (float) compare(str, target) / Math.max(str.length(), target.length());

    }

    public static void main(String[] args) {

    Levenshtein lt = new Levenshtein();

    String str = "ab";

    String target = "ac";

    System.out.println("similarityRatio=" + lt.getSimilarityRatio(str, target));

    }

    }

    希望本文所述对大家的Java程序设计有所帮助。相关阅读:

    基于jsp:included的使用与jsp:param乱码的解决方法

    Win10如何收费?Win10免费升级不限时

    Win10一周年更新最新预览版14393.50曝光 7月29日编译完成

    MySQL中给自定义的字段查询结果添加排名的方法

    深入HTTP响应状态码速查表的详解

    js 日期比较相关天数代码

    Win10 build 10240右键菜单中新建项的二级菜单太多了怎么解决?

    Win7系统如何多添加一个磁盘分区?Win7系统多添加一个磁盘分区的方法

    win7旗舰版扩充硬盘容量四点注意事项

    CentOS系统下访问NTFS分区的简单方法

    浅谈JavaScript中变量和函数声明的提升

    JAVASCRIPT代码编写俄罗斯方块网页版

    window.location.hash知识汇总

    Win10 重大更新TH2版10586.63曝光 或通过累积补丁更新

    展开全文
  • } /** * 获取两字符串相似度 */ public static float getSimilarityRatio(String str, String target) { // 1-莱茵斯坦距离/最大字符串长度 return 1 - (float) levenshiteinDistance(str, target) / Math.max...

    package com.miaodi.api.util;

    public class SimilarityRatioUtils {

    /**

    * 莱茵斯坦距离

    *

    * @param str

    * @param target

    * @return

    */

    public static int levenshiteinDistance(String str, String target) {

    int s = str.length();

    int t = target.length();

    if (s == 0) {

    return t;

    }

    if (t == 0) {

    return s;

    }

    int d[][];

    int si;

    int tj;

    char strChar;

    char tagetChar;

    int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1

    d = new int[s + 1][t + 1];

    for (si = 0; si <= s; si++) {// 初始化第一列

    d[si][0] = si;

    }

    for (si = 1; si <= s; si++) {// 遍历str

    strChar = str.charAt(si - 1);

    for (tj = 1; tj <= t; tj++) {

    tagetChar = target.charAt(tj - 1);

    /*

    * 忽略大小写 if (strChar == tagetChar || strChar == tagetChar + 32 || strChar + 32

    * == tagetChar) {

    */

    if (strChar == tagetChar) {

    temp = 0;

    } else {

    temp = 1;

    }

    d[si][tj] = min(d[si - 1][tj] + 1, d[si][tj - 1] + 1, d[si - 1][tj - 1] + temp);

    }

    }

    return d[s][t];

    }

    private static int min(int one, int two, int three) {

    return (one = one < two ? one : two) < three ? one : three;

    }

    /**

    * 获取两字符串的相似度

    */

    public static float getSimilarityRatio(String str, String target) {

    // 1-莱茵斯坦距离/最大字符串长度

    return 1 - (float) levenshiteinDistance(str, target) / Math.max(str.length(), target.length());

    }

    }

    package com.miaodi.api.handler;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.concurrent.Callable;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Future;

    /**

    * 模板提取

    * @author Administrator

    *

    */

    public class TemplateDistill implements Callable{

    public TemplateDistill(String source, String target, List> futures, ExecutorService pool, int startSourceIDX,int startTargetIDX, boolean lastIsPlaceholder,String templatePrefix,int variableNum) {

    super();

    this.source = source;

    this.target = target;

    this.futures = futures;

    this.pool = pool;

    this.startSourceIDX = startSourceIDX;

    this.startTargetIDX = startTargetIDX;

    this.lastIsPlaceholder = lastIsPlaceholder;

    this.templatePrefix = templatePrefix == null ? "":templatePrefix;

    this.variableNum = variableNum;

    }

    private String templatePrefix;

    private final int maxVariableNum = 3;

    private int variableNum;

    private int startSourceIDX;

    private int startTargetIDX;

    private boolean lastIsPlaceholder;

    private final String source;

    private final String target;

    private final List> futures;

    private final ExecutorService pool;

    @SuppressWarnings("unchecked")

    public String call() throws Exception {

    StringBuilder template = new StringBuilder(templatePrefix);

    while (true) {

    // 获取最大连击数

    Map result = carom(source, target, startSourceIDX, startTargetIDX);

    int maxCaromNum = (Integer) result.get("caromNum");

    if (maxCaromNum == 0) {

    if(!lastIsPlaceholder) {

    variableNum += 1;

    if (variableNum > maxVariableNum) {

    return null;

    }

    template.append("|");

    lastIsPlaceholder = true;

    }

    if (result.get("otherTargetIndexs") != null) {

    // 开启多线程找模板

    List otherTargetIndexs = (List) result.get("otherTargetIndexs");

    for (Integer otherTargetIndex : otherTargetIndexs) {

    futures.add(pool.submit(new TemplateDistill(source, target, futures, pool, startSourceIDX, otherTargetIndex, lastIsPlaceholder,template.toString(), variableNum)));

    }

    }

    startSourceIDX += 1;

    }else{

    template.append(source.substring(startSourceIDX, startSourceIDX + maxCaromNum));

    startSourceIDX += maxCaromNum;

    startTargetIDX += maxCaromNum;

    lastIsPlaceholder = false;;

    }

    if (source.length() <= startSourceIDX) {

    if (!lastIsPlaceholder && target.length() > startTargetIDX) {

    variableNum += 1;

    if (variableNum > maxVariableNum) {

    return null;

    }

    template.append("|");

    }

    break;

    }

    if (target.length() <= startTargetIDX) {

    if(!lastIsPlaceholder) {

    variableNum += 1;

    if (variableNum > maxVariableNum) {

    return null;

    }

    template.append("|");

    }

    break;

    }

    }

    return template.toString();

    }

    /**

    * 获取连击数

    * @param source 字符串s

    * @param target 字符串t

    * @param startSourceIDX 字符串s从什么下标开始匹配

    * @param startTargetIDX 字符串t从什么下标开始匹配

    * @return

    */

    @SuppressWarnings({ "rawtypes", "unchecked" })

    private static Map carom(String source,String target,Integer startSourceIDX,Integer startTargetIDX){

    // 连击次数

    int attemptCaromNum = 0;

    while(true) {

    // 每次累加1,最后减1

    attemptCaromNum += 1;

    // 本次匹配的子串的结束下标

    int endSourceIDX = startSourceIDX + attemptCaromNum;

    if (endSourceIDX > source.length()) {

    break;

    }

    // 本次匹配的子串

    String attemptStr = source.substring(startSourceIDX, endSourceIDX);

    int idx = target.indexOf(attemptStr, startTargetIDX);

    // 匹配失败

    if (idx != startTargetIDX) {

    break;

    }

    }

    attemptCaromNum -= 1;

    // 结果

    Map result = new HashMap();

    result.put("caromNum", attemptCaromNum);

    // 匹配失败时

    if (attemptCaromNum == 0) {

    // 单纯的一个字符

    int endStrIDX = startSourceIDX + 1;

    if (endStrIDX <= source.length()) {

    // 匹配他失败后的字符

    List otherTargetIndexs = new ArrayList();

    char c = source.charAt(startSourceIDX);

    char[] cs = target.substring(startTargetIDX+1).toCharArray();

    for (int i = 0; i < cs.length; i++) {

    if (c == cs[i]) {

    otherTargetIndexs.add(startTargetIDX+1+i);

    }

    }

    result.put("otherTargetIndexs", otherTargetIndexs.isEmpty() ? null : otherTargetIndexs);

    }

    }

    return result;

    }

    }

    package com.miaodi.api.handler;

    import java.util.HashSet;

    import java.util.List;

    import java.util.Set;

    import java.util.Vector;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Future;

    import java.util.concurrent.LinkedBlockingQueue;

    import java.util.concurrent.ThreadPoolExecutor;

    import java.util.concurrent.TimeUnit;

    import com.miaodi.api.util.SimilarityRatioUtils;

    public class TemplateDistillUtil {

    private static final ExecutorService executorPool = new ThreadPoolExecutor(10, 30, 30, TimeUnit.SECONDS, new LinkedBlockingQueue(50),new ThreadPoolExecutor.CallerRunsPolicy());

    public static String distillTemplates(List targets){

    if (targets.isEmpty()) {

    return null;

    }else if(targets.size() == 1) {

    return targets.get(0);

    }

    String source = targets.get(0);

    String template = null;

    for (int i = 1; i < targets.size(); i++) {

    if (i==1) {

    template = distillTemplates(source, targets.get(i));

    }else {

    if (template == null) {

    return null;

    }

    template = distillTemplates(template, targets.get(i));

    }

    }

    return format(template == null ? "|": template);

    }

    public static String distillTemplates(String source, String target) {

    // 符合这两字符串的全部模板

    List> futures = new Vector>();

    futures.add(executorPool.submit(new TemplateDistill(source,target,futures,executorPool,0,0,false,null,0)));

    Set templates = new HashSet();

    while (true) {

    int y = 0;

    for (int i = 0; i < futures.size(); i++) {

    try {

    y += 1;

    String template = futures.get(i).get();

    if (template != null) {

    templates.add(futures.get(i).get());

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    if (y == futures.size()) {

    break;

    }

    }

    float maxRatio = 0;

    String maxRatioTemplate = null;

    for (String template : templates) {

    float ratio = SimilarityRatioUtils.getSimilarityRatio(source, template);

    if (ratio > maxRatio) {

    maxRatio = ratio;

    maxRatioTemplate = template;

    }

    }

    return maxRatioTemplate;

    }

    public static String format(String template) {

    if (template == null) {

    return null;

    }

    StringBuilder sb = new StringBuilder();

    String[] vs = template.split("\\|");

    for (int i = 1; i <= vs.length; i++) {

    sb.append(vs[i-1]);

    if (i != vs.length) {

    sb.append("{"+i+"}");

    }

    }

    if (template.lastIndexOf("|") == template.length()-1) {

    sb.append("{"+((vs.length-1)<0?0:(vs.length-1))+"}");

    }

    return sb.toString();

    }

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

    //

    //

    System.out.println(format("123|123|"));

    //

    //        long start = System.currentTimeMillis();

    //

    //        String[] strs = new String[] {

    "廖兴攀-有线,在2017-10-01 11:53:22",

    "鲍冬梅-有线,在2017-10-01 11:53:11"

    "【兴业银行】尊敬的用户,于10月8日前点 https://rsp.mobi/N3eOs4 申请信用卡,可获批10万额度。退订回T",

    "【兴业银行】尊敬的用户,于10月8日前点 https://rsp.mobi/A5jk6Z 申请信用卡,可获批10万额度。退订回T"

    "【随你花】尊敬的王建辉,您的账单现在到期了,逾期将取消再借资格,请及时处理!需要链接找客服。回T退订",

    "【随你花】尊敬的项俊,您的账单现在到期了,逾期将取消再借资格,请及时处理!需要链接找客服。回T退订",

    "廖兴攀-有线,在2017-10-01 11:53:37触发了上线提醒,请留意。",

    "鲍冬梅-000有线,在2017-10-01 11:53:45触发了上线提醒,请留意。",

    //                "123xxx12",

    //                "123xxz12",

    //                "123xxz221211",

    ,"【银汉科技】尊贵的易美达分期客户:郭文娟,你总12期的第2期1866.67元,2017-12-31为本期还款日,到目前未还款,现已经逾期,请珍视个人信用,维护良好的账户记录和信誉。如有疑问,请致电4000-512-012,退订回T。"

    //        };

    System.out.println(SimilarityRatioUtils.getSimilarityRatio(strs[0], strs[1]));

    //        String templates = distillTemplates(strs);

    float maxRatio = 0;

    String maxRatioTemplate = null;

    for (String template : templates) {

    float ratio = SimilarityRatioUtils.getSimilarityRatio(strs[0], template);

    if (ratio > maxRatio) {

    maxRatio = ratio;

    maxRatioTemplate = template;

    }

    }

    //        System.out.println("模板:"+templates);

    Matcher matcher = Pattern.compile("\\{\\d+\\}").matcher(maxRatioTemplate);

    String templete = matcher.replaceAll(".*");

    String regex = String.format("^%s$", templete); // 构建新的pattern字符串

    for (String string : strs) {

    System.out.println(Pattern.compile(regex).matcher(string).find());

    }

    //        System.out.println("共计耗时:"+ (System.currentTimeMillis()-start) +"毫秒");

    //    }

    }

    展开全文
  • java 计算字符串相似度
  • 使用Levenshtein(莱文斯坦)编辑距离来实现相似度算法 所谓Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,操作包括一切你使用的手段将一个字符串转换成另一个字符串,比如插入一个...
  • )其目的是根据字符在两者中出现的方式计算两个字符串之间的相似性,或者在一个字符串中出现或不出现在另一个字符串中。代码是正确的,但我想优化它。您是否看到任何低效率,不良做法或不必要的复杂性?(不要担心Gene...
  • /*** 采用动态规划的方法(字符串匹配相似度)* @param source 源* @param target 要匹配的字符串* @return*/public static int EditDistance(String source, String target) {char[] sources = source.toCharArray();...
  • 最小编辑距离,字符串相似度,即将一个字符串转换成另一个字符串所需要的最少编辑次数(编辑包括添加,删除,替换三种)
  • /*** 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance* 主要用来计算从原(s)转换到目标(t)所/*** 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance* ...
  • 编辑距离(Edit Distance),最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名,又称Levenshtein距离。是指两个字串之间,由一个...1.将两个字符串分别写到行和列中,第一行和第一列的值从0开始增...
  • Java 实现推荐系统 两个字符串 余弦相似度 算法。
  • 字符串相似度计算工具和算法

    千次阅读 2020-07-10 22:19:17
    介绍:JavaWuzzy是Java版的FuzzyWuzzy,用于计算字符串之间的匹配度。 FuzzySearch.ratio(String s1, String s2) 全匹配,对顺序敏感 FuzzySearch.partialRatio(String s1, String s2) 搜索匹配(部分匹配),对顺序...
  • 发现apache提供了现成的解决方案1.Cosine similaritypackage org.apache.commons....import java.util.HashSet;import java.util.Map;import java.util.Set;/*** Measures the Cosine similarity of two vectors of...
  • 字符串相似度比较工具 描述:在日常开发过程中我们可能需要比较两个字符串的相似度有多少,本工具类提供了一个方便计算的算法。 /** * 字符串相似度比较工具 * * @date: 2020/12/7 10:45 */ public class ...
  • Java中对比两个字符串相似度的方法, 以下整理了两个方式比对方法,同样的字符串不同的计算方式得到的结果也是不同的: package test; /** * 对比俩个字符串相似度 * @author sanshi */ public class ...
  • Java获取两个字符串相似度 public static double getStringSimilarity(String sourceString, String targetString) { int[][] matrix; int sourceStringLength = sourceString.length(); int ...
  • 简单的字符串相似度匹配加排序

    千次阅读 2018-10-11 20:15:38
    今天遇到一个问题,需要将一组字符串,跟结果需要的字符串相比较,根据相似性排列出来,思考了一个下午,想了一个简易的匹配算法,写出代码的时候下班了,回家调试了几次后就成功了,特此将该算法写出来。...
  • public classStringUtil {/*** java高效比较两个字符串相似度算法**** 解决方法:** Levenshtein Distance,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。** 许...
  • https://stackoverflow.com/questions/13564464/problems-with-levenshtein-algorithm-in-java Apache Commons Lang3的StringUtils.getLevenshteinDistance(); 有一个开源库java-util...
  • 字符串相似度

    2013-11-18 13:57:26
    判断两个字符串相似度 java 相似度 string
  • 指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,800
精华内容 1,920
关键字:

java字符串相似度

java 订阅