首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C或Swift中的Jaro Winkler距离

Jaro Winkler距离是一种用于衡量字符串相似性的算法,常用于数据匹配、拼写纠错和文本分类等应用中。它可以计算两个字符串之间的相似程度,并返回一个范围在0到1之间的值,值越接近1表示字符串越相似。

该算法主要基于两个字符串之间的匹配项、字符顺序以及前缀匹配项的权重。在Objective-C或Swift中,可以使用以下代码示例来计算Jaro Winkler距离:

Objective-C示例代码:

代码语言:txt
复制
- (CGFloat)jaroWinklerDistance:(NSString *)str1 withString:(NSString *)str2 {
    NSInteger len1 = str1.length;
    NSInteger len2 = str2.length;
    
    if (len1 == 0 && len2 == 0) {
        return 1.0;
    }
    
    NSInteger matchDistance = MAX(len1, len2) / 2 - 1;
    NSMutableCharacterSet *commonSet = [NSMutableCharacterSet new];
    
    NSMutableString *commonChars1 = [NSMutableString new];
    NSMutableString *commonChars2 = [NSMutableString new];
    
    NSInteger matchingCharacters = 0;
    
    for (NSInteger i = 0; i < len1; i++) {
        NSInteger start = MAX(0, i - matchDistance);
        NSInteger end = MIN(i + matchDistance + 1, len2);
        
        NSRange range = [str2 rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:[str1 substringWithRange:NSMakeRange(i, 1)]] options:NSLiteralSearch range:NSMakeRange(start, end - start)];
        
        if (range.location != NSNotFound) {
            [commonChars1 appendString:[str1 substringWithRange:NSMakeRange(i, 1)]];
            [commonChars2 appendString:[str2 substringWithRange:range]];
            [commonSet addCharactersInString:[str1 substringWithRange:NSMakeRange(i, 1)]];
            matchingCharacters++;
        }
    }
    
    if (matchingCharacters == 0) {
        return 0.0;
    }
    
    NSInteger transpositions = 0;
    
    for (NSInteger i = 0; i < commonChars1.length; i++) {
        if (![commonChars1 characterAtIndex:i] == [commonChars2 characterAtIndex:i]) {
            transpositions++;
        }
    }
    
    transpositions /= 2;
    
    CGFloat jaroDistance = (CGFloat)matchingCharacters / len1;
    
    CGFloat prefixScale = 0.1;
    NSInteger prefixLength = MIN(4, MIN(len1, len2));
    
    CGFloat commonPrefixLength = 0;
    
    for (NSInteger i = 0; i < prefixLength; i++) {
        if ([str1 characterAtIndex:i] == [str2 characterAtIndex:i]) {
            commonPrefixLength++;
        } else {
            break;
        }
    }
    
    return jaroDistance + prefixScale * (CGFloat)commonPrefixLength * (1.0 - jaroDistance);
}

Swift示例代码:

代码语言:txt
复制
func jaroWinklerDistance(str1: String, str2: String) -> CGFloat {
    let len1 = str1.count
    let len2 = str2.count
    
    if len1 == 0 && len2 == 0 {
        return 1.0
    }
    
    let matchDistance = max(len1, len2) / 2 - 1
    let commonSet = NSMutableCharacterSet()
    
    var commonChars1 = ""
    var commonChars2 = ""
    
    var matchingCharacters = 0
    
    for i in 0..<len1 {
        let start = max(0, i - matchDistance)
        let end = min(i + matchDistance + 1, len2)
        
        if let range = str2.rangeOfCharacter(from: CharacterSet(charactersIn: String(str1[str1.index(str1.startIndex, offsetBy: i)]))), options: .literal, range: Range(NSRange(location: start, length: end - start), in: str2)) {
            commonChars1 += String(str1[str1.index(str1.startIndex, offsetBy: i)])
            commonChars2 += String(str2[range])
            commonSet.addCharacters(in: String(str1[str1.index(str1.startIndex, offsetBy: i)]))
            matchingCharacters += 1
        }
    }
    
    if matchingCharacters == 0 {
        return 0.0
    }
    
    var transpositions = 0
    
    for i in 0..<commonChars1.count {
        if Array(commonChars1)[i] != Array(commonChars2)[i] {
            transpositions += 1
        }
    }
    
    transpositions /= 2
    
    let jaroDistance = CGFloat(matchingCharacters) / CGFloat(len1)
    
    let prefixScale: CGFloat = 0.1
    let prefixLength = min(4, min(len1, len2))
    
    var commonPrefixLength = 0
    
    for i in 0..<prefixLength {
        if Array(str1)[i] == Array(str2)[i] {
            commonPrefixLength += 1
        } else {
            break
        }
    }
    
    return jaroDistance + prefixScale * CGFloat(commonPrefixLength) * (1.0 - jaroDistance)
}

使用该算法计算字符串相似性时,可以根据返回的距离值进行相似度的判断和处理。在具体应用中,可以根据业务需求使用该算法来进行搜索、推荐和智能匹配等场景。

腾讯云提供了一系列云计算相关的产品,如云服务器、容器服务、数据库、人工智能和大数据分析等。如果想了解更多关于腾讯云的产品和服务信息,可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Oracle 数据库中的数据质量运算符

支持的算法有: LEVENSHTEIN 对应于 UTL_MATCH.EDIT_DISTANCE 或 UTL_MATCH.EDIT_SIMILARITY,并给出字符编辑距离或相似性的度量。...DAMERAU_LEVENSHTEIN 距离与经典 LEVENSHTEIN 距离的不同之处在于,除了三种经典的单字符编辑操作(插入、删除和替换)之外,其允许的操作中还包括转置。...JARO_WINKLER 对应于 UTL_MATCH.JARO_WINKLER(0-1 之间的百分比)或 UTL_MATCH.JARO_WINKLER_SIMILARITY(相同,但范围为 0-100)...它计算以单词(而不是字母)作为匹配单位的两个短语的 LEVENSHTEIN 或编辑距离。 LONGEST_COMMON_SUBSTRING 查找两个字符串之间的最长公共子字符串。...如果指定 UNSCALED,则返回以下之一: LEVENSHTEIN 或编辑距离 JARO_WINKLER 百分比值 N-grams,公共子串的数量 LCS,最长公共子串的长度 select col1,

23110
  • NLP 点滴 :文本相似度 (上)

    距离 定义 Jaro Distance也是字符串相似性的一种度量方式,也是一种编辑距离,Jaro 距离越高本文相似性越高;而Jaro–Winkler distance是Jaro Distance的一个变种...而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为 的部分相同,则Jaro-Winkler Distance为:[1503285570954...)/100.0; // 计算 Jaro-Winkler score return matchScore; } 应用 在Wetest舆情监控中,我们在找寻游戏名简称和全称的对应关系时便使用到了...Jaro-Winkler score进行衡量,其中我们将Jaro分数大于0.6的认为是相似文本,之后在总的相似文本中提取最相似的作为匹配项,实现效果还不错: [1503285787141_4240_1503285787748....png] 其中冒号左边是待匹配项,右边是匹配项Jaro-Winkler score>,Jaro-Winkler score较高的一般都是正确的匹配项。

    5.4K21

    python 各类距离公式实现

    那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。...Levenshtein.jaro_winkler(s1, s2) 计算Jaro–Winkler距离,而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串...,如果前缀部分有长度为ι的部分相同,则Jaro-Winkler Distance为: ?...dj是两个字符串的Jaro Distance ι是前缀的相同的长度,但是规定最大为4 p则是调整分数的常数,规定不能超过25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1 这样,上面提及的...MARTHA和MARHTA的Jaro-Winkler Distance为: dw = 0.944 + (3 * 0.1(1 − 0.944)) = 0.961 9.

    7.8K20

    Jaro-Winkler Distance JAVA代码实现版

    与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1....那么这两个字符串的Jaro Distance即为: 而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为 的部分相同...,则Jaro-Winkler Distance为: dj是两个字符串的Jaro Distance 是前缀的相同的长度,但是规定最大为4 p则是调整分数的常数,规定不能超过0.25,不然可能出现dw...大于1的情况,Winkler将这个常数定义为0.1 这样,上面提及的MARTHA和MARHTA的Jaro-Winkler Distance为: dw = 0.944 + (3 * 0.1(1 − 0.944...)) = 0.961 以上资料来源于维基百科: http://en.wikipedia.org/wiki/Jaro-Winkler_distance

    51930

    textdistance:文本相似度计算

    在日常编程中,我们经常需要计算两个字符串之间的相似度 - 比如搜索引擎的模糊匹配、拼写检查、DNA序列比对等场景。...这个库最让人惊艳的地方在于,它集成了超过30种文本距离/相似度算法,从简单的编辑距离到复杂的声学算法,应有尽有。...输出: 1# 莱文斯坦距离print(textdistance.levenshtein('python', 'peithen')) # 输出: 2# Jaro-Winkler相似度print(textdistance.jaro_winkler...query, choices, threshold=0.6): results = [] for choice in choices: score = textdistance.jaro_winkler...扩展性强,可自定义距离算法不过它也有一些小缺点,比如文档相对简单,某些高级特性需要看源码才能发现。但瑕不掩瑜,它依然是我最推荐的文本相似度计算库。

    14310

    机器学习中“距离与相似度”计算汇总

    欧几里得距离 在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。欧几里得距离有时候有称欧氏距离,在数据分析及挖掘中经常会被使用到,例如聚类或计算相似度。 ?...公式中包含了欧氏距离、曼哈顿距离和切比雪夫距离。 闵可夫斯基距离的定义: 假设两点: ? 明氏距离公式为: ? p取1或2时的明氏距离是最为常用的,p=2即为欧氏距离,而p=1时则为曼哈顿距离。...Levenshtein.jaro_winkler(s1, s2) 计算Jaro–Winkler距离,而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串...,如果前缀部分有长度为ι的部分相同,则Jaro-Winkler Distance为: ?...dj是两个字符串的Jaro Distance ι是前缀的相同的长度,但是规定最大为4 p则是调整分数的常数,规定不能超过25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1 这样,上面提及的

    3.3K10

    2022年你应该知道的五大机器学习算法,解释型算法、降维算法榜上有名

    这里的全班协作就类似于一个集合学习算法,即由几个较小的算法同时工作,并形成最终的答案。 应用 集合学习算法主要应用于回归和分类问题或监督学习问题。...应用 解释性模型通常用于需要作出解释的场景。比如展示 「为什么 」做出某个决定,或者解释两个或多个变量之间「如何」相互关联。在实践中,你的机器学习模型的可解释性与机器学习模型本身的性能一样重要。...5 相似性算法 (KNN、欧几里得距离、余弦、列文斯坦、Jaro-Winkler、SVD...) 什么是相似性算法? 相似性算法是指那些计算记录/节点/数据点/文本对的相似性的算法。...欧几里德距离:一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。...列文施泰因算法:指两个字串之间,由一个转成另一个所需的最少编辑操作次数。Jaro-Winkler算法:Jaro–Winkler distance 适合于较短的字符之间计算相似度。

    69210

    5大常见机器学习算法

    这里的全班协作就类似于一个集合学习算法,即由几个较小的算法同时工作,并形成最终的答案。 算法应用 集合学习算法主要应用于回归和分类问题或监督学习问题。...算法应用 解释性模型通常用于需要作出解释的场景。比如展示 「为什么 」做出某个决定,或者解释两个或多个变量之间「如何」相互关联。 在实践中,你的机器学习模型的可解释性与机器学习模型本身的性能一样重要。...相似性算法 KNN、欧几里得距离、余弦、列文斯坦、Jaro-Winkler、SVD… 什么是相似性算法 相似性算法是指那些计算记录/节点/数据点/文本对的相似性的算法。...欧几里德距离:一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。...列文施泰因算法:指两个字串之间,由一个转成另一个所需的最少编辑操作次数。 Jaro-Winkler算法:Jaro–Winkler distance 适合于较短的字符之间计算相似度。

    25320

    【词库】Python关键词筛选分类,Levenshtein编辑距离算法分词

    Python关键词筛选分类,使用Levenshtein模块进行关键词筛选及分类,使用编辑距离的算法,速度相当快。...Levenshtein Levenshtein距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。...inverse() #用于反转所有的编辑操作序列 jaro() #计算2个字符串的相识度,这个给与相同的字符更高的权重指数 jaro_winkler() #计算2个字符串的相识度,相对于jaro 他给相识的字符串添加了更高的权重指数...-1,相同后面进行对比不同,最后2个对比相同返回0 median() #找到一个列表中所有字符串中相同的元素,并且将这些元素整合,找到最接近这些元素的值,可以不是字符串中的值。...simi=Levenshtein.jaro_winkler(kw,muci) if simi >= 0.8: result[muci]["list

    3K20

    5 大常用机器学习模型类型总结

    这里的全班协作就类似于一个集成学习算法,即由几个较小的算法同时工作,并形成最终的答案。 应用 集成学习算法主要应用于回归和分类问题或监督学习问题。...应用 解释性模型通常用于需要作出解释的场景。比如展示 「为什么 」做出某个决定,或者解释两个或多个变量之间「如何」相互关联。 在实践中,你的机器学习模型的可解释性与机器学习模型本身的性能一样重要。...05 相似性算法 (KNN、欧几里得距离、余弦、列文斯坦、Jaro-Winkler、SVD...)...欧几里德距离: 一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。...列文施泰因算法: 指两个字串之间,由一个转成另一个所需的最少编辑操作次数。 Jaro-Winkler算法: Jaro–Winkler distance 适合于较短的字符之间计算相似度。

    2.9K20

    Kaggle知识点:文本相似度计算方法

    相似性度量 (Similarity Measurement) 用于衡量两个元素之间的相似性程度或两者之间的距离 (Distance)。...Jaro-Winkler 距离 对于给定的两个字符串 ? 和 ? ,Jaro 相似度定义为: ? 其中, ? 为字符串 ? 的长度, ? 为匹配的字符的个数, ? 换位数目的一半。...,尽管 C, T 均出现在两个字符串中,但是他们的距离超过了 1 (即, ? ),因此 ? 。 Jaro-Winkler 相似度给予了起始部分相同的字符串更高的分数,其定义为: ? 其中, ?...的 Jaro 相似度, ? 为共同前缀的长度 (规定不超过 ? ), ? 为调整系数 (规定不超过 ? ),Winkler 将其设置为 ? 。...对于这类问题常见的解决方式是对长文本利用 TF-IDF,BM25等方法或进行主题建模后,再同查询的关键词进行匹配计算相似度度。 长文本 v.s.

    2.9K10

    创建一个 AI 蜜罐来与攻击者进行复杂的互动

    在网络安全中,蜜罐是专门设计用于吸引和分析网络攻击的诱饵系统,充当潜在入侵者的陷阱。 通过模仿合法目标,蜜罐将攻击者从真实资产中转移出来,同时收集有关其方法和行为的情报。...Abdullah Canbaz 最近开发了一个 AI 蜜罐,用于与老练的黑客互动。 传统蜜罐的范围通常有从模拟基本网络服务的低交互蜜罐到模拟整个网络基础设施的高交互蜜罐。...评估指标包括“余弦相似度”、“Jaro-Winkler 相似度”和“Levenshtein 距离”,以根据预期响应评估模型的输出。...但是,这里的挑战仍然存在,如何平衡计算效率、避免老练的黑客的检测以及保持真实交互行为依然是不小的问题。...无论如何,将 LLM 集成到蜜罐技术代表了网络安全的重大进步,它为不断变化的网络威胁提供了更加动态和适应性的防御。 来源:cybersecuritynews

    21510

    iOS中的单例你用对了么?Objective-C中的单例Swift中的单例

    单例模式怎么定义的,可能在不同的语言,不同的书中不完全一样,但是概况开来都应该是:一个类有且仅有一个实例,并且自行实例化向整个系统提供。...Objective-C中的单例 我们通常在OC中实现一个单例方法都是这样: static HLTestObject *instance = nil; + (instancetype)sharedInstance...Swift中的单例 利用Swift中的一些特性,Swift中的单例可以超级简单,like this: class HLTestObject: NSObject { static let sharedInstance...) { object = NSObject() arrayM = NSMutableArray() super.init() } } 当然,由于Swift...的特性,在Swift中创建单例的方式也不止一种,需要注意的是要确保该类有且仅有一个实例就OK了。

    71530

    NLP 点滴 :文本相似度 (下)

    词语之间的相似性可以通过词向量来表示 不同于之前我们讨论的One-hot Representation表示方式,论文中指出在进行训练时,向量空间表达的词语维度一般为30、60或100,远远小于词典长度17000...而神经网络语言模型可以做到这一点,原因是:1)在神经网络语言模型中假设了相似的词在词向量上也是相似的,即向量空间中的距离相近,2)模型中的概率函数关于词向量是光滑的,那么词向量的一个小变化对概率的影响也是一个小变化...我们最终训练得到的词向量,在整个神经网络模型中,似乎只是一个参数,但是这个副作用也正是word2vec中的核心产物。...围绕本篇博文的主题,即文本相似度的度量,word2vec产生的词向量可以非常方便的让我们做这件事情,利用欧氏距离或者cos都可以。...Wetest舆情:http://wetest.qq.com/bee/ 参考文献 莱文斯坦距离 Commons Lang Jaro–Winkler distance 字符串相似算法-(1) Jaro-Winkler

    3.4K21

    在Kettle里使用参照表进行数据校验(流查询实现)

    参照表一个常见的用途就是做数据的查询和检验。提供一个输入字段,如果输入字段里的值没有匹配上,就给对应的数据行做一个错误标志。...根据PC4_1字段里的四位数字,再使用“流查询”步骤从参照表中查询城市名称。...这里设置的默认值的前缀和后缀都是***,这样设置有两个目的:首先,检查数据的时候比较容易找到这些异常数据;其次,查询后在模糊匹配原始输入的城市名时,这个默认值不会和原来的任何城市名有相似度。...后面模糊查询的目的主要是为了检查一些拼写或完整性错误。...再使用另一个计算器步骤,把City和RefCity作为字段A和字段B,使用Jaro-Winkler匹配算法,把新生成的字段命名为cityscore。此时预览数据,可以看到如下图所示的结果。 ?

    2.7K11

    这门「没落」语言时薪451元,自由职业平台Upwork公布兼职语言薪资排行

    在最新的一份调查中,Upwork 公布了 15 种兼职收入最高的编程语言,Objective-C 以时薪 66 美元位居榜首。...Objective-C 的流行也要归功于 iPhone 的成功。但近年来,苹果一直想让开发者放弃 Objective-C,转向 Swift。...Swift 是苹果在 WWDC2014 发布的一门编程语言,用来摆脱 Objective-C 的束缚,具有 “快速、现代、安全、互动” 的特点。...在这五年的时间里,我们的确见证了 Swift 的崛起和 Objective-C 的没落,虽然前者彻底取代后者还有很长一段距离。...其次,随着越来越多的开发者转向 Swift,愿意去学或从事 Objective-C 开发的程序员越来越少,这就造成了一种供需的不平衡。前段时间 COBOL 的「翻红」也是一个道理。

    98220

    打造属于你自己的乐高积木

    当然,要认真地写作,光靠记忆是不够的,案头(或者电脑中)还得堆着积累已久的读书笔记。这些笔记或散落在一部部书的眉边,或者置身于 evernote 的一篇篇 note 中。...但在 chaining 的过程中,绕不过去的数据类型是:maybe(option)和 exception。...比如说 elixir 就放了个彩蛋,在其类库里偷偷放上了这样的字符串相关性分析的函数(据我所知,其它语言都没有在 string 的类库中加这个): iex(1)> String.jaro_distance...("tyr","try") 0.5555555555555555 (其实 jaro_distance 也不算彩蛋了,可能考虑到它在 CLI 中应用广泛,所以直接内置了) 类似的字符串相似性分析,clojure...: [Function: lk], jaro_winkler: [Function], tversky: { [Function: c] v: 0, A: [Function], m

    98480

    Swift和Objective-C混编在有赞移动的实践

    )中导入需要暴露给 Swift 模块的 Objective-C 类,即可在 Swift 中访问相应 Objective-C 的类和方法 Objective-C 访问 Swift 在 Objective-C...用 Swift Module 系统,需要用到的 Objective-C 类用 import xxx 进行引用,即可在 Swift 中访问相应的 Objective-C 的类和方法 Objective-C...这样做的主要意义是: 语义上完整描述了一个框架的作用 提高编译时的可扩展性,同一模块只需编译或导入一次,避免了头文件的多次引用、解析 减少碎片化,每个模块只处理一次,环境的变化不会导致不一致 3.2 modulemap...5.5 Swift 调用 Objective-C 将 Swift 模块文件中,用import xxx 的形式进行模块的引用,包括 Objective-C 的二/三方库 5.6 Objective-C 调用...Swift Swift 类中将需要暴露给 Objective-C 模块引用的类,用 public 申明 Swift 类中需要暴露给 Objective-C 的方法要用关键字 @objc 在 Objective-C

    2.3K20

    Swift 是猴还是猿?

    即搞定,不再需要像oc里面需要写if判断或是问号表达式,Swift变得更加简洁。 布尔值 在C/Objective-C中,if、while、for之后的判断式并不需要一定传入布尔类型。...9.强制使用大括号 在C/Objective-C中,if、while、for之后的语句假如只有一行,是可以省略掉大括号的 。...循环、自增、赋值、字符串数组处理、value为字符串或数值的字典处理操作,Swift性能不如Objective-C; c. 整型数组处理,Swift优于Objective-C; d....其它的改动这里不再详述,请参阅苹果官方文档。 七、Swift的当前缺陷 Swift所面临的问题,也即到目前为止大多数程序员吐槽和诟病的关于动态特性(或叫“反射特性”,类似Java中的反射)。...Swift并非在C或OC基础上进行开发,而是重新设计和布局,Swift的目标在于具备处理广泛问题的能力,包括服务器端开发和系统编程。

    3.9K30
    领券