首页
学习
活动
专区
工具
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,

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

    距离 定义 Jaro Distance也是字符串相似性一种度量方式,也是一种编辑距离Jaro 距离越高本文相似性越高;而JaroWinkler 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较高一般都是正确匹配项。

    5.3K21

    python 各类距离公式实现

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

    7.7K20

    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和MARHTAJaro-Winkler Distance为: dw = 0.944 + (3 * 0.1(1 − 0.944...)) = 0.961 以上资料来源于维基百科: http://en.wikipedia.org/wiki/Jaro-Winkler_distance

    48930

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

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

    3.3K10

    5大常见机器学习算法

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

    22820

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

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

    67410

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

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

    2.6K20

    【词库】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

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

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

    2.9K10

    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了。

    70830

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

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

    14010

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

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

    3.3K21

    在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 「翻红」也是一个道理。

    97020

    打造属于你自己乐高积木

    当然,要认真地写作,光靠记忆是不够,案头(或者电脑中)还得堆着积累已久读书笔记。这些笔记散落在一部部书眉边,或者置身于 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

    97680

    SwiftObjective-C混编在有赞移动实践

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

    2.2K20

    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并非在COC基础上进行开发,而是重新设计和布局,Swift目标在于具备处理广泛问题能力,包括服务器端开发和系统编程。

    3.9K30

    从 iPhone OS 1.0 到 iOS 14 编程语言演变

    在我之前关于苹果在 iOS 14 中使用了 Swift 和 SwiftUI 文章,我统计了 iOS 中使用 Swift 和 SwiftUI 内置应用程序数量。...这意味着 Objective-C C++ 应用程序正在使用 C 代码。所以我们无法知道 Objective-C C++ 应用程序是否使用了一些纯 C 代码。...因此,可以多次计算二进制文件,例如在 SwiftObjective-C 类别。二进制文件大小和重要性也没有考虑在内。...在 iOS 14 所有二进制文件: 88% 使用 Objective-C 17% 使用 C++ 8% 使用 Swift 8% 完全用 C 1% 使用 SwiftUI 一些有趣点: Objective-C...有趣一点是,iOS 14 88% 二进制文件直接间接依赖于 Objective-CObjective-C 仍然是 iOS 关键编程语言。

    2K30
    领券