博客
关于我
NLP笔记:浅谈字符串之间的距离
阅读量:290 次
发布时间:2019-03-03

本文共 1504 字,大约阅读时间需要 5 分钟。

0. 引言

本文旨在分析和探讨多种常见的字符串相似度计算方法,并结合实际工作场景,总结这些方法的特点及适用场景。

为了更好地理解这些方法,我们将逐一分析以下几种字符串相似度度量方法:汉明距离、最长公共子串(LCS)、编辑距离、Jaccard距离,以及BLEU、ROUGE等其他指标。

1. 汉明距离

汉明距离(Hamming Distance)是计算文本相似度的最简单方法之一。它定义为:在两个等长的字符串中,不同字符的数量。

数学表达式为:

$$\text{hamming_distance}(s1, s2) = \text{len}({ c1, c2 \in zip(s1, s2) \mid c1 \neq c2 })$$

其算法复杂度为 $O(N)$,计算过程仅需遍历字符串一次。

2. 最长公共子串(LCS)

最长公共子串(Longest Common Substring)方法用于衡量两个字符串之间的相似度。它计算两个字符串中最长的共有子串长度。

其算法采用动态规划,递推公式为:

$$dp(i, j) = \begin{cases}\max(dp(i+1, j), dp(i, j+1)) & \text{if } s1[i] \neq s2[j] \dp(i+1, j+1) + 1 & \text{if } s1[i] == s2[j]\end{cases}$$

算法复杂度为 $O(N^2)$,适用于较短的字符串。

3. 编辑距离

编辑距离(Edit Distance)是一种更全面的字符串相似度度量方法。它计算将一个字符串通过插入、删除或替换操作转换为另一个字符串所需的最少操作次数。

其递推公式为:

$$dp(i, j) = \min(1 + dp(i+1, j), 1 + dp(i, j+1), dp(i+1, j+1) + (1 - \delta(s1[i] == s2[j])))$$

算法同样采用动态规划,复杂度为 $O(N^2)$,能够有效处理不同长度的字符串。

4. Jaccard距离

Jaccard距离是一种不考虑顺序的字符串相似度度量方法,定义为两个字符串共有字符的比例。

数学表达式为:

$$\text{jaccard}(s1, s2) = \frac{|s1 \cap s2|}{|s1 \cup s2|}$$

其计算复杂度为 $O(N)$,简单易行,但无法体现顺序信息。

5. BLEU和ROUGE等指标

BLEU(Bilingual Evaluation Understudy)和ROUGE(ROUGE in n-gram Evaluation)等指标通常用于机器翻译评估,但它们不满足交换律,因此不能简单地用于字符串相似度比较。若需要比较两段文本的相似度,建议使用BLEU或ROUGE作为辅助工具。

总结

综上所述,字符串相似度比较的常用方法包括:

方法 定义 复杂度 特点
汉明距离 等长字符串中不同字符个数 $O(N)$ 简单,但不考虑顺序信息
最长公共子串 两个字符串的最长共有子串长度 $O(N^2)$ 对顺序敏感,无法衡量不同字符的差异程度
编辑距离 将一个字符串转换为另一个字符串所需的最小操作次数 $O(N^2)$ 常用,全面考虑插入、删除和替换操作
Jaccard距离 两个字符串共有字符的比例 $O(N)$ 不考虑顺序,易于计算
BLEU和ROUGE 通过n-gram匹配评估文本相似度 - 适用于特定场景,需谨慎使用

选择哪种方法取决于具体需求,汉明距离和Jaccard距离适用于简单场景,而编辑距离和LCS适用于需要全面比较的场景。

转载地址:http://enyl.baihongyu.com/

你可能感兴趣的文章
Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
查看>>
python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
查看>>
python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
查看>>
Python: AES加密与解密
查看>>
Python: Range() 最大尺寸;动态的还是静态的?
查看>>
Python: Windows下用 multiprocessing 的深坑
查看>>
python:Could not find platform independent libraries <prefix>解决方法
查看>>
Python:datetime tzinfo 时区名称文档
查看>>
Python:deepcopy(list) vs new_list = old_list[:]
查看>>
Python:Google API - 从消息中获取 mimeTypes
查看>>
Python:Google API - 从消息中获取 mimeTypes
查看>>
Python:subprocess.call,stdout to file,stderr to file,在屏幕上实时显示stderr
查看>>
Python:TypeError:无法连接“str“和“int“对象
查看>>
Python:XPath 在 ElementTree 中不可用
查看>>
Python:从 FTP 服务器下载文件
查看>>
python:从列表中创建元组列表
查看>>
Python:从嵌套列表中删除重复项
查看>>
Python:从间隔映射到值
查看>>
Python:使用 shell=False 的子进程调用不起作用
查看>>
Python:修改 PATH 环境变量的平台无关方式
查看>>