LEVDIST( ) 函数
返回两个指定字符串之间的编辑距离,该编辑距离用来衡量两个字符串的差异程度。
语法
LEVDIST(字符串1,字符串2 <,区分大小写>)
参数
名称 | 类型 | 描述 |
---|---|---|
字符串1 | 字符 | 比较中的第一个字符串。 |
字符串2 | 字符 | 比较中的第二个字符串。 |
区分大小写 可选 |
逻辑 |
为区分大小写的字符串比较指定 T,若忽略大小写,则指定 F。 如果将其省略,则使用默认值 T。 |
输出
数值。该值是两个字符串之间的编辑距离。
示例
基本示例
返回 3,因为要将 "smith" 转换为 "Smythe",需要两次替换和一次插入:
LEVDIST("smith","Smythe")
返回 2,因为忽略大小写,所以要将 "smith’s" 转换为 "Smythes",仅需两次替换:
LEVDIST("smith's","Smythes",F)
返回姓氏域中的每个值与字符串 "Smith" 之间的编辑距离:
LEVDIST(TRIM(姓氏),"Smith")
高级示例
根据 "Smith" 对值进行排序
创建计算域 Lev_Dist 以显示 "Smith" 和姓氏域中的每个值之间的编辑距离。
DEFINE FIELD Lev_Dist COMPUTED LEVDIST(TRIM(姓氏),"Smith", F)
将计算域 Lev_Dist 添加到视图,然后按升序快速对其进行排序,以按照姓氏域中的所有值与 "Smith" 之间的金额差异排列这些值。
隔离 "Smith" 的模糊重复值
创建一个过滤器以隔离姓氏域中所有位于 "Smith" 的指定编辑距离内的值:
SET FILTER TO LEVDIST(TRIM(姓氏),"Smith", F) < 3
通过更改该表达式中的数字,您可以调整过滤值中的编辑距离大小。
备注
何时使用 LEVDIST( )
使用 LEVDIST( ) 函数可查找几乎相同的值(模糊重复值),或者在手动输入的数据中找到不一致的拼写。LEVDIST( ) 还可识别完全重复值。
工作原理
LEVDIST( ) 函数返回两个已评估字符串之间的编辑距离,该编辑距离是一个值,表示使一个字符串与另一个字符串完全相同所需的最小单字符编辑数量。
每个必需的编辑都会将编辑距离的值递增 1。编辑距离越大,两个字符串之间的差异就越大。零 (0) 距离意味着字符串是相同的。
编辑类型
可有三种编辑类型:
- 插入
- 删除
- 替换
Levenshtein 算法不会识别换位(两个相邻字母互换位置),而将其算作两次编辑 — 具体说来,两次替换。
非字母数字字符
标点符号、特殊字符和空白被视为单个字符,就像字母和数字一样。
字符大小写
改变字符的大小写被视为替换,除非您使用区分大小写设置关闭大小写敏感性。
字符的位置
编辑距离考虑字符位置。相同字符如果顺序不同可能会导致编辑距离不同。
返回 2:
LEVDIST("abc", "dec")
返回 3:
LEVDIST("abc", "cde")
将 TRIM( ) 与 LEVDIST( ) 结合使用
当使用 LEVDIST( ) 比较文字字符串时,例如比较 "Smith" 和某个字符域,为确保结果准确,您必须使用 TRIM( ) 函数将结尾空格从域中删除。
如果您要比较两个域,则必须对每个域使用 TRIM( ) 函数。
编辑算法把空格视为字符,因此任何结尾空格均需包含于使两个字符串相同所需的编辑数目的计算中。
将 OMIT( ) 与 LEVDIST( ) 结合使用
通过从域值中删除 "Corporation" 或 "Inc." 等通用元素,OMIT( ) 函数可提高 LEVDIST( ) 函数的有效性。删除通用元素主要针对 LEVDIST( ) 对字符串中可能出现有意义差异部分的比较。
相关函数
- ISFUZZYDUP( ) 为基于编辑距离的字符串比较提供了替代方法。
与 LEVDIST( ) 的默认行为不同,ISFUZZYDUP( ) 不区分大小写。
- DICECOEFFICIENT( ) 函数在比较字符串时不太强调或完全忽略字符或字符块的相对位置。
- SOUNDSLIKE( ) 和 SOUNDEX( ) 基于语音比较(声音)而非正字法比较(拼写)来比较字符串。