1、什么叫对码?

举例说明,数据库中有两张表。

表 1:

编号 描述

 儿科门诊

 妇科门诊

 产科门诊

表 2:

编号 描述

 儿科门诊

 妇科门诊

 产科门诊

现在要在表 1 和表 2 之间找到一一对应。比如:

编号1 编号2

这就是对码。

是不是很简单?只要 select 出两个表中描述相同的编号就可以了。但如果两个表的描述并不是那么准确相等呢?譬如一个是「产科」,一个是「妇产科」,怎么找到匹配呢?有人会说用 like '%产科%' 模糊匹配,用存储过程也能实现,但你怎么知道哪个表的描述内容少呢,该 like 哪个表字段呢?还有,如果一个是「妇科」,一个是「妇产科」呢?这个想当然地用 like 肯定是不行了。这个时候就要找个方法来计算两个字符串的相似度或者匹配度,选择相似度最高的数据来做匹配。

对码这种需求其实是很常见的。比如,现有运行的系统里用的是表 1,现在上级部门要求你给它定期传数据,而且要求科室编号用表 2,一般情况下不可能直接在自己运行良好的系统里贸然用表 2 替换表 1,只有新建个表 1 和表 2 的对码表,在提取的时候对表 1 的编号做个替换。而且经常表 1 和表 2 的描述还不完全相同,这个对码就是个问题。

对码可以手工对,用自己的眼睛一个一个找,那么当数据量很大时,这将是场灾难。所以,正常点儿的工程师都会写程序先实现初级的字符串匹配,然后再人工检查,纠正程序处理不了的错误。

本文介绍的就是如何利用字符串相似度的知识来做这个对码。

2、对码,有很多方法可以实现。比如我相信一些对 SQL 高手可以轻松用存储过程实现。我这里是先把表 1 和表 2 读取到文本里,然后用 Matlab 读取并做匹配,再将匹配结果写入到新文本里。当然,这个用 Python、R 语言也可以轻松实现,很简单。我这里选择 Matlab 只是因为自己最近用得多点儿。

文本1:HIS.txt

    心血管儿科
血液儿科
新生儿科
感染儿科
妇科门诊
产科门诊

文本2:YY.txt

    生殖医学中心IVF
妇科化疗
妇科ICU
产科
妇科
妇产科门诊
妇产科教研室
妇产科

Matlab 代码如下:

[YYcode,YYdesc]=textread('YY.txt','%s%s');
yylen=length(YYcode);
[hiscode,hisdesc]=textread('HIS.txt','%s%s');
hislen=length(hiscode);
HISyy=cell(,);
HISyy{}=hiscode;
HISyy{}=hisdesc;
for i=::hislen
index=;
simMax=;
for j=::yylen
simValue=levenshtein(hisdesc{i},yydesc{j});
if simValue>simMax
simMax=simValue;
index=j;
end
end
HISyy{}{i}=YYcode{index};
HISyy{}{i}=YYdesc{index};
end fp = fopen('HIS-yy.txt','wt');
for i=::hislen
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\n',HISyy{}{i});
end
fclose(fp);

其中 levenshtein 函数是计算两个字符串的相似度,用的是「最小编辑距离」。

levenshtein.m。该代码来自网络:http://download.csdn.net/detail/zc0928/4783710

function re=levenshtein(ch1,ch2)
n=length(ch1);
m=length(ch2);
if n==
LD=m;
end;
if m==
LD=n;
end;
A=zeros(n+,m+);
for ii=:n+
A(ii,)=ii-;
end;
for ii=:m+;
A(,ii)=ii-;
end;
for ii=:m+
for j=:n+
if ch2(ii-)==ch1(j-)
cost=;
else cost=;
end;
a=A(j-,ii)+;
b=A(j,ii-)+;
c=A(j-,ii-)+cost;
d=min(a,b);
A(j,ii)=min(c,d);
end;
end;
LD=A(n+,m+);
re = (max(n,m) - LD)/max(n,m);

生成的对码文件:HIS-yy.txt

    普儿一区        普儿一科
普儿二区 普儿二科
心血管儿科 心血管科
血液儿科 新生儿科
新生儿科 新生儿科
感染儿科 感染管理科

3、Matlab 处理流程

首先读取两个表的文本,并计算数据个数。

[YYcode,YYdesc]=textread('YY.txt','%s%s');
yylen=length(YYcode);
[hiscode,hisdesc]=textread('HIS.txt','%s%s');
hislen=length(hiscode);

然后创建元胞数组,并把第一个文件的值复制进去。注意元胞数组的使用,这里创建了 1 行 4 列的元胞数组,每个元素又可以存储任意个字符串数组,每个元素的类型跟上面的 YYcode 和 YYdesc 一样。

HISyy=cell(,);
HISyy{}=hiscode;
HISyy{}=hisdesc;

接下来遍历第一个文件中的每一个描述,将该描述字符串同第二个文本中的每一个描述做匹配,计算相似度,最终取得相似度最高的存到元胞数组的第三列和第四列。

for i=::hislen
index=;
simMax=;
for j=::yylen
simValue=levenshtein(hisdesc{i},yydesc{j});
if simValue>simMax
simMax=simValue;
index=j;
end
end
HISyy{}{i}=YYcode{index};
HISyy{}{i}=YYdesc{index};
end

最后将 HISyy中的结果写入文件 HIS-yy.txt。

fp = fopen('HIS-yy.txt','wt');
for i=::hislen
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\t',HISyy{}{i});
fprintf(fp,'%s\n',HISyy{}{i});
end
fclose(fp);

Matlab 实现对码功能的更多相关文章

  1. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  2. Android二维码功能实现,在程序内嵌入ZXing项目

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526247 最近二维码真是越来越火了,随便电视上.网络上.商场里,到处都是二维码. ...

  3. FastReport 中添加二维码功能.(Delphi)

    http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi)   在实际 ...

  4. iOS开发——高级技术&二维码功能的实现

    二维码功能的实现 ZBarSDK,一个比较优秀的开源项目,使用起来也很简单. ZBarSDK是一个开源的SDK,可从这里下载到源码,该SDK实现了识别和读取各种条形码,包括EAN-13/UPC-A, ...

  5. iOS--iOS7摄像头识别二维码功能

    iOS–iOS7摄像头识别二维码功能 属性介绍: AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件. AVCaptureDevice ...

  6. shopnc 商家中心添加打印商品二维码功能

    需求中提到需要增加每一件商品可以打印,用于线下体验店实体商品的二维码标签,客人可以根据手机扫二维码功能进行购买 任务描述: 1.如附件实现”批量打印标签“和单个商品”打印“标签功能. 2.标签有两种” ...

  7. ios7下二维码功能的实现

    苹果公司升级到IOS7后自己的PassBook自带二维码扫描功能,所以现在使用二维码功能不需要在借助第三方库了 使用前请先导入AVFoundation.frameWork // //  YHQView ...

  8. ionic3 实现扫码功能

    ionic3 通过插件phonegap-plugin-barcodescanner,调用机器硬件摄像头实现扫码功能. 首先当然先了解下 phonegap-plugin-barcodescanner,这 ...

  9. SNF开发平台WinForm-平板拍照及扫描二维码功能

    在我们做项目的时候,经常会有移动平板处理检验,审核等,方便移动办公.这时就需要在现场拍照上传问题,把当场问题进行上传,也有已经拍完照的图片或加工过的图片进行上传.还有在车间现场一体机,工控机 这种产物 ...

随机推荐

  1. 14.Iterate a Cursor in the mongo Shell-官方文档摘录

    1 迭代游标 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); } } ); myCursor.forEach(pri ...

  2. OVN实战---《The OVN Load Balancer》翻译

    Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...

  3. Mysql2索引

    索引分类: 作用:优化查询,select查询有三种情况:缓存查询(不在mysql中进行数据查询),全表查询,索引扫描 Btree(btree b+tree b*tree) Rtree HASH Ful ...

  4. python小数据池,代码块的最详细、深入剖析

    代码块: Python程序是由代码块构造的.块是 一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...

  5. 超简单Centos+Docker+Halo搭建java向博客

    首先,我就当你们了解docker基本知识了. 直接开始,全新的系统. 1. 安装Docker 移除旧的版本:  $ sudo yum remove docker \                  ...

  6. 把typora改为微软雅黑+Consolas

    前言 typora是一款非常方便的书写markdown文本的编辑器.官网:https://www.typora.io/ 对于字体强迫症患者来说,不把字体改成微软雅黑+Consolas,那是相当难受.本 ...

  7. 学习Zookeeper需要了解的专业名词

    一.Zookeeper的集群角色 Leader:该角色是整个zookeeper集群工作机制中的核心 Follower:该角色是zookeeper集群状态的跟随者 Observer:在集群中充当观察者的 ...

  8. python3 爬虫神器pyquery的使用实例之爬网站图片

    PyQuery 可让你用 jQuery 的语法来对 xml 进行操作,这和 jQuery 十分类似.如果利用 lxml,pyquery 对 xml 和 html 的处理将更快. 如果对 jQuery  ...

  9. 2.MySQL简介

    MySQL是一种DBMS,即它是一种数据库软件.   1.连接   为了连接到MyAQL,需要一下信息: ➡️主机名(计算机名)---如果连接到本地MySQL服务器,为localhost ➡️duan ...

  10. 转:WebClient类(温习一下)

    WebClient类提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法. 其实就相当于创建一个请求客户端.可以获取网页和各种各样的信息,包括交互. 通过MSDN来看看WebC ...