• java 相似度计算


     

    1. public class Same {
    2. public static void main(String[] args) {
    3. //读取excel中的数据进行相似度的计算
    4. File file = new File("D:\\1.xlsx");
    5. try {
    6. XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));
    7. int tabIndex = 0;
    8. Sheet sheet = xssfWorkbook.getSheetAt(tabIndex);
    9. Row row = null;
    10. Cell cell1 = null;
    11. List list = new ArrayList<>();
    12. HashMap map = new HashMap();
    13. for (int i = 0; i <= 899; i++) {
    14. row = sheet.getRow(i); //指定行
    15. cell1 = row.getCell(0); //指定列
    16. cell1.setCellType(CellType.STRING);
    17. String cellValue0 = cell1.getStringCellValue();
    18. list.add(cellValue0);
    19. }
    20. //双重for循环,去掉重复的比较
    21. for (int i = 0; i < list.size()-1; i++) {
    22. for (int j = i+1; j < list.size(); j++) {
    23. String a = list.get(i);
    24. String b = list.get(j);
    25. float levenshtein = Levenshtein(a, b);
    26. if (levenshtein >= 0.80) {
    27. System.out.println(a+"<--->"+b+","+levenshtein+"\r\n");
    28. }
    29. }
    30. }
    31. System.out.println(map.size());
    32. } catch (Exception e) {
    33. e.printStackTrace();
    34. }
    35. }
    36. /**
    37. * 相似度公共方法
    38. * @param a
    39. * @param b
    40. * @return
    41. */
    42. public static float Levenshtein(String a, String b) {
    43. if (a == null && b == null) {
    44. return 1f;
    45. }
    46. if (a == null || b == null) {
    47. return 0F;
    48. }
    49. int editDistance = editDis(a, b);
    50. return 1 - ((float) editDistance / Math.max(a.length(), b.length()));
    51. }
    52. private static int editDis(String a, String b) {
    53. int aLen = a.length();
    54. int bLen = b.length();
    55. if (aLen == 0) {
    56. return aLen;
    57. }
    58. if (bLen == 0) {
    59. return bLen;
    60. }
    61. int[][] v = new int[aLen + 1][bLen + 1];
    62. for (int i = 0; i <= aLen; ++i) {
    63. for (int j = 0; j <= bLen; ++j) {
    64. if (i == 0) {
    65. v[i][j] = j;
    66. } else if (j == 0) {
    67. v[i][j] = i;
    68. } else if (a.charAt(i - 1) == b.charAt(j - 1)) {
    69. v[i][j] = v[i - 1][j - 1];
    70. } else {
    71. v[i][j] = 1 + Math.min(v[i - 1][j - 1], Math.min(v[i][j - 1], v[i - 1][j]));
    72. }
    73. }
    74. }
    75. return v[aLen][bLen];
    76. }
    77. }

  • 相关阅读:
    .net core 抛异常对性能影响的求证之路
    【Linux操作系统】基础概念和常用指令(一)
    开源的 Sora 复现方案,成本降低近一半!
    系统常用的命令
    论文阅读(7)水母游动的流体动力学 - 海洋科学年刊(2021)
    C语言函数调用
    NodeJS爬取墨刀上的设计图片
    HTTP的理解和各个版本的介绍优化
    c++ onnx之resnet分类
    面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
  • 原文地址:https://blog.csdn.net/weixin_47785112/article/details/126651331