`
xiaoxiaokuang
  • 浏览: 16969 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

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());
}
分享到:
评论

相关推荐

    易语言快速计算文本相似度

    本资源提供了一个易语言实现的快速计算文本相似度的源码,可以帮助开发者高效地进行文本比较和分析。 易语言是一种以中文编程为特色的编程语言,其设计目标是使编程变得简单、直观。在这个特定的案例中,易语言被...

    基于LCS的文本相似度计算

    一个简单的基于LCS的计算文本相似度的函数,新人所写,高手勿喷

    易语言快速计算文本相似度源码

    在提供的"content.txt"文件中,可能包含了具体的易语言源代码,用于实现上述的一种或多种文本相似度计算方法。为了进一步了解和学习,你可以打开这个文件查看具体实现细节。同时,"SanYe"标签可能指的是易语言社区中...

    DELPHI 计算两个字符串相似度 LCS算法(附源代码)

    通过这些文件,你可以看到一个完整的DELPHI项目,它实现了LCS算法并展示了一个简单的用户界面来输入两个字符串并计算它们的相似度。当你运行LCSProject.exe时,可以输入字符串并观察输出的相似度结果。 总的来说,...

    LCS计算文章相似度--C#源程序

    在本文中,我们将深入探讨如何使用C#编程语言实现LCS算法来计算两篇文章的相似度。 一、LCS算法原理 LCS算法的目标是找到两个序列中最长的一段连续子序列,这个子序列在原序列中不需连续,但必须保持原有的相对顺序...

    Delphi计算字符串的相似度

    总之,Delphi提供了丰富的工具和功能来处理字符串相似度计算,开发者可以根据具体需求选择合适的算法并进行实现。在实际项目中,理解和运用这些算法可以帮助我们更好地理解和比较文本数据,提升应用程序的功能和用户...

    LCS算法源码

    在实际应用中,LCS算法可以用于比较文本的相似度,比如在版本控制系统中检测文件的差异。在生物信息学中,LCS被用来比较DNA或蛋白质序列,以找出它们的相似区域。此外,LCS也可用于解决软件工程中的问题,如合并冲突...

    字符串相似度比较算法

    在计算机科学领域,字符串相似度比较算法是一种用于评估两个字符串之间相似程度的技术。这些算法广泛应用于文本处理、信息检索、生物信息学等多个领域。当我们要判断两个字符串是否含有相同或相近的信息时,这类算法...

    带有 LCS算法的图像差异工具_rust_代码_下载

    LCS 算法是一种在计算机科学中广泛应用于比较序列相似性的算法,不仅在文本编辑器、版本控制系统等领域有应用,还被引入到图像处理中,用于检测图像之间的差异。 【描述】提到的“lcs 图像差异”库和工具,是基于 ...

    算法导论LCS

    从给定的代码片段和描述来看,这是一段关于实现DNA序列比对的算法,具体而言,是基于动态规划的最长公共子序列(Longest Common Subsequence,简称LCS)算法的一个实例。这段代码旨在计算两个DNA序列之间的编辑距离...

    字符串相似性算法【最长公共字符串算法】 【LCS】

    这篇博客文章可能是关于如何实现LCS算法的讨论,虽然具体的博文内容没有提供,但我们可以深入探讨LCS算法的基本概念和实现。 LCS算法旨在找到两个字符串的最长子序列,这个子序列不必连续,但必须在两个原始字符串...

    文章相似度判断--判断论文是否抄袭的系统

    总的来说,这个系统利用C语言实现了文本相似度计算,帮助用户快速检测文章的原创性,防止抄袭现象。虽然C语言在处理自然语言方面不如Python或Java等现代语言便捷,但它提供的底层控制能力使得这类任务成为可能。对于...

    行业分类-设备装置-一种节省内存的LCS算法.zip

    LCS算法广泛应用于序列比对、生物信息学、文本相似度计算等领域。本文件“一种节省内存的LCS算法”探讨了一种优化的内存效率方法,对于处理大规模数据时具有显著优势。 LCS问题的基本定义是:给定两个序列X和Y,找...

    程序代码相似度度量算法研究

    - **算法思想**:利用Karp-Rabin算法的高效散列值计算能力和LCS算法的准确性,设计出一种新的匹配策略。 - **具体步骤**: - 对待比较的两个程序代码进行预处理,提取关键的代码片段。 - 计算这些代码片段的散列值...

    算法分析考试试卷.rar

    2. 最长公共子序列(LCS):找到两个序列不相交部分的最大长度,常用于比较文本相似度。 3. 矩阵链乘法:优化多矩阵相乘的计算顺序,减少运算次数。 五、贪心算法与回溯法 1. 贪心算法:每一步都采取当前看来最优的...

    基于语义理解的论文相似度研究现状及进展

    句子相似度的研究主要是面向英文的字符串相似度计算,如编辑距离、LCS算法等。相比之下,对汉语句子相似度的研究,国内学者更偏向于利用词语相似度的加权组合,例如通过分词得到不同词性集合,并赋予对应权重以计算...

    易语言文本相似度算法源码-易语言

    本资源是关于易语言实现的文本相似度算法的源码,对于想要深入学习易语言以及自然语言处理的开发者来说,具有很高的学习价值。 在自然语言处理领域,文本相似度算法是一项基础且重要的技术。它用于衡量两篇文本之间...

    相似性检测与文本去重

    LCS作为一种字符串处理的算法,被广泛应用于文本相似度的计算和文本匹配领域。 对于文档中提到的“软件2014年第35卷第11期SOFTWARE国际IT传媒品牌”以及“通信联系人:吴国仕,教授”,这些信息指示了文档的出处、...

    MFC实现任意两个文件的相似度比较Ex_FileSimilarity.rar

    通过分析这些代码,我们可以深入理解MFC如何被用来创建用户界面,以及LCS算法如何被集成到MFC应用程序中来计算文件的相似度。 总的来说,这个项目结合了MFC的UI设计、文件处理、LCS算法以及可视化技术,为用户提供...

Global site tag (gtag.js) - Google Analytics