DICECOEFFICIENT( ) 函数
返回两个指定字符串的 Dice 系数,它用来衡量两个字符串的相似度。
语法
DICECOEFFICIENT(字符串1, 字符串2 <,ngram>)
参数
名称 | 类型 | 描述 |
---|---|---|
字符串1 | 字符 | 比较中的第一个字符串。 |
字符串2 | 字符 | 比较中的第二个字符串。 |
ngram 可选 |
数值 |
要使用的 n-gram 长度。 指定一个整数:1 或更大数字。增加 ngram 长度使两个字符串之间的相似性标准更加严格。 如果您未指定长度,则使用默认长度 2。 N 元语法是在 Dice 系数计算过程中,将比较字符串划分而成的重叠子串(字符块)。 要了解更多信息,请参考备注。 |
输出
数值。该值是两个字符串的 Dice 系数,它表示两个完全相同字符串中的 n 元语法的总数的百分比。范围是 0.0000 到 1.0000(包括本数)。
示例
基本示例
n-gram 长度如何影响结果
下面的三个示例比较相同的两个字符串。返回的相似度返回取决于所指定的 n-gram 长度。
返回 0.9167(使用默认 n 元语法长度 (2),这两个字符串中的 n 元语法的相似度为 92%):
DICECOEFFICIENT("125 SW 39TH ST, Suite 100","Suite 100, 125 SW 39TH ST")
返回 1.0000(使用 n 元语法长度 1,这两个字符串中的 n 元语法的相似度为 100%):
DICECOEFFICIENT("125 SW 39TH ST, Suite 100","Suite 100, 125 SW 39TH ST", 1)
返回 0.8261(使用 n 元语法长度 3,这两个字符串中的 n 元语法的相似度为 83%):
DICECOEFFICIENT("125 SW 39TH ST, Suite 100","Suite 100, 125 SW 39TH ST", 3)
域输入
在与字符串 "125 SW 39TH ST, Suite 100" 比较时,返回地址域中各个值的 Dice 系数(基于默认的 n 元语法长度 2):
DICECOEFFICIENT(地址,"125 SW 39TH ST, Suite 100")
高级示例
处理被变换顺序的元素
通过减小 n-gram 长度,并且移除非必要字符,您可以在搜索被变换顺序的元素时优化 DICECOEFFICIENT()。
返回 0.7368(使用默认 n 元语法长度 (2),这两个字符串中的 n 元语法的相似度为 74%):
DICECOEFFICIENT("John Smith","Smith, John")
返回 1.0000(通过排除姓氏和名字之间的逗号并且使用 n 元语法长度 1,这两个字符串中的 n 元语法的相似度是 100%):
DICECOEFFICIENT("John Smith", EXCLUDE("Smith, John", ","), 1)
根据 "125 SW 39TH ST, Suite 100" 进行值排序
创建计算域 Dice_Co 以显示 "125 SW 39TH ST, Suite 100" 和 Address 域中的每个值之间的 Dice 系数:
DEFINE FIELD Dice_Co COMPUTED DICECOEFFICIENT(Address,"125 SW 39TH ST, Suite 100")
将计算域 Dice_Co 添加到视图中,然后按降序对其进行快速排序,以基于其与 "125 SW 39TH ST, Suite 100" 的相似度对 Address 域中的所有值进行排序。
隔离 "125 SW 39TH ST, Suite 100" 的模糊重复值
创建一个过滤器,以便隔离 Address 域中所有位于 "125 SW 39TH ST, Suite 100" 的指定相似度内的值:
SET FILTER TO DICECOEFFICIENT(Address,"125 SW 39TH ST, Suite 100") > 0.5
通过更改该表达式中的数字,您可以调整过滤值中的相似度。
备注
何时使用 DICECOEFFICIENT( )
使用 DICECOEFFICIENT( ) 函数可查找几乎完全相同的值(模糊重复)。您还可以使用 DICECOEFFICIENT( ) 查找具有相同或几乎相同的内容但具有变换元素的值。例如:
- 具有被变换的位的电话号码或社会保险号
- 具有不同格式的同一地址的多个版本
工作原理
DICECOEFFICIENT( ) 返回所评价的两个字符串的 Dice 系数,它度量了字符串之间的相似程度,大小为从 0.0000 到 1.0000。返回的值越大,说明这两个字符串越相似:
-
1.0000 – 意味着各个字符串都由相同的字符集组成,尽管这些字符可能具有不同的顺序,并且可能使用不同的大小写。
-
0.7500 – 意味着这两个字符串中的 n 元语法的相似度为 75%。
-
0.0000 – 意味着两个字符串不具有共享的 n-gram(参见下面的解释),或者计算中使用的 n-gram 的指定长度比所比较的两个字符串的较短者更长。
用法提示
- 过滤或排序根据域中值的 Dice 系数对值进行过滤或排序,可以识别那些与比较字符串最为相似的值。
- 大小写敏感性该函数不区分大小写,因此“SMITH”等效于“smith”。
- 前导和后继空白该函数自动修剪域中的前导和后继空格,因此在将域指定为参数时,无须使用 TRIM( ) 或 ALLTRIM( ) 函数。
- 移除通用元素通过从域值中删除 “Corporation” 或 “Inc.” 等通用元素或逗号、句点和 & 符等字符,OMIT( ) 和 EXCLUDE( ) 函数可提高 DICECOEFFICIENT( ) 函数的有效性。
删除通用元素和标点符号可使 DICECOEFFICIENT( ) 字符串比较仅专注于可能出现有意义差异的字符串部分。
如何计算 Dice 系数
Dice 系数表示两个完全相同字符串中的 n 元语法的总数的百分比。
计算 Dice 系数的方法是首先将要比较的字符串划分为 n 元语法。N-gram(也称作 q-gram)是长度为 n 的重叠子串或重叠字符块。您可以使用 ngram 参数指定 n 的长度,或接受默认长度 2。
将两个名称划分为 n-gram
下面是进行了如下处理的名称 "John Smith" and "Smith, John D.": 划分为长度为 2 的 n-grams,以及划分为长度为 3 的 n-grams。下划线指示空格。内部空格和标点符号被统计为字符。
n-gram 长度 |
"John Smith" n-grams |
"Smith, John D." n-grams |
---|---|---|
2 |
Jo | oh | hn | n_ | _S | Sm | mi | it | th |
Sm | mi | it | th | h, | ,_ | _J | Jo | oh | hn | n_ | _D | D. |
3 |
Joh | ohn | hn_ | n_S | _Sm | Smi | mit | ith |
Smi | mit | ith | th, | h,_ | ,_J | _Jo | Joh | ohn | hn_ | n_D | _D. |
Dice 系数公式
在为两个要比较的字符串建立 n-gram 以后,将使用以下公式完成计算:
-
2 x 共享 n-gram 的数量 / 两个字符串中 n-gram 的总数量
共享 n-gram 是同时出现在这两个字符串中的 n-gram。例如,假定 n-gram 长度为 2,则 "ABC" 和 "BCD" 共享 n-gram "BC"(AB | BC 和 BC | CD)。
计算 Dice 系数的示例
下表说明了如何使用不同的 n 元语法长度为两个字符串 "John Smith" 和 "Smith, John D." 计算 Dice 系数。
请注意,随着同一字符串对的 n 元语法长度增加,Dice 系数值将减小,表示相似性更低。尽管字符串保持不变,但相似性准则变得更加严格,原因是将字符串划分为更长的 n-gram 意味着要使 n-gram 满足共享要求,必须匹配更长的字符序列。
另一种考虑此要点的方式是随着您增加 n-gram 长度,字符的相对位置的权重越大。相比之下,在使用 n-gram 长度 1 时,不考虑字符的相对位置。相对位置是指字符相对于彼此的位置,而不是它们在字符串内的绝对位置。
提示
如果您特地查找变换,请使用 n-gram 长度 1。
n-gram 长度 |
"John Smith" n-grams |
"Smith, John D." n-grams |
共享 n-gram |
戴斯系数 |
---|---|---|---|---|
1 |
J | o | h | n | _ | S | m | i | t | h (10 个 n-gram) |
S | m | i | t | h | , | _ | J | o | h | n | _ | D | . (14 个 n-gram) |
10 |
2x10 / (10+14) = 0.8333 |
2 (默认) |
Jo | oh | hn | n_ | _S | Sm | mi | it | th (9 个 n-gram) |
Sm | mi | it | th | h, | ,_ | _J | Jo | oh | hn | n_ | _D | D. (13 个 n-gram) |
8 |
2x8 / (9+13) = 0.7273 |
3 |
Joh | ohn | hn_ | n_S | _Sm | Smi | mit | ith (8 个 n-gram) |
Smi | mit | ith | th, | h,_ | ,_J | _Jo | Joh | ohn | hn_ | n_D | _D. (12 个 n-gram) |
6 |
2x6 / (8+12) = 0.6000 |
4 |
John | ohn_ | hn_S | n_Sm | _Smi | Smit | mith (7 个 n-gram) |
Smit | mith | ith, | th,_ | h,_J | ,_Jo | _Joh | John | ohn_ | hn_D | n_D. (11 个 n-gram) |
4 |
2x4 / (7+11) = 0.4444 |
DICECOEFFICIENT( ) 与 ISFUZZYDUP( ) 和 LEVDIST( ) 之比较
DICECOEFFICIENT( ) 函数和 ISFUZZYDUP( ) 及 LEVDIST( ) 函数(它使用编辑距离)之间的主要区别之一是 DICECOEFFICIENT( ) 不太强调或完全忽略所比较的两个字符串中的字符或字符块的相对位置。在基于编辑距离的函数中,相对位置非常重要。
包含换位的比较值
如果您比较的是地址之类的字符串(其中,整个元素可能被变换),则 DICECOEFFICIENT( ) 可能是一个更好的选择。例如,对于变换了 "Suite" 元素的相同地址而言,DICECOEFFICIENT( ) 会将其标识为高度相似,而 LEVDIST( ) 会将其标识为高度不同:
地址对 |
戴斯系数 (默认 n-gram 2) |
编辑距离 |
---|---|---|
|
0.9167 |
22 (编辑距离越大,两个字符串之间的差异越大) |
不包含换位的比较值
如果变换不太成问题,则 LEVDIST( ) 可能提供更有用的结果。例如,对于具有不同标点符号的同一个公司名称而言,DICECOEFFICIENT( ) 会将其标识为高度不同,而 LEVDIST( ) 会将其标识为高度相似:
公司名称对 |
戴斯系数 (默认 n-gram 2) |
编辑距离 |
---|---|---|
|
0.3750 |
3 |