LCS算法实现简单中文文本相似度分析

简介:

LCS(Longest Common Subsequence)算法实现的文本相似度分析:

算法原理:

(1) 将两个字符串分别以行和列组成矩阵。
(2) 计算每个节点行列字符是否相同,如相同则为 1。
(3) 通过找出值为 1 的最长对角线即可得到最长公共子串。

人 民 共 和 时 代
中 0, 0, 0, 0, 0, 0
华 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 1, 0, 0, 0, 0
共 0, 0, 1, 0, 0, 0
和 0, 0, 0, 1, 0, 0
国 0, 0, 0, 0, 0, 0

为进一步提升该算法,我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值,这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。

人 民 共 和 时 代
中 0, 0, 0, 0, 0, 0
华 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 2, 0, 0, 0, 0
共 0, 0, 3, 0, 0, 0
和 0, 0, 0, 4, 0, 0
国 0, 0, 0, 0, 0, 0
 

代码:

private final String content_regex = "(?i)[^a-zA-Z0-9\u4E00-\u9FA5]";
 
 /**
  * 判断两段正文相似度
  * @param content1
  * @param content2
  * @return
  */
 private float calculateContentSimilarity(String content1, String content2){
  
  String s1 = content1.replaceAll("content_regex", "").trim(); 
  String s2 = content2.replaceAll("content_regex", "").trim();
  
  if(s1.equals(s2)){
   return 1.00f;
  }else {
   if (s1.length() > s2.length() ? (s1.indexOf(s2) > -1)
     : (s2.indexOf(s1) > 0)) {
    return s1.length() > s2.length() ? ((float) s2
      .length() / (float) s1.length()) : ((float) s1
      .length() / (float) s2.length());
   }
  }
  
//  return calculateSimilarityLCS(s1, s2);
  
  return calculateContentSimilarityD(content1, content2);
 }
 
 /**
  * 判断两段正文相似度
  * @param content1
  * @param content2
  * @return
  */
 private float calculateContentSimilarityD(String content1, String content2){
  
  String[] s1 = content1.trim().split("。"); 
  String[] s2 = content2.trim().split("。"); 
  
  if(s1.length < s2.length){
   String[] temp = s1;   
   s1 = s2;
   s2 = temp;
  }
  
  float totalWeight = 0;

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

   float unitWeight = 0;

   for (int j = 0; j < s1.length; j++) {

    if(content2.indexOf(s2[i]) > -1){
     unitWeight = 1.00f;
     break;
    }
    float weight = calculateSimilarityLCS(s2[i], s1[j]);

    if (unitWeight < weight) {
     unitWeight = weight;
    }
   }

   totalWeight += unitWeight;

  }
  
  return (totalWeight/s2.length) * (s2.length/s1.length);
  
 }
 
 
 /**
  * 判断两段文本相似度
  * @param value1
  * @param value2
  * @return
  */
 private float calculateSimilarityLCS(String s1, String s2) {
  int[][] d = new int[s1.length()][s2.length()];

  int index = 0;
  int length = 0;

  for (int i = 0; i < s1.length(); i++) {
   for (int j = 0; j < s2.length(); j++) {
    int n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1][j - 1] : 0;

    d[i][j] = s1.charAt(i) == s2.charAt(j) ? 1 + n : 0;

    if (d[i][j] > length) {
     length = d[i][j];
     index = i;
    }
   }
  }
  
  int begin = index - length + 1;   
  String simword = s1.substring(begin, begin + length) ;

  return s1.length() > s2.length() ? ((float) simword
    .length() / (float) s1.length()) : ((float) simword
    .length() / (float) s2.length());
 }

 本文转自william_xu 51CTO博客,原文链接:http://blog.51cto.com/williamx/747485,如需转载请自行联系原作者

相关文章
|
19天前
|
JSON 监控 算法
员工上网行为监控:利用Scala编写数据处理和分析算法
企业在数字化时代利用Scala进行员工上网行为监控,以确保合规和网络安全。通过Scala的数据处理和分析能力,读取CSV日志数据转换为DataFrame,分析员工行为,如统计最常访问网站。此外,还展示了将监控数据以JSON格式提交至公司网站的函数,实现实时信息更新与安全防护。
65 5
|
7天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
13天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
|
14天前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
|
14天前
|
算法 数据可视化 数据挖掘
数据分享|R语言改进的K-MEANS(K-均值)聚类算法分析股票盈利能力和可视化
数据分享|R语言改进的K-MEANS(K-均值)聚类算法分析股票盈利能力和可视化
|
15天前
|
数据采集 存储 算法
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
|
17天前
|
机器学习/深度学习 数据采集 算法
共享单车需求量数据用CART决策树、随机森林以及XGBOOST算法登记分类及影响因素分析
共享单车需求量数据用CART决策树、随机森林以及XGBOOST算法登记分类及影响因素分析
|
19天前
|
移动开发 算法 数据可视化
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
|
20天前
|
算法 数据可视化 搜索推荐
数据分享|Python用Apriori算法关联规则分析亚马逊购买书籍关联推荐客户和网络图可视化
数据分享|Python用Apriori算法关联规则分析亚马逊购买书籍关联推荐客户和网络图可视化
|
20天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据