编辑距离

动态规划-编辑距离

◇◆丶佛笑我妖孽 提交于 2019-12-01 08:59:19
LeetCode72题: 1. 根据str1和str2的长度构建空矩阵 2. 将矩阵第一行和第二行赋上步数,如下,从左往右看,数字代表由最左边空字符''变为'j','ja',......,'jarrry'等的操作总步数 3. 从矩阵第二行开始遍历(即range(1,len(str1)+1)),str1的每个字符与str2中的'j','ja',......,'jarrry'比较 如果相等,则步数d为0 如果不等,步数d为1 此位置的总步数为matrix[i][j-1]+1, matrix[i-1][j], matrix[i-1][j-1]+d的最小值 4. 最终的总步数为matrix[len(str1)][len(str2)],即矩阵右下角的数字 下图是动态规划路径: python代码: def edit_distance(str1, str2): len1, len2 = len(str1), len(str2) matrix = [[0 for _ in range(len2+1)] for _ in range(len1+1)] for i in range(len1+1): matrix[i][0] = i for j in range(len2+1): matrix[0][j] = j for i in range(1, len1+1): # 注意从1开始 for j in

掌握动态规划,助你成为优秀的算法工程师

余生颓废 提交于 2019-11-30 18:08:25
1.导论 相信很多同学已经在为今年的校招做准备了,随着AI的火热,越来越多的同学涌入了算法的行当之中。那去年校招的算法岗是有多火热?在知乎上看到这么一条帖子,先不说内容哈,足足400w+的阅读量啊。 不光是计算机或软件专业的学生,很多电子,通信,自动化等相关专业的同学也吸引了进来。当然,这应该是件好事。但是相当一部分同学,在学习的过程中,尤其是刚入门的时候,可能会有这样一个疑问:算法工程师的算法,为什么不是指《算法导论》中的算法(以下称为经典算法,用以区分),而是指机器学习里的算法。都叫算法(Algorithm),但好像不是一回事啊,两者有什么关系,又有什么区别呢? 本文试图通过动态规划这一经典算法中的重要内容,同时又在机器学习算法中有着广泛的应用,来简单探讨一下这两种“算法”。 2.动态规划 首先,动态规划(Dynamic Programming)是《算法导论》中的重要章节,同时也是在机器学习算法中有着非常重要应用的一种优化算法。可以说是,无论是否是算法工程师都应该掌握的一种算法。再功利一点说,动态规划也是诸多面试官特别喜欢考的一种题型,下面就带大家稍微温故一下。 按照教材[1]的介绍,动态规划通常需要按如下4个步骤来进行设计: 刻画一个最优解的结构特征。 递归地定义最优解的值。 计算最优解的值,通常采用自底向上的方法。 利用计算出信息构造一个最优解。 简单点说

python编辑距离

我的梦境 提交于 2019-11-30 00:44:05
import numpy as np import json import codecs # 计算编辑距离 def edit_distance(word1, word2): len1 = len(word1) len2 = len(word2) dp = np.zeros((len1 + 1, len2 + 1)) for i in range(len1 + 1): dp[i][0] = i for j in range(len2 + 1): dp[0][j] = j for i in range(1, len1 + 1): for j in range(1, len2 + 1): if word1[i - 1] == word2[j - 1]: temp = 0 else: temp = 1 dp[i][j] = min(dp[i - 1][j - 1] + temp, min(dp[i - 1][j] + 1, dp[i][j - 1] + 1)) return dp[len1][len2] # 190801 # 根据编辑距离计算相似度 def simility(word1, word2): res = edit_distance(word1, word2) maxLen = max(len(word1), len(word2)) return 1-res*1.0/maxLen

最短编辑距离

試著忘記壹切 提交于 2019-11-29 12:32:35
场景 在搜索引擎项目中,我用到了最短编辑距离算法,用于对用户输入的查询进行纠错,从而优化查询结果。比如说,我们在输入英文单词的时候,由于疏忽或者记忆不准确,会有拼写错误的情况。以单词beautiful 为例,假设我们在搜索引擎中输入beauitful(我故意拼错了),看看会发生什么。 如下图所示,虽然我把这个单词拼错了,但是查询结果提示“including results for beautiful”,也就是说,它似乎知道我的查询输入拼写错误,并根据某种算法,给我推荐了一个与之最近似的单词(大概率就是本应正确拼写的单词)。在这里,就用到了最短编辑距离算法。这个场景,也称为模糊搜索。 最短编辑距离 什么是最短编辑距离呢?假定有两个字符串s1和s2,允许对字符串进行以下三种操作: 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 将字符串s1转换成字符串s2的最少操作次数就是字符串s1和字符串s2之间的最短编辑距离。两个字符串的最短编辑距离最短,意味着两个字符串越相似。 例1 :s1 = "geek",s2 = "gesek" 我们只需要在s1中插入一个字符,就可以把s1转换为s2,因此,这两个字符串的最短编辑距离就是1 例2:s1 = "cat",s2 = "cut" 我们只需要在s1中替换一个字符,就可以把s1转换为s2,因此,这两个字符串的最短编辑距离就是1 例3:s1

LeetCode 72. 编辑距离

心不动则不痛 提交于 2019-11-29 10:07:30
72. 编辑距离 题目描述 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 示例 1: 输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示例 2: 输入: word1 = "intention", word2 = "execution" 输出: 5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') 思路 本题用动态规划的方法来解。 第一步,定义状态。因为是两个单词,很容易发现仅仅一维是不能包含我们所有想要的信息,所以定义为二维数组 DP[i][j] ,表示 Word1 中的前 i 个字母组成的单词要想替换 Word2 中的前 j

leetcode72 编辑距离

耗尽温柔 提交于 2019-11-27 14:56:42
题目:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 输入: word1 = “horse”, word2 = “ros” 输出: 3 解释: horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’) 动态规划类型的困难题,理解起来还是有点难度的。 创建一个二维数组dp[i][j],i为word1的长度+1,j为word2的长度+1。为什么加一? 我们希望每个单词前面是从“空”开始的,就是“”。 引用一下leetcode的powcai大神的图: 这样做是为什么? 我们希望dp[i][j]表示word1[:i-1]变换成word2[:j-1]所需要的编辑次数。 那么初始化就很简单了,00位置是0,第一排和第一列分别是ros和horse从空字符串变成他们过程中需要的编辑次数,说白了就是一个字符一个字符加上去的。所以是123 和 12345。ok,初始化完成了。 接着开始往剩下的格子里添加数字了,我最初在这里没有很好的理解,最后反复自己尝试才稍微理解了一些。是这样的。 1.如果 word1[i]==word2[j],说明这个字符我们不用变动

Leetcode 72.编辑距离

前提是你 提交于 2019-11-27 13:12:57
Leetcode 72.编辑距离 题目描述 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示例 2: 输入: word1 = "intention", word2 = "execution" 输出: 5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/edit-distance 思路 ​ 动态规划 ​ 使用二维dp数组,dp[i] [ j]表示把word1[0,i)的子串转换成word2[0

利用word分词来计算文本相似度

懵懂的女人 提交于 2019-11-27 01:11:16
word分词 提供了多种文本相似度计算方式: 方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度 实现类: org.apdplat.word.analysis.CosineTextSimilarity 用法如下: String text1 = "我爱购物"; String text2 = "我爱读书"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new CosineTextSimilarity(); double score1pk1 = textSimilarity.similarScore(text1, text1); double score1pk2 = textSimilarity.similarScore(text1, text2); double score1pk3 = textSimilarity.similarScore(text1, text3); double score2pk2 = textSimilarity.similarScore(text2, text2); double score2pk3 = textSimilarity.similarScore(text2, text3); double score3pk3 = textSimilarity.similarScore

leetcode学习日记5-编辑距离

南楼画角 提交于 2019-11-26 20:44:55
leetcode学习日记5-编辑距离 给定两个单词word1和word2,计算出将word1转换成word2所使用的最少操作数。你可以对一个单词进行三种操作 插入一个字符 删除一个字符 替换一个字符 实例: 输入 word1=“horse”,word2=“rose” 输出 3 解释: horse->rorse rorse->rose rose->ros 思路: 动态规划 一个单词word1通过三种途径靠近下一个单词word2 考虑如果word1从0 ~ i-1位要和word2的0 ~ j-1位相同需要k步,则word1从0 ~ i位与word2的0 ~ j位相同需要几步? 分两种情况: 若word1的i位与word2的j位相同,那直接就搞定了,总共k步 若word1的i位与word2的j位不同,那就替换第i位,k+1 考虑如果word1从0 ~ i位要和word2的0 ~ j-1位相同需要k步,则word1从0 ~ i位与word20 ~ j位相同需要几步? k+1步,加上缺少的字符。 考虑如果word1从0 ~ i-1位要和word2的0 ~ j位相同需要k步,则word1从0 i-1位与word20 j位相同需要几步? k+1步,加上多余的字符。 通过以上总结可以得出动态规划的状态转移公式。 还缺少初始值和循环方式。由于缺少的是最小值,初始值都填最大值。