编辑距离

二、正则表达式、文本正则化、编辑距离

心已入冬 提交于 2020-02-06 11:47:33
目录 二、正则表达式、文本正则化、编辑距离 2.1 Regular Expressions 2.1.1 基本的正则表达式模式 2.1.2 Disjunction(析取)、Grouping、以及优先级顺序 2.1.5 更多操作符(小结) 2.1.6 正则表达式替换、捕获组 2.2 Words 2.3 语料 2.4 文本正则化 2.4.1 利用 Unix 工具粗糙的分词和正则化 2.4.3 中文分词:最大匹配算法 2.4.4 词形还原以及词干提取 2.4.5 Byte-Pair Encoding(BPE) 2.5 最小编辑距离 最小编辑距离算法 参考: 二、正则表达式、文本正则化、编辑距离 文本正则化的目的是将文本转换成一种更方便使用、更标准的表达形式。正则表达是一个其中的一个强有力的工具。对于大部分语言的处理,通常第一步需要做分词,这一类任务叫做 Tokenization 。另一个很重要的步骤是 Lemmatization(词形还原,例如英文中 is, are, am 都是 be,对于中文这一步,主要是简繁转换等,主要用于处理词法复杂的语言) 。 Stemming(词干提取,通常是是分离后缀) 。文本正则化通常也包含 句子分割 ,例如以句号或者感叹号分割。 编辑距离 是基于编辑的次数(增删改)比较给定两个字符串之间的相似度。 2.1 Regular Expressions 类似于

[LeetCode]72. 编辑距离(DP)

我的未来我决定 提交于 2020-02-06 00:30:54
题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/edit-distance 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 题解 dp 状态 dp[i][j]表示word1[0,i-1]变为word2[0,j-1]需要的最少编辑距离,特别的dp[0][j]表示从空串变为word2[0,j-1]需要的最少距离。 转移方程 dp[i][j] = dp[i - 1][j - 1] ,word[i-1]=word2[j-1] dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1] , dp[i - 1][j]), dp[i][j - 1]) + 1,word[i-1]!=word2[j-1] 初始化 for (int j = 0; j <=

72. 编辑距离

六月ゝ 毕业季﹏ 提交于 2020-02-05 21:06:04
参考原文 动态规划 : dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数。 所以, 当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1] ; 当 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1 其中, dp[i-1][j-1] 表示替换操作, dp[i-1][j] 表示删除操作, dp[i][j-1] 表示插入操作。 注意,针对第一行,第一列要单独考虑,我们引入 ‘’ 下图所示: 第一行,是 word1 为空变成 word2 最少步数,就是插入操作 第一列,是 word2 为空,需要的最少步数,就是删除操作 class Solution : def minDistance ( self , word1 : str , word2 : str ) - > int : # dp[i][j] 表示前i个word1转换成前j个Word2所执行的操作数 m = len ( word1 ) n = len ( word2 ) dp = [ [ 0 ] * ( n + 1 ) for j in range ( m + 1 ) ] for i in range ( 1 , n + 1 ) : dp [ 0 ]

线性dp:编辑距离

若如初见. 提交于 2020-01-20 04:32:20
题目链接:https://www.acwing.com/problem/content/901/ 题意 :给定n个长度不超过10的字符串以及m次询问,每次询问给出一个字符串和一个操作次数上限。 对于每次询问,请你求出给定的n个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。 每个对字符串进行的单个字符的插入、删除或替换算作一次操作。 数据范围 1≤n,m≤1000, 输入样例: 3 2 abc acd bcd ab 1 acbd 2 输出样例: 1 3 思路 :显然这就是反复计算最短编辑距离了,再此就直接引用上一题的具体处理思路吧。 状态表示:1.集合:所有将a[1 ~ i]变成b[1 ~ j] 的操作方式;2属性:这些操作方式的最小值 状态计算:无非三种操作: (1) 删:删除a [ i ] 试得a[1 ~ i - 1] = b[1 ~ j ],即 f [i - 1 , j ] + 1 ; (2) 添加一个a [ i ] 使得 a[1 ~ i] = b [ j ],即f[ i , j - 1] + 1; (3) 修改a [ i ] 使得a[1 ~ i] = b [ j ],即f[ i - 1 , j - 1] + 1. 代码实现: # include <bits/stdc++.h> using namespace std ; # define rep(i

Leetcode刷题记录 72. 编辑距离

一笑奈何 提交于 2020-01-12 03:56:43
给定两个单词 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 思路:创建二维数组,用于表示上两个单词list修改到另一个单词的次数, (1)先初始化第一行和第一列,其修改次数等于完全意义上的空到整个字符串,应该直接将 行列数

leetcode_72.编辑距离

帅比萌擦擦* 提交于 2020-01-10 10:42:43
给定两个单词 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+1][j+1],其中dp[i][j]代表对于word1的前i-1位与word2的前j-1位两个子字符串互相转换所需的操作数。则问题变为求dp[i][j] 第一行,是 word1 为空变成 word2 最少步数

力扣(72)----------编辑距离

≡放荡痞女 提交于 2019-12-24 00:29:09
题目描述: 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1 : 输入 : word1 = "horse" , word2 = "ros" 输出 : 3 解释 : horse - > rorse ( 将 'h' 替换为 'r' ) rorse - > rose ( 删除 'r' ) rose - > ros ( 删除 'e' ) 输入 : 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个字符 是所需要的最小操作数 进而可以推导出动态转移方程: DP{I,J}= min{ DP{i-1,j} , DP{i,j

72. 编辑距离

怎甘沉沦 提交于 2019-12-23 03:11:05
链接 题目 . 难度: high 解答: 乍一看无从下手,可是我们有万能的动态规划。推导公式就是,当目标字符串增加一个字符的时候需要怎么根据之前的结果得到当前值。完全就是动态规划经典问题:寻找最长公共字符串的翻版 package main import "fmt" func minDistance ( word1 string , word2 string ) int { if len ( word1 ) == 0 { return len ( word2 ) } if len ( word2 ) == 0 { return len ( word1 ) } dp := make ( [ ] [ ] int , len ( word1 ) + 1 ) for i := 0 ; i <= len ( word1 ) ; i ++ { dp [ i ] = make ( [ ] int , len ( word2 ) + 1 ) } for i := 1 ; i <= len ( word1 ) ; i ++ { dp [ i ] [ 0 ] = i } for j := 1 ; j <= len ( word2 ) ; j ++ { dp [ 0 ] [ j ] = j } for i := 1 ; i <= len ( word1 ) ; i ++ { for j := 1 ; j

LeetCode 72.编辑距离(动态规划)

Deadly 提交于 2019-12-20 16:13:39
编辑距离 针对两个字符串(如英文字母)的差异程度的量化测量,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。 编辑距离应用 一、可应用于NLP,如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,判断哪一个(或哪几个)是比较可能的字。 二、编辑距离可以用在生物信息学,判断两个DNA的类似程度。 算法基本原理 用d[i,j]个步骤,表示串是s[1,…,i]转换为t[1,…,j]所需要的最少步骤的次数。我们要想得到s[1,…,i]经过最少次数的增加、删除、替换变成t[1,…,j],那么我们就必须在之前可以以最少次数的增加、删除、替换,使得串s和串t只需要再做一次操作或者不做就可以完成s[1,…,i]到t[1,…,j]的转换。 d[i][j]实现有三种方法 1、第一个单词的前i位变成第二个单词的前j-1位,然后再插入一个字符(d[i][j-1]+1) 2、第一个单词的前i-1位变成第二个单词的前j位,然后再删去一个字符(d[i-1][j]+1) 3、第一个单词的前i-1位变成第二个单词的前i-1位,然后替换最后一个字符,如果最后一个字符相同,就不用替换,反之,如果不同就替换最后一位(d[i-1][j-1] + 1) 代码如下: class Solution : def minDistance ( self , word1 , word2 ) : n = len (

NLP2

送分小仙女□ 提交于 2019-12-15 01:13:22
本文内容为 贪心学院 NLP课程的个人总结。 大纲: 拼写错误纠正 词汇过滤 文本表示 文本相似度计算 拼写错误纠正(小案例) 拼写错误纠正 :spell correction。根据用户的错误输入产生理应正确的输出。譬如天起(输入) --> 天气(输出),theris --> theirs,机器学系 --> 机器学习等。 方法 :根据用户输入计算编辑距离。 编辑距离 编辑距离 :edit distance。编辑距离的计算是指通过插入(insert)、删除(delete)和替换(操作让词2变为词1。每个操作的成本为1。 例子 : 输入 目标 成本 therr there 1 [替换r为e] their 1 [替换r为i] thesis 3 [替换r,r为s,i,插入一个s] 编辑距离的编程实现 :计算编辑距离的编程是动态规划问题。 LeetCode:计算最小编辑距离 如何确定编辑距离最小的词? 方法1: 把词典中的所有词都循环一遍,计算与输入的编辑距离,输出编辑距离最小的词。但是时间复杂度较高,O(V),其中V是词库所有词汇的数量。 方法2 :根据用户的输入,生成编辑距离为1和2的字符串,通过 过滤 的方式来选择输出。这里过滤的意思是指计算出现 每个 编辑距离为1和2字符串的概率,选择概率最大的一个来作为输出。 如何生成编辑距离为1或者2的字符串? 编辑距离为1:通过增、删