1.背景介绍

今天在公司接到一个需求,大概是这样的.我们ERP系统数据库有张customer(客户)表,其中有个字段是小区名称(plotName),当初在录入数据时没有对这一字段做界定和规范,由人工手动录入,这就导致两位客户本是一个小区,而录入的小区名可能不是完全一样的结果.例如张三和李四都住在武林邸,而张三录入的数据是"武林邸",李四录入的数据的"杭州市西湖区武林邸",又或是舞林邸等.由于业务需要,现需要对这些小区名进行名称规整,如上述例子都规整为"杭州市西湖区武林邸".

2.解决方案如下

既然要规整,就要有统一的名称规范,最终决定从安居客,租房网等爬出杭州市各小区的标准名称.再用数据库现有数据与之对比.列出最相似的前三个名称,然后泽其一修数据库数据.

如下图所示:匹配度及为相似度算法计算所得结果.

3.难点

难点就是字符串相似度对比算法的设计,网上查阅大量资料,如字符串最小编辑距离匹配算法此处不适用,因为对比的字符串与目标字符串长度不一样,会导致对比结果不是正确的.用代码和数据验证如下:

对比的三个字符串如下:                                     目标字符串为:"龙悦湾金石院子"

  1. "浙江省杭州市拱墅区龙悦湾金石院子"
  2. "金石院子十六幢二单元302"
  3. "金子"
 public static void main(String[] args){LinkedList list=new LinkedList();String source = "龙悦湾金石院子";//目标字符串String target1 = "浙江省杭州市拱墅区龙悦湾金石院子";String target2="金石院子十六幢二单元302";String target3="金子";System.out.println(target1+"最小编辑距离是:"+minEdit_distance(source,target1));System.out.println(target2+"最小编辑距离是:"+minEdit_distance(source,target2));System.out.println(target3+"最小编辑距离是:"+minEdit_distance(source,target3));}

其中minEdit_distance()方法是最小编辑距离算法,根据此算法的思想,如果最小编辑距离值越小,则说明两个字符串越相似.而此处打印结果为9,12,5.即"金子"与"龙悦湾金石院子"最相似,"浙江省杭州市拱墅区龙悦湾金石院子"第二,"金石院子十六幢二单元302"第三,而实际应该是"金子"与"龙悦湾金石院子"最不相似,是不期望得到的结果.

打印结果:

4.最终解决方案

将字符串和目标字符串去空格后转为单字符集,定义一个变量intersection,自定义算法计算让intersection值增加,相似度百分比值=intersection*2/unionLength(两个字符串长度和)*100.

代码如下:

 public static String compareStrings(String str1, String str2) {DecimalFormat df = new DecimalFormat("0.00");//格式化小数ArrayList pairs1 = wordLetterPairs(str1.toUpperCase());ArrayList pairs2 = wordLetterPairs(str2.toUpperCase());int intersection = 0;int union = pairs1.size() + pairs2.size();for (int i=0; i<pairs1.size(); i++) {Object pair1=pairs1.get(i);for(int j=0; j<pairs2.size(); j++) {Object pair2=pairs2.get(j);if (pair1.equals(pair2)) {intersection++;pairs2.remove(j);break;}}}return df.format((2.0*intersection)/union*100)+"%";}
private static String[] letterPairs(String str) {int numPairs = str.length()-1;String[] pairs = new String[numPairs];for (int i=0; i<numPairs; i++) {pairs[i] = str.substring(i,i+2);}return pairs;}private static ArrayList wordLetterPairs(String str) {ArrayList allPairs = new ArrayList();String[] words = str.split("\\s");for (int w=0; w < words.length; w++) {String[] pairsInWord = letterPairs(words[w]);for (int p=0; p < pairsInWord.length; p++) {allPairs.add(pairsInWord[p]);}}return allPairs;}

运行结果:正确

不同长度的字符串/中文串相似度对比算法相关推荐

  1. 从指定位置删除指定长度的字符串(串)

    Problem F: 从指定位置删除指定长度的字符串(串) Description 从一个字符串中的第p个位置起删除指定长度的字符串,输出最终结果,若输入不合法,则输出 Illegal input I ...

  2. php 图片相似度对比算法,php比较图片相似度代码示例

    /** * 图片相似度比较 * * @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $ * @authorjax.hu * www. ...

  3. php 图片相似度对比算法,图像处理技术之图片相似度比较

    Today,工作中发现需要去除图片上的水印,由于涉及文章太多,手动重新编辑很慢且容易出错.于是想到了使用脚本比较全部图片的相似度,然后替换文件的方式来达到去除水印效果.在完成这项工作前,我们需要找到所 ...

  4. java判断字符串长度_java判断中文字符串长度的简单实例

    /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static int length( ...

  5. java String中文字符串分割成数组 中文字符串分割成一定长度的字符串数组

    java String中文字符串分割成一定长度的字符串数组 /*** 几个字一组 变量控制 大于零有意义*/ int num = 6; /*** 待操作的字符串*/ String str = &quo ...

  6. python 计算字符串长度(含中文)

    txt = '名字12' lenTxt = len(txt) lenTxt_utf8 = len(txt.encode('utf-8')) size = int((lenTxt_utf8 - lenT ...

  7. java判断字符长度_java判断中文字符串长度的简单实例

    话不多说,上代码: /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value 指定的字符串 * @return 字符串的长度 */ public static i ...

  8. 百度千言-中文文本相似度实战

    文章目录 百度千言-中文文本相似度实战 任务1:报名比赛,下载比赛数据集并完成读取 任务2:对句子对提取TFIDF以及统计特征,训练和预测 任务3:加载中文词向量,自己训练中文词向量 任务4:使用中文 ...

  9. JAVA返回指定字符串的长度,Java截取指定字节长度的字符串

    在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar ...

最新文章

  1. angular artDialog未及时更新
  2. java实现导出Excel的功能
  3. linx vim 文件操作 ubuntu server 软件源
  4. iPhone近两个财季为苹果带来1135亿美元营收 同比增长33%
  5. Python中的AES加解密算法
  6. 基于asp.net的大学生助学贷款管理系统
  7. 二维泊松方程求解--点迭代法
  8. 沈向洋从微软离职,挺好的
  9. 用计算机弹音乐我们一起猫叫,抖音上面我们一起学猫叫一起喵喵喵是什么歌 抖音学猫叫歌曲歌词...
  10. 在做黑马程序员中第10题出错啦,大家帮忙看看
  11. Web应用——驾培管理系统之个人管理(作者:小圣)
  12. ESP8266-Arduino编程实例-TMP175数字温度传感器驱动
  13. Vue核心⑨(数据监测原理)
  14. 深度学习中的特征(feature)指的是什么?
  15. 新站是如何做到百度秒录入
  16. 5万块钱的笔记本,没能让苹果“炸场”
  17. C++文件输入/输出流类
  18. Python爬虫之JavaScript逆向,喜马拉雅加密算法分析
  19. ThreeJS 纹理贴图创建一个我的世界草地方块
  20. MATLAB 简易纪念碑谷

热门文章

  1. 字符串前面添加u,r,b的含义
  2. css实现图片翘边阴影
  3. 【企业邮箱注册】管理员如何设置定期修改密码?
  4. ear的英语怎么念_高中英语快速记忆法有哪些?
  5. 怎么把图片的文字提取出来?
  6. 【复变函数与积分变换】第1章 复数——1.1 复数的定义及其四则运算
  7. 一文教你用 Neo4j 快速构建明星关系图谱
  8. c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
  9. Java对象空间分配流程
  10. 洛谷P2664 树上游戏 【点分治 + 差分】