自然语言处理学习篇02——Edit Distance

本文详细探讨了自然语言处理中的Edit Distance概念,包括最小编辑距离的定义、计算方法、回溯计算对齐方式、加权最小编辑距离及其在计算生物学中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二章 Edit Distance


本篇内容将讲述Edit Distance(编辑距离的定义详见正文),具体又包含5个方面的内容:
  1. Defining Minimum Edit Distance 
  2. Computing Minimum Edit Distance
  3. Backtrace for Computing Alignments
  4. Weighted Minimum Edit Distance
  5. Minimum Edit Distance in Computational Biololgy

1. Definition of  Minimum Edit Distance 

Edit Distance用于衡量两个strings之间的相似性。
两个strings之间的 Minimum edit distance是指把其中一个string通过编辑(包括插入,删除,替换操作)转换为另一个string的最小操作数。
如上图所示,d(deletion)代表删除操作,s(substitution)代表替换操作,i(insertion)代表插入操作。
(为了简单起见,后面的Edit Distance 简写为ED)
如果每种操作的cost(成本)为1,那么ED = 5.
如果s操作的cost为2(即所谓的Levenshtein Distance),ED = 8.

2

### 关于树结构间的编辑距离计算 #### 定义与概念 树编辑距离(Tree Edit Distance, TED)衡量两棵树之间差异的程度。该度量定义为将一棵树转换成另一棵树所需的最少操作次数,这些基本操作通常包括节点的插入、删除以及替换。 #### 计算方法概述 为了有效地计算TED,常用的方法是动态规划。具体来说: - **初始化阶段**:创建一个二维矩阵D,其中`D[i][j]`表示由源树根到第i个孩子构成的子树和目标树相应部分至第j个孩子的最小代价。 - **递推关系构建**:对于任意一对节点u和v,在考虑它们各自的孩子列表时应用如下规则来更新矩阵条目: - 如果两个节点相同,则不需要任何改变; - 否则,尝试通过三种方式之一减少两者间差距——即移除其中一个节点、添加新节点或更改现有节点标签,并选取成本最低者作为最终结果; - **边界条件设定**:当处理到达叶子结点的情况时,如果一方还有剩余未匹配的部分,则按照实际需求执行必要的增删动作直至完全同步为止。 #### 实现示例 下面给出Python语言下的简单实现版本[^1]: ```python def tree_edit_distance(tree1, tree2): m = len(tree1) n = len(tree2) # Initialize cost matrix dist_matrix = [[0 for _ in range(n + 1)] for __ in range(m + 1)] # Fill the first row and column for i in range(1, m + 1): dist_matrix[i][0] = i for j in range(1, n + 1): dist_matrix[0][j] = j # Compute costs using dynamic programming approach for i in range(1, m + 1): for j in range(1, n + 1): if tree1[i-1].label == tree2[j-1].label: substitution_cost = 0 else: substitution_cost = 1 dist_matrix[i][j] = min( dist_matrix[i-1][j] + 1, # Deletion from t1 dist_matrix[i][j-1] + 1, # Insertion into t1 dist_matrix[i-1][j-1] + substitution_cost # Substitution ) return dist_matrix[m][n] class TreeNode: def __init__(self, label=None, children=None): self.label = label self.children = children if children is not None else [] # Example usage if __name__ == "__main__": root_a = TreeNode('A', [ TreeNode('B'), TreeNode('C') ]) root_b = TreeNode('A', [ TreeNode('B'), TreeNode('D') ]) print(f"The Tree Edit Distance between two trees is {tree_edit_distance([root_a], [root_b])}") ``` 此代码片段展示了如何利用动态规划技术求解给定二叉树之间的最短路径长度。需要注意的是这里简化了输入形式以便理解逻辑流程,真实应用场景下还需要进一步完善数据结构设计以适应更复杂的多分支情况。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值