字符串相似度计算工具和算法

一、fuzzywuzzy

介绍:JavaWuzzy是Java版的FuzzyWuzzy,用于计算字符串之间的匹配度。
FuzzySearch.ratio(String s1, String s2)
全匹配,对顺序敏感
FuzzySearch.partialRatio(String s1, String s2)
搜索匹配(部分匹配),对顺序敏感
FuzzySearch.tokenSortRatio(String s1, String s2)
首先做排序,然后全匹配,对顺序不敏感(也就是更换单词位置之后,相似度依然会很高)
FuzzySearch.tokenSortPartialRatio(String s1, String s2)
首先做排序,然后搜索匹配(部分匹配),对顺序不敏感
FuzzySearch.tokenSetRatio(String s1, String s2)
首先取集合(去掉重复词),然后全匹配,对顺序不敏感,第二个字符串包含第一个字符串就100
FuzzySearch.tokenSetPartialRatio(String s1, String s2)
首先取集合,然后搜索匹配(部分匹配),对顺序不敏感
FuzzySearch.weightedRatio(String s1, String s2)
对顺序敏感,算法不同

开源地址:https://github.com/xdrop/fuzzywuzzy

案例:

        System.out.println("1 "+FuzzySearch.ratio("admin", "admin"));
        System.out.println("2 "+FuzzySearch.partialRatio("ADMIN", "admin"));
        System.out.println("3 "+FuzzySearch.tokenSetPartialRatio("test", "test1"));
        System.out.println("4 "+FuzzySearch.weightedRatio("你是", "你是我"));
        System.out.println("5 "+FuzzySearch.tokenSortRatio("你是", "你是W"));
        System.out.println("6 "+FuzzySearch.tokenSetRatio("你是", "你是o"));
        System.out.println(DiffUtils.getRatio("你是", "你是我"));
        System.out.println(DiffUtils.levEditDistance("你是", "你是我",1));
        System.out.println(DiffUtils.getMatchingBlocks("你是", "你是我"));
        System.out.println(DiffUtils.getEditOps("你是", "你是我"));

maven:

        <dependency>
            <groupId>me.xdrop</groupId>
            <artifactId>fuzzywuzzy</artifactId>
            <version>1.3.1</version>
        </dependency>

二、commons-text

介绍:Commons Text 是一组用于在 Java 环境中使用的处理文本的实用、可重用组件。

开源地址:http://commons.apache.org/proper/commons-text/

案例:

        FuzzyScore fuzzyScore = new FuzzyScore(Locale.ENGLISH);
        System.out.println("1 "+fuzzyScore.fuzzyScore("admin", "admin"));
        FuzzyScore fuzzyScores = new FuzzyScore(Locale.CHINESE);
        System.out.println("2 "+fuzzyScores.fuzzyScore("你是", "你是"));

maven:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.4</version>
        </dependency>

三、java-string-similarity

介绍:一个实现不同字符串相似度和距离度量的库。当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。

归一化,度量,相似度和距离
基于(n-gram)的相似度和距离
莱文施泰因
标准化莱文施泰因
加权Levenshtein
Damerau-Levenshtein
最佳字符串对齐
杰罗·温克勒
最长公共子序列
公制最长公共子序列
N-格拉姆
基于碎片(n-gram)的算法
Q-Gram
余弦相似度
雅卡指数
Sorensen-Dice系数

开源地址:https://github.com/tdebatty/java-string-similarity

案例:

        Levenshtein levenshtein = new Levenshtein();
        System.out.println(levenshtein.distance("My string", "My $tring"));
        System.out.println(levenshtein.distance("My string", "My $tring"));
        System.out.println(levenshtein.distance("My string", "My $tring"));
        NormalizedLevenshtein normalizedLevenshtein = new NormalizedLevenshtein();
        System.out.println(normalizedLevenshtein.distance("My string", "My $tring"));
        System.out.println(normalizedLevenshtein.distance("My string", "My $tring"));
        System.out.println(normalizedLevenshtein.distance("My string", "My $tring"));
        Damerau damerau = new Damerau();
        // 1 substitution
        System.out.println(damerau.distance("ABCDEF", "ABDCEF"));
        // 2 substitutions
        System.out.println(damerau.distance("ABCDEF", "BACDFE"));
        // 1 deletion
        System.out.println(damerau.distance("ABCDEF", "ABCDE"));
        System.out.println(damerau.distance("ABCDEF", "BCDEF"));
        System.out.println(damerau.distance("ABCDEF", "ABCGDEF"));
        // All different
        System.out.println(damerau.distance("ABCDEF", "POIU"));
        OptimalStringAlignment optimalStringAlignment = new OptimalStringAlignment();
        System.out.println(optimalStringAlignment.distance("CA", "ABC"));
        JaroWinkler jaroWinkler = new JaroWinkler();
        // substitution of s and t
        System.out.println(jaroWinkler.similarity("My string", "My tsring"));
        // substitution of s and n
        System.out.println(jaroWinkler.similarity("My string", "My ntrisg"));
        LongestCommonSubsequence longestCommonSubsequence = new LongestCommonSubsequence();
        // Will produce 4.0
        System.out.println(longestCommonSubsequence.distance("AGCAT", "GAC"));
        // Will produce 1.0
        System.out.println(longestCommonSubsequence.distance("AGCAT", "AGCT"));
        RatcliffObershelp ratcliffObershelp = new RatcliffObershelp();
        // substitution of s and t
        System.out.println(ratcliffObershelp.similarity("My string", "My tsring"));
        // substitution of s and n
        System.out.println(ratcliffObershelp.similarity("My string", "My ntrisg"));

maven:

        <dependency>
            <groupId>info.debatty</groupId>
            <artifactId>java-string-similarity</artifactId>
            <version>2.0.0</version>
        </dependency>

四、java-diff-utils

介绍:Diff Utils库是一个开放源代码库,用于执行文本之间的比较操作:计算差异,应用补丁,生成统一的差异或对其进行解析,生成差异输出以方便将来显示(如并排视图)等等。
构建该库的主要原因是缺乏使用差异文件时需要的所有常用内容的易于使用的库。最初它受JRCS库的启发,并且是diff模块的不错的设计。

开源地址:https://github.com/java-diff-utils/java-diff-utils

案例:

        System.out.println(DiffUtils.diffInline("admin","admin"));
        System.out.println(DiffUtils.diff(Arrays.asList("admin"),Arrays.asList("admin"),true);
        System.out.println(DiffUtils.diff(Arrays.asList("admin"),Arrays.asList("admin")));

maven:

        <dependency>
            <groupId>io.github.java-diff-utils</groupId>
            <artifactId>java-diff-utils</artifactId>
            <version>4.7</version>
        </dependency>
  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
D:\002 我的工具类\001 流 D:\002 我的工具类\001 流\文件操作整体 D:\002 我的工具类\001 流\文件操作整体\FileEncodingUtil.java D:\002 我的工具类\001 流\文件操作整体\FileReadImpl.java D:\002 我的工具类\001 流\文件操作整体\FileTypeImpl.java D:\002 我的工具类\001 流\文件操作整体\FileUtil.java D:\002 我的工具类\001 流\文件操作整体\valid.java D:\002 我的工具类\001 流\文件操作整体2 D:\002 我的工具类\001 流\文件操作整体2\Charsets.java D:\002 我的工具类\001 流\文件操作整体2\CompressUtils.java D:\002 我的工具类\001 流\文件操作整体2\FileReadImpl.java D:\002 我的工具类\001 流\文件操作整体2\FileUtils.java D:\002 我的工具类\001 流\文件操作整体2\IOUtils.java D:\002 我的工具类\001 流\文件操作整体2\PropertiesUtil.java D:\002 我的工具类\0013数字 D:\002 我的工具类\0013数字\MathUtils.java D:\002 我的工具类\002 数组 D:\002 我的工具类\002 数组\ArrayUtils.java D:\002 我的工具类\003 日期 D:\002 我的工具类\003 日期\DateUtil.java D:\002 我的工具类\004 加密 D:\002 我的工具类\004 加密\DESUtils.java D:\002 我的工具类\004 加密\PasswordHash.java D:\002 我的工具类\005 随机数 D:\002 我的工具类\005 随机数\RandomUtils.java D:\002 我的工具类\005 随机数\UUIDUtils.java D:\002 我的工具类\006 汉字转换成拼音 D:\002 我的工具类\006 汉字转换成拼音\SpellUtils.java D:\002 我的工具类\007 字符串 D:\002 我的工具类\007 字符串\StringUtils.java D:\002 我的工具类\008 校验 D:\002 我的工具类\008 校验\一起使用 D:\002 我的工具类\008 校验\一起使用\008 校验 D:\002 我的工具类\008 校验\一起使用\008 校验\Validators.java D:\002 我的工具类\009 bean和map互转 D:\002 我的工具类\009 bean和map互转\XBeanUtils.java D:\002 我的工具类\010 操作图片 D:\002 我的工具类\010 操作图片\ImageUtils.java D:\002 我的工具类\010 操作图片\整体图片操作 D:\002 我的工具类\010 操作图片\整体图片操作\CaptchaUtil.java D:\002 我的工具类\010 操作图片\整体图片操作\ColorUtil.java D:\002 我的工具类\010 操作图片\整体图片操作\Encoder.java D:\002 我的工具类\010 操作图片\整体图片操作\GIF D:\002 我的工具类\010 操作图片\整体图片操作\GIF\Encoder.java D:\002 我的工具类\010 操作图片\整体图片操作\GIF\GifEncoder.java D:\002 我的工具类\010 操作图片\整体图片操作\GIF\Quant.java D:\002 我的工具类\010 操作图片\整体图片操作\GifEncoder.java D:\002 我的工具类\010 操作图片\整体图片操作\ImageCaptcha.java D:\002 我的工具类\010 操作图片\整体图片操作\ImageCompare.java D:\002 我的工具类\010 操作图片\整体图片操作\ImageUtil.java D:\002 我的工具类\010 操作图片\整体图片操作\OperateImage.java D:\002 我的工具类\010 操作图片\整体图片操作\Quant.java D:\002 我的工具类\010 操作图片\比较两张图片的相似度 D:\002 我的工具类\010 操作图片\比较两张图片的相似度\BMPLoader.java D:\002 我的工具类\011 对象 D:\002 我的工具类\011 对象\对象整体 D:\002 我的工具类\011 对象\对象整体\BeanStruct.java D:\002 我的工具类\011 对象\对象整体\BeanUtil.java D:\002 我的工具类\011 对象\对象整体\Factory.java D:\002 我的工具类\011 对象\对象整体\PropertyFilter.java D:\002 我的工具类\011 对象\对象整体\valid.java D:\002 我的工具类\012 计算地球两个经纬度之间距离 D:\002 我的工具类\012 计算地球两个经纬度之间距离\CoordinateUtil.java D:\002 我的工具类\014 json D:\002 我的工具类\014 json\JsonUtils.java D:\002 我的工具类\015 cookie D:\002 我的工具类\015 cookie\CookieUtils.java D:\002 我的工具类\016 FtpUtil D:\002 我的工具类\016 FtpUtil\FtpUtil.java D:\002 我的工具类\016 FtpUtil\FtpUtils.java D:\002 我的工具类\017在页面上显示各种文档中的内容。在servlet中的逻辑 D:\002 我的工具类\017在页面上显示各种文档中的内容。在servlet中的逻辑\新建文本文档.txt D:\002 我的工具类\018 获得系统信息 D:\002 我的工具类\018 获得系统信息\获取系统信息.txt D:\002 我的工具类\019 Java屏幕截图工具 D:\002 我的工具类\019 Java屏幕截图工具\Java实现网页截屏 D:\002 我的工具类\019 Java屏幕截图工具\Java实现网页截屏\CutPicture.java D:\002 我的工具类\019 Java屏幕截图工具\ScreenCaptureFrame .java D:\002 我的工具类\020 判断字符串中是否含有汉字 D:\002 我的工具类\020 判断字符串中是否含有汉字\新建文本文档.txt D:\002 我的工具类\021 生成随机汉字 D:\002 我的工具类\021 生成随机汉字\DrawImage.java D:\002 我的工具类\022 生成条形码,二维码图片 D:\002 我的工具类\022 生成条形码,二维码图片\ZxingTool.java D:\002 我的工具类\023 Java获取Linux系统cpu使用率 D:\002 我的工具类\023 Java获取Linux系统cpu使用率\OSUtils.java D:\002 我的工具类\024 Java对各种排序算法的实现 D:\002 我的工具类\024 Java对各种排序算法的实现\新建文本文档.txt D:\002 我的工具类\025 公农历互转 D:\002 我的工具类\025 公农历互转\LunarCalendar.java D:\002 我的工具类\026 数字金额大写转换 D:\002 我的工具类\026 数字金额大写转换\ConvertNumberToUpper.java D:\002 我的工具类\027 Java6实现调用操作平台桌面系统 D:\002 我的工具类\027 Java6实现调用操作平台桌面系统\DesktopDemo.java
以下是一个Java工具类,基于余弦相似度方法计算两个字符串相似度: ```java import java.util.HashMap; import java.util.Map; public class StringSimilarityUtil { /** * 计算两个字符串的余弦相似度 * * @param str1 字符串1 * @param str2 字符串2 * @return 余弦相似度 */ public static double cosineSimilarity(String str1, String str2) { // 分词 String[] words1 = str1.split(" "); String[] words2 = str2.split(" "); // 统计词频 Map<String, Integer> freq1 = new HashMap<>(); Map<String, Integer> freq2 = new HashMap<>(); for (String word : words1) { freq1.merge(word, 1, Integer::sum); } for (String word : words2) { freq2.merge(word, 1, Integer::sum); } // 计算向量长度 double length1 = 0; double length2 = 0; for (Map.Entry<String, Integer> entry : freq1.entrySet()) { length1 += Math.pow(entry.getValue(), 2); } for (Map.Entry<String, Integer> entry : freq2.entrySet()) { length2 += Math.pow(entry.getValue(), 2); } length1 = Math.sqrt(length1); length2 = Math.sqrt(length2); // 计算内积 double dotProduct = 0; for (Map.Entry<String, Integer> entry : freq1.entrySet()) { if (freq2.containsKey(entry.getKey())) { dotProduct += entry.getValue() * freq2.get(entry.getKey()); } } // 计算余弦相似度 return dotProduct / (length1 * length2); } } ``` 使用方法: ```java public static void main(String[] args) { String str1 = "Java是一种计算机编程语言"; String str2 = "Java是一种面向对象的编程语言"; double similarity = StringSimilarityUtil.cosineSimilarity(str1, str2); System.out.println(similarity); // 输出:0.6666666666666667 } ``` 其中,余弦相似度计算公式为: $$ similarity = \frac{\sum_{i=1}^{n} A_i \times B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \times \sqrt{\sum_{i=1}^{n} B_i^2}} $$ 其中,$A_i$和$B_i$分别表示两个字符串中第$i$个词的频次,$n$为总词数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值