字符串相似度算法

相似度算法

Jaccard Similarity Coefficient、JaroWinkler 、Cosine Similarity、Levenshtein 距离编辑算法案例。

  • Jaccard相似性系数衡量两个集合的相似程度,通过计算两个集合的交集大小除以并集大小得出。适用于处理文本、推荐系统、生物信息学等领域
  • Cosine Similarity 余弦相似度用于度量两个向量之间的夹角余弦值,适用于文本相似性、信息检索和推荐系统等领域。它将向量投影到多维空间中,衡量它们的方向相似程度。
  • Levenshtein 将一个字符串转换为另一个字符串所需的最小编辑操作数,包括插入、删除和替换。常用于拼写纠错、基因序列比对等领域。
  • Jaro-Winkler距离衡量两个字符串的相似性,考虑字符匹配和位置,适用于姓名匹配、数据清洗等领域。

一、java实现

1.1 引入Maven依赖

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

1.2 Java测试类

import org.apache.commons.text.similarity.CosineDistance;
import org.apache.commons.text.similarity.JaccardDistance;
import org.apache.commons.text.similarity.JaroWinklerDistance;
import org.apache.commons.text.similarity.LevenshteinDistance;

public class EditDistanceTest {

    private Map<String, String> testData(){
        String goalName = "Dexter Morgan";
        HashMap<String, String> data = Maps.newHashMap();
        data.put("Jackson Morgan", goalName);
        data.put("Dex Morgan", goalName);
        data.put("Deter Morgan", goalName);
        data.put("Morgan", goalName);
        data.put("Morgan Dexter", goalName);
        data.put("MorganDexter", goalName);
        data.put("Dexter Morgan", goalName);
        data.put("DexterMorgan", goalName);
        data.put("DexterMorgan ", goalName);
        return data;
    }

    @Test
    public void testEditDistance(){

        for (Map.Entry<String, String> entry : testData().entrySet()) {

            //最后得分越高说明相似度越大, 0分表示没有任何相似度,1分则代表完全匹配
            System.out.printf("JaroWinklerDistance [%s],[%s]相似度 ===> [%s]%n", entry.getKey(), entry.getValue(),  (1-new JaroWinklerDistance().apply(entry.getKey(), entry.getValue())));

            //余弦相似度用于度量两个向量之间的夹角余弦值,适用于文本相似性、信息检索和推荐系统等领域。它将向量投影到多维空间中,衡量它们的方向相似程度。
            System.out.printf("CosineDistance 余弦相似度[%s],[%s]相似度 ===> [%s]%n", entry.getKey(), entry.getValue(),  (1- new CosineDistance().apply(entry.getKey(), entry.getValue())));

            //Jaccard相似性系数衡量两个集合的相似程度,通过计算两个集合的交集大小除以并集大小得出。适用于处理文本、推荐系统、生物信息学等领域。
            System.out.printf("JaccardDistance 杰卡德系数[%s],[%s]相似度 ===> [%s]%n", entry.getKey(), entry.getValue(),   (1-new JaccardDistance().apply(entry.getKey(), entry.getValue())));

            //两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
            Integer editLen = new LevenshteinDistance().apply(entry.getKey(), entry.getValue());
            System.out.printf("LevenshteinDistance 莱文斯坦距离[%s],[%s]相似度 ===> [%s]%n%n", entry.getKey(), entry.getValue(),    1 - (double)editLen / Math.max(entry.getKey().length() , entry.getValue().length()));
        }
    }

}

运行结果

JaroWinklerDistance [Dex Morgan],[Dexter Morgan]相似度 ===> [0.8994871794871795]
CosineDistance 余弦相似度[Dex Morgan],[Dexter Morgan]相似度 ===> [0.4999999999999999]
JaccardDistance 杰卡德系数[Dex Morgan],[Dexter Morgan]相似度 ===> [0.9090909090909091]
LevenshteinDistance 莱文斯坦距离[Dex Morgan],[Dexter Morgan]相似度 ===> [0.7692307692307692]

JaroWinklerDistance [Deter Morgan],[Dexter Morgan]相似度 ===> [0.9794871794871796]
CosineDistance 余弦相似度[Deter Morgan],[Dexter Morgan]相似度 ===> [0.4999999999999999]
JaccardDistance 杰卡德系数[Deter Morgan],[Dexter Morgan]相似度 ===> [0.9090909090909091]
LevenshteinDistance 莱文斯坦距离[Deter Morgan],[Dexter Morgan]相似度 ===> [0.9230769230769231]

JaroWinklerDistance [Morgan],[Dexter Morgan]相似度 ===> [0.4145299145299146]
CosineDistance 余弦相似度[Morgan],[Dexter Morgan]相似度 ===> [0.7071067811865475]
JaccardDistance 杰卡德系数[Morgan],[Dexter Morgan]相似度 ===> [0.5454545454545454]
LevenshteinDistance 莱文斯坦距离[Morgan],[Dexter Morgan]相似度 ===> [0.46153846153846156]

JaroWinklerDistance [DexterMorgan],[Dexter Morgan]相似度 ===> [0.9846153846153847]
CosineDistance 余弦相似度[DexterMorgan],[Dexter Morgan]相似度 ===> [0.0]
JaccardDistance 杰卡德系数[DexterMorgan],[Dexter Morgan]相似度 ===> [0.9090909090909091]
LevenshteinDistance 莱文斯坦距离[DexterMorgan],[Dexter Morgan]相似度 ===> [0.9230769230769231]

JaroWinklerDistance [Jackson Morgan],[Dexter Morgan]相似度 ===> [0.5128205128205128]
CosineDistance 余弦相似度[Jackson Morgan],[Dexter Morgan]相似度 ===> [0.4999999999999999]
JaccardDistance 杰卡德系数[Jackson Morgan],[Dexter Morgan]相似度 ===> [0.4666666666666667]
LevenshteinDistance 莱文斯坦距离[Jackson Morgan],[Dexter Morgan]相似度 ===> [0.5]

JaroWinklerDistance [DexterMorgan ],[Dexter Morgan]相似度 ===> [0.9692307692307692]
CosineDistance 余弦相似度[DexterMorgan ],[Dexter Morgan]相似度 ===> [0.0]
JaccardDistance 杰卡德系数[DexterMorgan ],[Dexter Morgan]相似度 ===> [1.0]
LevenshteinDistance 莱文斯坦距离[DexterMorgan ],[Dexter Morgan]相似度 ===> [0.8461538461538461]

JaroWinklerDistance [Dexter Morgan],[Dexter Morgan]相似度 ===> [1.0]
CosineDistance 余弦相似度[Dexter Morgan],[Dexter Morgan]相似度 ===> [0.9999999999999998]
JaccardDistance 杰卡德系数[Dexter Morgan],[Dexter Morgan]相似度 ===> [1.0]
LevenshteinDistance 莱文斯坦距离[Dexter Morgan],[Dexter Morgan]相似度 ===> [1.0]

JaroWinklerDistance [MorganDexter],[Dexter Morgan]相似度 ===> [0.38247863247863245]
CosineDistance 余弦相似度[MorganDexter],[Dexter Morgan]相似度 ===> [0.0]
JaccardDistance 杰卡德系数[MorganDexter],[Dexter Morgan]相似度 ===> [0.9090909090909091]
LevenshteinDistance 莱文斯坦距离[MorganDexter],[Dexter Morgan]相似度 ===> [0.0]

JaroWinklerDistance [Morgan Dexter],[Dexter Morgan]相似度 ===> [0.41346153846153855]
CosineDistance 余弦相似度[Morgan Dexter],[Dexter Morgan]相似度 ===> [0.9999999999999998]
JaccardDistance 杰卡德系数[Morgan Dexter],[Dexter Morgan]相似度 ===> [1.0]
LevenshteinDistance 莱文斯坦距离[Morgan Dexter],[Dexter Morgan]相似度 ===> [0.07692307692307687]

二、MySQL实现

2.1 Levenshtein(莱文斯坦距离)算法实现

自定义levenshtein函数

CREATE FUNCTION `levenshtein`(s1 varchar(255), s2 varchar(255)) RETURNS int(11)
    DETERMINISTIC
BEGIN
    DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
    DECLARE s1_char CHAR;
    DECLARE cv0, cv1 text;
    SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
    IF s1 = s2 THEN
        RETURN 0;
    ELSEIF s1_len = 0 THEN
        RETURN s2_len;
    ELSEIF s2_len = 0 THEN
        RETURN s1_len;
    ELSE
        WHILE j <= s2_len
            DO
                SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
            END WHILE;
        WHILE i <= s1_len
            DO
                SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
                WHILE j <= s2_len
                    DO
                        SET c = c + 1;
                        IF s1_char = SUBSTRING(s2, j, 1) THEN
                            SET cost = 0;
                        ELSE
                            SET cost = 1;
                        END IF;
                        SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                        IF c > c_temp THEN SET c = c_temp; END IF;
                        SET c_temp = CONV(HEX(SUBSTRING(cv1, j + 1, 1)), 16, 10) + 1;
                        IF c > c_temp THEN
                            SET c = c_temp;
                        END IF;
                        SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
                    END WHILE;
                SET cv1 = cv0, i = i + 1;
            END WHILE;
    END IF;
    RETURN c;
END

自定义levenshtein_ratio百分比函数

CREATE FUNCTION `levenshtein_ratio`(s1 varchar(255), s2 varchar(255)) RETURNS int(11)
    DETERMINISTIC
BEGIN
    DECLARE s1_len, s2_len, max_len INT;
    SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
    IF s1_len > s2_len THEN
        SET max_len = s1_len;
    ELSE
        SET max_len = s2_len;
    END IF;
    RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
END

使用方式(查询lastname是 jackson的 top10, 按照相似度倒排)

select levenshtein_ratio('jackson', last_name), last_name, first_name, full_name
from t_list_detail
where levenshtein_ratio('jackson', last_name) >= 40
order by levenshtein_ratio('jackson', last_name) desc
limit 10;

三、扩展:100余种相似性算法

算法简介应用场景
Jaccard相似性系数(Jaccard Similarity Coefficient)相似性系数衡量两个集合的相似程度,通过计算两个集合的交集大小除以并集大小得出。处理文本、推荐系统、生物信息学等领域。
余弦相似度(Cosine Similarity)用于度量两个向量之间的夹角余弦值,它将向量投影到多维空间中,衡量它们的方向相似程度。适用于文本相似性、信息检索和推荐系统等领域。
编辑距离(Edit Distance,Levenshtein Distance)编辑距离计算将一个字符串转换为另一个字符串所需的最小编辑操作数,包括插入、删除和替换。常用于拼写纠错、基因序列比对等领域。
汉明距离(Hamming Distance)汉明距离用于比较等长字符串,衡量两个字符串在相同位置上不同字符的数量。主要应用于错误检测和纠正码、信息编码等领域。
TF-IDF(Term Frequency-Inverse Document Frequency)TF-IDF用于衡量文本中某个词对于整个语料库的重要性,结合了词频和逆文档频率。信息检索、文本分类等领域有广泛应用。
Smith-Waterman算法Smith-Waterman算法是一种用于局部序列比对的动态规划算法常用于生物信息学中的DNA和蛋白质序列比对,能够找到相似片段而不仅仅是全局相似性。
Dice系数Dice系数衡量两个集合的相似程度,通过计算两个集合的交集大小的两倍除以它们的总大小之和。主要应用于图像分割、文本聚类等领域。
SimRankSimRank基于图结构,衡量两个节点之间的相似性,考虑到它们相连的节点以及这些相连节点之间的相似性。主要用于图数据、社交网络分析等领域。
Bert相似性算法基于预训练的Transformer模型Bert,可以通过计算两个文本之间某些层的输出相似度来衡量文本相似性适用于多种自然语言处理任务。
Monge-Elkan算法Monge-Elkan算法基于一种分块匹配策略,将字符串分成多个子串,计算子串之间的相似度适用于字符串匹配、信息检索等领域。
Damerau-Levenshtein距离Damerau-Levenshtein距离是编辑距离的扩展,除了插入、删除、替换操作,还包括相邻字符交换操作适用于拼写纠错等领域。
Rabin-Karp算法Rabin-Karp算法使用哈希函数来在文本中寻找一个模式串,可以快速定位可能的匹配位置适用于文本搜索、字符串匹配等领域。
Jaro-Winkler距离Jaro-Winkler距离衡量两个字符串的相似性,考虑字符匹配和位置适用于姓名匹配、数据清洗等领域。
Soundex算法Soundex算法将单词映射到一组代表其发音的字符,用于在文本中查找发音相似的词主要用于名字和姓氏匹配
BWT-索引(Burrows-Wheeler Transform)BWT-索引通过将字符串转换为其Burrows-Wheeler变换,并构建索引以支持模式匹配和搜索在压缩和字符串搜索领域有应用
时序字符串相似性(Time Series String Similarity)时序字符串相似性算法结合时间序列和字符串信息用于时间序列数据分析、模式匹配和相似性计算。
知识增强在字符串相似性中的应用(Knowledge Enhancement for String Similarity)知识增强在字符串相似性中的应用方法通过整合外部知识库来提升相似性计算的准确性和语义理知识增强在字符串相似性中的应用方法通过整合外部知识库来提升相似性计算的准确性和语义理解
复杂网络相似性复杂网络相似性算法基于图结构,将字符串转化为网络节点,并通过网络特性来衡量字符串相似性适用于网络分析和社交网络等领域
SkipGram模型SkipGram模型是一种词向量表示方法,通过预测上下文来学习词之间的关系适用于衡量词语之间的语义相似性
基于注意力机制的字符串相似性(Attention-based String Similarity)基于注意力机制的字符串相似性算法通过计算字符级别的注意力权重,捕捉字符串中的关键信息适用于文本匹配和语义表示
混合模型在字符串相似性中的应用(Hybrid Models for String Similarity)混合模型在字符串相似性中的应用方法通过融合多种模型来平衡性能和准确性适用于多样性数据和任务
基于自监督学习的字符串相似性(Self-Supervised String Similarity)基于自监督学习的字符串相似性算法通过设计自监督任务来学习字符串表示适用于无监督场景下的文本匹配和相似性计算
字符串频谱分析(String Spectral Analysis)字符串频谱分析方法将字符串转化为频谱形式,通过频谱特征来计算字符串之间的相似性适用于信号处理和模式识别
图卷积网络在字符串相似性中的应用(Graph Convolutional Networks for String Similarity)图卷积网络在字符串相似性中的应用方法将字符串表示为图结构,并通过卷积操作来计算相似性适用于图数据和关系挖掘
FuzzyWuzzyFuzzyWuzzy是Python库,提供了多种模糊字符串匹配算法,如Levenshtein距离、部分字符串匹配等适用于拼写纠错、数据清洗等任务
Locality Sensitive Hashing (LSH)局部敏感哈希是一种用于高维数据相似性搜索的技术,通过哈希函数将相似的数据映射到相同的桶中适用于大规模数据处理
字符串卷积(String Convolution)字符串卷积是一种将两个字符串转化为多维向量,并进行卷积运算来衡量相似性的方法适用于文本分类和信息检索
计数-最小哈希(Count-Min Hashing)计数-最小哈希是一种用于频率统计和近似相似性计算的方法适用于大规模数据处理和推荐系统
主题模型(Topic Model)主题模型是一种用于文本分析的方法,通过将文本表示为主题的分布来衡量文本之间的相似性适用于文本聚类和推荐系统
概率有限状态自动机(Probabilistic Finite State Automaton)概率有限状态自动机是一种可以处理概率和不确定性的自动机模型适用于字符串识别、语音识别等领域
高阶近似匹配(High-Order Approximate Matching)高阶近似匹配算法通过考虑多个字符之间的关系来进行模糊匹配适用于模糊匹配和序列比对
主动学习在字符串相似性中的应用(Active Learning for String Similarity)主动学习在字符串相似性中的应用方法通过策略性地选择样本来增强模型适用于数据稀缺场景和标注成本较高的情况
网络嵌入在字符串相似性中的应用(Network Embedding for String Similarity)网络嵌入在字符串相似性中的应用方法通过将字符串映射到网络嵌入空间来计算相似性适用于关系分析和数据挖掘
生成对抗网络在字符串相似性中的应用(Generative Adversarial Networks for String Similarity)生成对抗网络在字符串相似性中的应用方法通过对抗训练来提升字符串表示和相似性计算的性能适用于生成和匹配任务
编辑脚本(Edit Script)编辑脚本是一个记录从一个字符串转换为另一个字符串的编辑操作序列的表示方法常用于序列比对和版本控制
基于知识图谱的相似性计算(Knowledge Graph-based Similarity)基于知识图谱的相似性计算算法利用实体关系和属性信息来计算字符串之间的相似性适用于知识图谱匹配和数据链接
词法相似性匹配(Lexical Similarity Matching)词法相似性匹配算法通过考虑词汇相似性来计算字符串之间的相似性适用于词汇分析和自然语言处理
Sørensen-Dice系数Sørensen-Dice系数是Dice系数的一种变体,衡量两个集合的相似程度通过计算两个集合的交集大小的两倍除以它们的总大小之和的平均
点云字符串匹配(PointCloud String Matching)点云字符串匹配算法将字符串转化为点云形式,通过点云匹配来计算字符串相似性适用于图像处理和文本检索
半监督学习在字符串相似性中的应用(Semi-Supervised Learning for String Similarity)半监督学习在字符串相似性中的应用方法通过利用有限标注数据和大量未标注数据来提升相似性计算的性能适用于数据稀缺场景
字符串分类器融合(String Classifier Fusion)字符串分类器融合方法将多个字符串分类器的输出进行融合,以提高分类和相似性计算的性能适用于文本分类和匹配任务
多模态字符串相似性(Multimodal String Similarity)多模态字符串相似性算法结合多种模态数据(文本、图像等)来计算字符串之间的相似性适用于多源数据和多模态任务
NGRASTNGRAST(Next Generation Rapid Sequence Similarity Tool)是一种用于高速DNA序列比对的算法借助于哈希函数和Bloom过滤器来提高匹配效率
进化算法在字符串相似性中的应用(Evolutionary Algorithms for String Similarity)进化算法在字符串相似性中的应用方法通过模拟自然进化过程来优化字符串匹配和相似性计算适用于复杂优化问题
多粒度字符串相似性(Multi-Granularity String Similarity)多粒度字符串相似性算法考虑多个不同粒度的特征来计算相似性从而捕捉字符串的多样性特征
字符串核函数(String Kernel)字符串核函数通过将字符串映射到高维空间,通过核方法衡量它们的相似性常用于文本分类、信息检索等领域
Trigram相似性Trigram相似性基于字符级别的N-gram模型,将文本切分成三个字符一组的片段用于衡量文本相似性
滑动窗口匹配滑动窗口匹配是一种基于窗口大小的方法,用于在文本中寻找模式串的位置适用于字符串搜索和文本处理
近邻链接(Nearest-Neighbor Join)近邻链接是一种数据库连接方法,基于相似性度量将两个表中的行连接起来适用于数据挖掘和关联分析
基于概率有限状态自动机的匹配(Probabilistic Finite State Automaton Matching)基于概率有限状态自动机的匹配算法结合自动机和概率模型,用于模式匹配和字符串搜索适用于语音识别和文本匹配
Hamming树Hamming树是一种用于快速计算Hamming距离的数据结构,通过在每一层划分字符集合来加速匹配计算常用于DNA序列比对等领域
缺失数据处理在字符串相似性中的应用(Missing Data Handling for String Similarity)缺失数据处理在字符串相似性中的应用方法通过处理缺失数据来提高相似性计算的鲁棒性和性能适用于实际数据场景
预训练模型在字符串相似性中的应用(Pretrained Models for String Similarity)预训练模型在字符串相似性中的应用方法通过在大规模数据上预训练模型,然后微调来提升相似性计算的性能适用于少样本和多任务场景
RagelRagel是一个用于构建有限状态机的工具,常用于文本解析和字符串匹配可以生成高效的匹配器用于文本分析等任务
Fingerprinting指纹算法将字符串映射为一组固定长度的哈希值,用于文本去重、查重等场景如Simhash算法、Minhash算法等
字符串重构(String Reconstruction)字符串重构方法通过从碎片信息中重建原始字符串用于文本恢复、信息提取和密码学等领域
基于位置的字符串相似性基于位置的字符串相似性算法考虑字符在字符串中的位置信息,通过位置对齐来衡量字符串的相似程度适用于基因序列比对等领域
集成学习在字符串相似性中的应用(Ensemble Learning for String Similarity)集成学习在字符串相似性中的应用方法通过整合多个基础模型来提升相似性计算的准确性和稳定性适用于多样性数据
Fuzzy String Matching模糊字符串匹配通过考虑字符替换、插入、删除等操作来衡量字符串的相似性适用于容错匹配、拼写纠错等场景
参数化后缀树(Parameterized Suffix Tree)参数化后缀树是一种用于字符串搜索和模式匹配的数据结构通过将模式串加入到后缀树中来实现高效匹配
深度字符串嵌入(Deep String Embedding)深度字符串嵌入方法利用神经网络模型,将字符串映射到低维向量空间适用于文本相似性计算和特征提取
加权字符串编辑距离(Weighted String Edit Distance)加权字符串编辑距离考虑不同字符之间的权重,适用于文本匹配和语音识别等领域能够更准确地衡量相似性
字符串语义编码(String Semantic Encoding)字符串语义编码通过结合字符级别和词级别的表示,捕捉字符串的语义信息适用于文本聚类和主题建模
Pattern HunterPattern Hunter是一种多模式匹配算法,使用预处理步骤和散列技术来加速模式匹配适用于大规模文本搜索
Wu-Manber算法Wu-Manber算法是一种用于多模式匹配的快速算法,适用于在文本中同时匹配多个模式串如敏感词过滤
Skip-gram with Negative Sampling (SGNS)Skip-gram with Negative Sampling是词向量训练的一种方法,通过对负样本进行采样来学习词语之间的关系适用于词向量表示和文本相似性计算
Gotoh算法Gotoh算法是一种局部序列比对算法,引入了Affine Gap模型来处理序列间的间隔用于蛋白质序列比对和DNA序列比对等领域
BLOSUM矩阵BLOSUM(Blocks Substitution Matrix)矩阵是一种用于衡量蛋白质序列相似性的评分矩阵常用于蛋白质比对和结构预测领域
线性散列字符串匹配(Linear Hashing String Matching)线性散列字符串匹配算法通过哈希函数和散列桶来加速模式匹配适用于大规模数据处理和文本搜索
Smith-Waterman-Gotoh算法SW-Gotoh算法在Smith-Waterman算法基础上优化,引入了Affine Gap模型,提供更准确的局部序列比对适用于生物信息学领域
Anagram算法Anagram算法用于判断两个字符串是否是字母重排后得到的,通过对字符进行排序或计数适用于文本处理、词汇分析等领域
动态规划在字符串匹配中的优化(Dynamic Programming Optimization for String Matching)动态规划在字符串匹配中的优化方法通过减少重复计算来提高匹配效率常用于序列比对和编辑距离计算
BioPythonBioPython是一个用于生物信息学分析的Python库,其中包含了多种字符串比对算法如Smith-Waterman、Needleman-Wunsch等
在线学习在字符串相似性中的应用(Online Learning for String Similarity)在线学习在字符串相似性中的应用方法通过逐步更新模型来适应新数据适用于数据流和实时匹配场景
Smith-Waterman-Cox算法SW-Cox算法是Smith-Waterman算法的扩展,考虑了序列间的线性空隙和线性惩罚,用于更精细的序列比对特别适用于生物信息学中的蛋白质比对
Winnowing算法Winnowing算法通过选择散列值的最小值来提取文本的指纹,用于文本查重和抄袭检测适用于互联网内容分析等领域
字符串特征选择(String Feature Selection)字符串特征选择方法通过选择最具有信息量的特征来进行相似性计算适用于维度高的数据和模型解释性要求
N-gram模型N-gram模型将文本切分成连续的n个字符或词用于衡量文本之间的相似性。常用于语言模型、文本分类等自然语言处理任务
指导性聚类在字符串相似性中的应用(Guided Clustering for String Similarity)指导性聚类在字符串相似性中的应用方法通过加入外部信息来引导聚类过程提高聚类的准确性和解释性
特征哈希法(Feature Hashing)特征哈希法通过哈希函数将字符串特征映射到固定大小的特征空间用于高维特征表示和文本分类
基于遗传算法的字符串匹配(Genetic Algorithm-based String Matching)基于遗传算法的字符串匹配方法通过模拟生物遗传过程来优化字符串匹配和相似性计算适用于复杂优化问题
Bitap算法Bitap算法用于模式串匹配,通过位运算和动态规划来实现适用于模糊匹配、正则表达式匹配等领域
Diff算法(Myers差分算法)Diff算法是一种用于比较两个字符串之间的差异的算法,基于Myers差分算法常用于版本控制和文本差异比较
解码器-编码器结构在字符串相似性中的应用(Decoder-Encoder Architecture for String Similarity)解码器-编码器结构在字符串相似性中通过解码器和编码器的协同工作来捕捉字符串关系适用于序列生成和相似性计算
不确定性建模在字符串相似性中的应用(Uncertainty Modeling for String Similarity)不确定性建模在字符串相似性中的应用方法通过引入不确定性估计来处理噪声和不确定数据提高相似性计算的鲁棒性
模糊集理论在字符串相似性中的应用(Fuzzy Set Theory for String Similarity)模糊集理论在字符串相似性中的应用方法通过考虑不确定性和模糊性来计算相似性适用于模糊数据和不确定性问题
Longest Common Subsequence (LCS)最长公共子序列是一种动态规划算法,用于计算两个序列的最长公共子序列适用于DNA序列比对、版本控制等领域
随机投影在字符串相似性中的应用(Random Projection for String Similarity)随机投影在字符串相似性中的应用方法通过随机映射来降低数据维度提高相似性计算的效率和准确性
SuperString Graph超级字符串图是一种基于图论的方法,将一组字符串表示为一个有向图通过计算最短超级字符串来衡量字符串的相似性
字符串对齐方法(String Alignment)字符串对齐方法通过考虑字符之间的对齐关系来计算字符串相似性适用于序列比对和文本匹配等领域
Rabin-Scott模型Rabin-Scott模型是一种自动机模型,用于模式匹配和字符串搜索可以高效地查找多个模式在文本中的位置
多序列比对多序列比对算法用于比较多个序列之间的相似性,通过考虑多个序列的关系来实现更精确的比对常用于生物信息学领域
迁移学习在字符串相似性中的应用(Transfer Learning for String Similarity)迁移学习在字符串相似性中的应用方法利用从其他任务学到的模型来提升字符串相似性计算的性能适用于数据稀缺场景
压缩字符串比对压缩字符串比对算法利用压缩技术来加速字符串比对,通过在压缩域中寻找相似性适用于大规模数据处理和数据压缩
Tversky系数Tversky系数是一种通用的集合相似性度量,可以通过调整参数来加权考虑交集和差集用于文本分类、推荐系统等领域
基于图的字符串相似性(Graph-based String Similarity)基于图的字符串相似性算法将字符串映射到图结构,并通过图算法来计算相似性适用于文本聚类和关系挖掘
局部灵活对齐(Partial Flexible Alignment)局部灵活对齐是一种在序列比对中允许不完全匹配的方法通过考虑部分匹配和相似性来捕捉序列之间的相似性
RapidMinerRapidMiner是一款数据挖掘和机器学习工具,其中包含各种字符串相似性匹配算法,如编辑距离、余弦相似度等用于文本分析、数据挖掘等领域
Shingling方法Shingling方法将文本转化为一组k个相邻的词或字符,然后计算它们的相似性常用于文本去重、抄袭检测等任务
基于语义的字符串相似性(Semantic-based String Similarity)基于语义的字符串相似性算法利用词向量或知识图谱来捕捉字符串之间的语义关系适用于文本相似性计算和推荐系统
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字符串相似度算法是用来比较两个字符串之间的相似程度的算法。常用的字符串相似度计算方法有编辑距离算法、余弦相似度算法Jaccard相似度算法等。其中,编辑距离算法是一种常用的字符串相似度计算方法,它通过计算两个字符串之间的最小编辑距离来衡量它们的相似程度。编辑距离指的是将一个字符串转换成另一个字符串所需的最少操作次数,包括插入、删除、替换三种操作。 编辑距离算法的实现可以采用动态规划的方法,具体步骤如下: 1. 初始化一个二维数组,数组的行数为第一个字符串的长度加1,列数为第二个字符串的长度加1。 2. 将第一行和第一列的值分别初始化为0到列数和0到行数。 3. 从第二行和第二列开始,遍历整个二维数组,计算每个位置的值。具体计算方法如下: - 如果第一个字符串的当前字符等于第二个字符串的当前字符,则该位置的值等于左上角位置的值。 - 否则,该位置的值等于左上角、左边、上边三个位置中的最小值加1。 4. 遍历完整个二维数组后,右下角的值即为两个字符串之间的最小编辑距离。 除了编辑距离算法,余弦相似度算法Jaccard相似度算法也是常用的字符串相似度计算方法。余弦相似度算法通过计算两个向量之间的夹角余弦值来衡量它们的相似程度,适用于文本分类、信息检索等领域。Jaccard相似度算法则通过计算两个集合的交集与并集之间的比值来衡量它们的相似程度,适用于推荐系统、社交网络等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值