`
115893520
  • 浏览: 142657 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

中文句子相似度判断源码探讨

阅读更多

在我们日常的开发中,有时候不可避免的需要判断两个中文句子的相似度,如多语翻译项目的句子库录入需要判断当前输入的句子是否在库中已有相似的句子,在Tag相关性的时候需要给出相关文章等等,应用场景非常之多,不知道大家有没有好的方式来判断,我这里给出我的SQL实现和Java实现,供大家参考:

PL/SQL判断句子相似度:

Sql代码 复制代码
  1. CREATE OR REPLACE FUNCTION ld -- Levenshtein distance   
  2.   (p_source_string   IN VARCHAR2,   
  3.    p_target_string   IN VARCHAR2)   
  4.   RETURN                NUMBER   
  5.   DETERMINISTIC   
  6. AS  
  7.   v_length_of_source    NUMBER := NVL (LENGTH (p_source_string), 0);   
  8.   v_length_of_target    NUMBER := NVL (LENGTH (p_target_string), 0);   
  9.   TYPE mytabtype IS     TABLE OF NUMBER INDEX BY BINARY_INTEGER;   
  10.   column_to_left        mytabtype;   
  11.   current_column        mytabtype;   
  12.   v_cost                NUMBER := 0;   
  13. BEGIN  
  14.   IF v_length_of_source = 0 THEN  
  15.     RETURN v_length_of_target;   
  16.   ELSIF v_length_of_target = 0 THEN  
  17.     RETURN v_length_of_source;   
  18.   ELSE  
  19.     FOR j IN 0 .. v_length_of_target LOOP   
  20.       column_to_left(j) := j;   
  21.     END LOOP;   
  22.     FOR i IN 1.. v_length_of_source LOOP   
  23.       current_column(0) := i;   
  24.       FOR j IN 1 .. v_length_of_target LOOP   
  25.         IF SUBSTR (p_source_string, i, 1) =   
  26.            SUBSTR (p_target_string, j, 1)   
  27.         THEN v_cost := 0;   
  28.         ELSE v_cost := 1;   
  29.         END IF;   
  30.         current_column(j) := LEAST (current_column(j-1) + 1,   
  31.                                     column_to_left(j) + 1,   
  32.                                     column_to_left(j-1) + v_cost);   
  33.       END LOOP;   
  34.       FOR j IN 0 .. v_length_of_target  LOOP   
  35.         column_to_left(j) := current_column(j);   
  36.       END LOOP;   
  37.     END LOOP;   
  38.   END IF;   
  39.   RETURN current_column(v_length_of_target);   
  40. END ld;  
CREATE OR REPLACE FUNCTION ld -- Levenshtein distance
  (p_source_string   IN VARCHAR2,
   p_target_string   IN VARCHAR2)
  RETURN                NUMBER
  DETERMINISTIC
AS
  v_length_of_source    NUMBER := NVL (LENGTH (p_source_string), 0);
  v_length_of_target    NUMBER := NVL (LENGTH (p_target_string), 0);
  TYPE mytabtype IS     TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  column_to_left        mytabtype;
  current_column        mytabtype;
  v_cost                NUMBER := 0;
BEGIN
  IF v_length_of_source = 0 THEN
    RETURN v_length_of_target;
  ELSIF v_length_of_target = 0 THEN
    RETURN v_length_of_source;
  ELSE
    FOR j IN 0 .. v_length_of_target LOOP
      column_to_left(j) := j;
    END LOOP;
    FOR i IN 1.. v_length_of_source LOOP
      current_column(0) := i;
      FOR j IN 1 .. v_length_of_target LOOP
        IF SUBSTR (p_source_string, i, 1) =
           SUBSTR (p_target_string, j, 1)
        THEN v_cost := 0;
        ELSE v_cost := 1;
        END IF;
        current_column(j) := LEAST (current_column(j-1) + 1,
                                    column_to_left(j) + 1,
                                    column_to_left(j-1) + v_cost);
      END LOOP;
      FOR j IN 0 .. v_length_of_target  LOOP
        column_to_left(j) := current_column(j);
      END LOOP;
    END LOOP;
  END IF;
  RETURN current_column(v_length_of_target);
END ld;

 

JAVA判断句子相似度代码:

Java代码 复制代码
  1. /*  
  2.  * 相似度公式:Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)   
  3.  * 设q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,  
  4.  * r是字符串2中存在,字符串1中不存在的单词总数,t是字符串1和字符串2中都不存在的单词总数。  
  5.  */  
  6. public static double getSimilar(String ora,String dest){   
  7.     double ff=0.0;   
  8.     Sentence oraSen = SplitWord.splitWord(ora);   
  9.     Sentence desSen = SplitWord.splitWord(dest);   
  10.     if(oraSen!=null&&desSen!=null){   
  11.         HashSet<String> oraS=oraSen.toWord();   
  12.         HashSet<String> desS=desSen.toWord();   
  13.         if(oraS!=null && desS!=null){   
  14.             int q=0,s=0,r=0;   
  15.             Iterator<String> ite=oraS.iterator();   
  16.             while(ite.hasNext()){   
  17.                 Object o=ite.next();   
  18.                 if(desS.contains(o)) ++q;   
  19.             }   
  20.             s=oraS.size()-q;   
  21.             r=desS.size()-s;   
  22.             return 2.00*q/ (2*q+1*r+1*s);   
  23.         }   
  24.         return 1;   
  25.     }   
  26.     return ff;   
  27. }  
    /*
     * 相似度公式:Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0) 
     * 设q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,
     * r是字符串2中存在,字符串1中不存在的单词总数,t是字符串1和字符串2中都不存在的单词总数。
     */
    public static double getSimilar(String ora,String dest){
    	double ff=0.0;
    	Sentence oraSen = SplitWord.splitWord(ora);
    	Sentence desSen = SplitWord.splitWord(dest);
    	if(oraSen!=null&&desSen!=null){
    		HashSet<String> oraS=oraSen.toWord();
    		HashSet<String> desS=desSen.toWord();
    		if(oraS!=null && desS!=null){
    			int q=0,s=0,r=0;
    			Iterator<String> ite=oraS.iterator();
    			while(ite.hasNext()){
    				Object o=ite.next();
    				if(desS.contains(o)) ++q;
    			}
    			s=oraS.size()-q;
    			r=desS.size()-s;
    			return 2.00*q/ (2*q+1*r+1*s);
    		}
    		return 1;
    	}
    	return ff;
    }

 大家不知道在处理中文句子相似度的时候有没有更好的方法呢?

分享到:
评论

相关推荐

    易语言文本相似度判断模块源码

    在这个“易语言文本相似度判断模块源码”中,我们可以学习到如何在易语言中实现文本相似度的计算,这对于信息检索、文本分析等领域非常重要。下面我们将深入探讨这个模块的核心知识点。 1. **文本相似度计算**: ...

    基于哈希感知的图像相似度判断算法

    在图像处理和计算机视觉领域,图像相似度判断是一项基础且重要的任务。基于哈希感知的图像相似度判断算法是其中一种高效的方法,尤其适用于大规模图像检索。本文将深入探讨这一算法的核心原理、实现方式以及其在Java...

    Android例子源码ClipPicture(仿微信截图相似度99%)

    "Android例子源码ClipPicture(仿微信截图相似度99%)"这个项目提供了一个高效的解决方案,它不仅高度模拟了微信截图的用户体验,还包含了多点触摸手势识别以及图片的放大缩小和平移功能。下面我们将深入探讨这个例子...

    知网语义相似度计算JAVA源码

    总的来说,知网语义相似度计算JAVA源码提供了在JAVA环境下进行语义分析的工具,对于理解和研究语义相似度计算有着重要的参考价值。通过深入研究和修改这个源码,开发者可以定制化自己的相似度计算方法,适应特定应用...

    10种轻量级人脸检测算法的比拼包含人脸关键点检测与对齐人脸特征向量提取和计算距离相似度python源码+模型+说明.zip

    在本资源中,我们主要探讨的是10种不同的轻量级人脸检测算法,这些算法不仅涉及人脸检测,还包括了关键点检测、对齐以及特征向量的提取和距离相似度计算。这些都是计算机视觉领域,尤其是人脸识别技术的重要组成部分...

    基于python的文本相似度计算系统源码数据库.docx

    本文主要探讨了一种基于 Python 开发的文本相似度计算系统,该系统能有效处理大量文本数据,应用于信息检索、推荐系统等领域。 **一、系统概述** 1. **文本预处理**:在计算文本相似度之前,首先对原始文本进行...

    图形相似度比较

    这个主题主要探讨如何衡量和判断两个图形之间的相似性,以便进行有效的图像处理和分析。这里我们将根据提供的标签和资源,深入探讨相关知识点。 首先,“源码”标签暗示我们将涉及编程实现,可能是用Python、Java或...

    灰度值的空间向量图像相似度算法源码-易语言

    本文将深入探讨这个算法,并结合易语言(Easy Language)的源码进行详细解析。 首先,我们需要理解灰度值的概念。在数字图像处理中,彩色图像通常会转换为灰度图像,以便于分析和处理。灰度值代表像素的亮度,它是...

    易语言向量法计算文本相似度

    这里我们将深入探讨易语言中的向量法计算文本相似度的原理和实现。 向量法,通常指的是词袋模型(Bag-of-Words Model)或TF-IDF(Term Frequency-Inverse Document Frequency)模型,这些方法将文本转化为数值向量...

    各程序程序代码的相似度

    本文将深入探讨这个主题,基于标题“各程序程序代码的相似度”和描述“对于不同的代码,根据一些关键字的个数,看程序是否相似,个数越接近,相似度越高”。 首先,我们要理解什么是代码相似度。代码相似度是指两段...

    孪生网络-基于Pytorch实现Siamese孪生神经网络-支持图片相似度比较-附项目源码-优质项目实战.zip

    接下来,通过一个距离度量函数(如欧氏距离或余弦相似度)计算这两个特征向量的相似度,从而判断两幅图片是否相似。 在PyTorch中,我们可以定义一个模型类,包含两个共享权重的子模型,这两个子模型可以看作是网络...

    人工智能大作业:关于计算文本相似度的深度神经网络模型与算法研究分析(BERT、SentenceBERT、SimCSE).zip

    在本项目中,我们主要探讨的是人工智能领域的一个关键任务——计算文本相似度,这涉及到深度学习、机器学习以及自然语言处理等多方面的技术。通过使用深度神经网络模型,尤其是BERT(Bidirectional Encoder ...

    弦相似算法计算 短文本相似度

    这里我们将详细探讨弦相似性算法以及它在处理短文本时的应用。 1. 弦相似性(Levenshtein Distance): 弦相似性,也称为编辑距离,是由俄国科学家瓦迪姆·列文斯坦提出的一种衡量两个字符串差异的方法。它定义为...

    易语言源码人脸矩形识别易语言源码.rar

    例如,可以使用预训练的FaceNet模型,通过提取人脸的嵌入向量并计算相似度来判断是否为同一人。 5. 实时性与性能优化: 对于实时性要求较高的应用场景,如视频流处理,易语言源码需要考虑性能优化,如多线程处理、...

    基于android opencv图片相似度计算结构相似性感知哈希算法轮廓直线检测圆检测直线交点旋转角度矫正图像匹配灰度.zip

    这个压缩包中的源码可能是一个完整的毕业设计项目,涵盖了多个核心的计算机视觉技术。接下来,我们将深入探讨这些关键技术点。 首先,**图片相似度计算**是通过比较两幅图像之间的差异来评估它们的相似程度。在...

    C# 对比两个字符串的相似度.zip

    本文将深入探讨如何在C#中实现字符串的相似度比较,基于提供的压缩包文件“C# 对比两个字符串的相似度.zip”,我们可以推测这是一个包含源码示例的资源,用于演示如何在C#中计算两个字符串之间的相似度。 字符串...

    MATLAB基于余弦形状相似度的书法字识别.zip

    在书法字识别中,它可以用来比较两个汉字的形状特征,通过计算它们在特征空间中的夹角余弦值来判断它们的相似程度。 3. **形状特征提取**:在识别书法字之前,必须先提取出每个字的形状特征。这通常包括轮廓检测、...

    易语言源码易语言取拼音对比源码.rar

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的用户也能参与编程。这个“易语言源码易语言取拼音对比源码.rar”压缩包中包含的是易语言的源代码,主要...

    指纹识别技术详解源码

    在本"指纹识别技术详解源码"中,我们将深入探讨这一技术的实现原理、核心代码及其在C#编程语言中的应用。 首先,指纹识别的基础在于指纹的唯一性和稳定性。每个人的指纹都是独一无二的,且在一生中不会改变,这使得...

Global site tag (gtag.js) - Google Analytics