文档章节

判断两个字符串是否相似的函数 AnsiResemblesText 专题研究

涂孟超
 涂孟超
发布于 2014/09/26 15:29
字数 791
阅读 11
收藏 0
//先糊涂一下
var
  b: Boolean;
begin
  b := AnsiResemblesText('abc','apc');
  ShowMessage(BoolToStr(b)); {True}

  b := AnsiResemblesText('abc','agc');
  ShowMessage(BoolToStr(b)); {False}

  b := AnsiResemblesText('abc','aac');
  ShowMessage(BoolToStr(b)); {False}

{结论: 它只认为第一对是相似的; 它到底根据什么判断的?}
end;

 
 
 
 
 

 

 

  
//我追根求源, 找到了这个函数: Soundex var s: string; begin s := Soundex('abc'); ShowMessage(s); {A120} s := Soundex('apc'); ShowMessage(s); {A120} s := Soundex('agc'); ShowMessage(s); {A200} s := Soundex('aac'); ShowMessage(s); {A200} {结论: AnsiResemblesText 是根据 Soundex 生成的另一个字符码来比对的} end;
//首先 Soundex 把第一个字母读出, 不区分大小写, 但用大写表示 var s: string; begin s := Soundex('xabc'); ShowMessage(s); {X120} s := Soundex('Yabc'); ShowMessage(s); {Y120} s := Soundex('zabc'); ShowMessage(s); {Z120} {结论: 如果第一个字母不同, 是绝对不会相似的} end;
//从第2-4个字母, Soundex 为他们分别读出一个值: // h w -1 // a e i o u y 0 // b f p v 1 // c g j k q s x z 2 // d t 3 // l 4 // m n 5 // r 6 // //不过最后把 -1 也认做 0 了; 如果字母缺失也会认做 0 begin ShowMessage(Soundex('Aa')); {A000} ShowMessage(Soundex('Ae')); {A000} ShowMessage(Soundex('Ai')); {A000} ShowMessage(Soundex('Ao')); {A000} ShowMessage(Soundex('Au')); {A000} ShowMessage(Soundex('Ay')); {A000} ShowMessage(Soundex('Ah')); {A000} ShowMessage(Soundex('Aw')); {A000} ShowMessage(Soundex('Ab')); {A100} ShowMessage(Soundex('Af')); {A100} ShowMessage(Soundex('Ap')); {A100} ShowMessage(Soundex('Av')); {A100} ShowMessage(Soundex('Ac')); {A200} ShowMessage(Soundex('Ag')); {A200} ShowMessage(Soundex('Aj')); {A200} ShowMessage(Soundex('Ak')); {A200} ShowMessage(Soundex('Aq')); {A200} ShowMessage(Soundex('As')); {A200} ShowMessage(Soundex('Ax')); {A200} ShowMessage(Soundex('Az')); {A200} ShowMessage(Soundex('Ad')); {A300} ShowMessage(Soundex('At')); {A300} ShowMessage(Soundex('AL')); {A400} ShowMessage(Soundex('Am')); {A500} ShowMessage(Soundex('An')); {A500} ShowMessage(Soundex('Ar')); {A600} {结论: 以上只要值是一样的, 最后的结果当然是相似; 它好像是根据发音分类的} end;
//从第2-4个字母如果不重复, 道理也就一样了 var b: Boolean; begin {b 的编码是 1} ShowMessage(Soundex('Ab')); {A100} ShowMessage(Soundex('Abb')); {A100} ShowMessage(Soundex('Abbb')); {A100} {r 的编码是 6} ShowMessage(Soundex('Arbb')); {A610} ShowMessage(Soundex('Abbr')); {A160} ShowMessage(Soundex('Abrb')); {A161} {测试} b := AnsiResemblesText('Ab','Abbb'); ShowMessage(BoolToStr(b)); {返回 -1, 也就是 True; 它认为 Ab 与 Abbb 是相似的} {结论: 如果字母连续重复, 后面相同的字母将被忽略, 缺位补 0} end;
//如果没有重复, 从第 4 个字母以后就不再计算了 var b: Boolean; begin ShowMessage(Soundex('Abcd')); {A123} ShowMessage(Soundex('Abcdbcdbcd')); {A123} {测试} b := AnsiResemblesText('Abcd','Abcdbcdbcd'); ShowMessage(BoolToStr(b)); {True} {如果有重复} ShowMessage(Soundex('Abbbcd')); {A123} ShowMessage(Soundex('Abcd')); {A123} {测试} b := AnsiResemblesText('Abbbcd','Abcd'); ShowMessage(BoolToStr(b)); {True} {结论: 它只给前 4 个字母编码, 之后的忽略; 如果第 2-4 个字母有连续的重复, 被忽略掉的字母会用后面的补齐. } end;
//其实 Soundex 还有一个可选参数, 它的默认值是 4 var b: Boolean; begin ShowMessage(Soundex('Abcd', 6)); {A12300} ShowMessage(Soundex('Abcdbcd', 6)); {A12312} {测试} b := AnsiResemblesProc('Abcdbcd','Abcdbcd'); ShowMessage(BoolToStr(b)); {True} {结论: AnsiResemblesText 函数在使用 Soundex 时, 只是使用了默认值 4; 也就是这个问题在 AnsiResemblesText 中并不存在; 如果需要更复杂的比对, 直接调用 Soundex 函数就是了. 另外, 还有一个函数 AnsiResemblesProc 和 AnsiResemblesText 是一么一样的; 不过是后者调用了前者罢了, 无他! } end;
//一旦明白了, 就没有进行更多测试; 如发现不对, 万望告诉 万一 一声!

本文转载自:http://www.cnblogs.com/del/archive/2007/12/28/1019077.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
(三)Boost库之字符串处理

字符串处理一直是c/c++的弱项,stringalgo库很好的弥补了这一点。 stringalgo 库算法命名规则: 前缀i : 有这个前缀表名算法的大小写不敏感,否则大小写敏感 后缀copy: 有这个后缀表明算法不...

fanzhao
2014/03/22
3.8K
0
Python元组 ()

元组的定义:使用圆括号括起来,元素之间用逗号分隔;空的圆括号表示空元组;当只有一个元素时,必须以逗号结尾。 序列的基本操作: len() ——求序列的长度 比如一个字符串“a='qweqerq'”,...

归来仍少年
2018/01/11
0
0
文本相似度十大方法简要说明

1、余弦相似性 余弦(余弦函数),三角函数的一种。在Rt△ABC(直角三角形)中,∠C=90°,角A的余弦是它的邻边比三角形的斜边,即cosA=b/c,也可写为cosA=AC/AB。余弦函数:f(x)=cosx(x...

u012654154
2017/04/21
0
0
ES6语法总结

一.变量的结构赋值 二.属性扩展 1.字符串扩展 1).chartAt返回指定字符 2).includes,startWith,endsWith判断该字符串是否含有某字符 3).repeat复制字符 4).padStart,padEnd补全字符 2.数值扩展...

Ethan-GOGO
2016/10/12
323
0
Object对象目录 总览概括

Object对象 来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 JavaScript 原生提供对象(注意起首的是大写),所有其他对象都继承自这个对象。本身也是一个构造函数,可以直接通过...

sinat_34719507
2017/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部