一种中文字符串相似度算法

  • 概要
    • 标记距离相似算法
    • 扩展

概要

给定一个字符串a,在字符串列表B中找到与a最相似字符串b,或者让列表B按与a相似度排序。本文提出一种算法来较好的解决这个问题。并且该算法很容易扩展支持拼音模糊相似度计算,在语音识别应用如语音搜索联系人打电话方面有较好的优势。

标记距离相似算法

如图,我们需要计算a和b的相似度,需要执行三个步骤:
1、将a和b的相同字符一一进行标记,这里用相同颜色表示。
2、计算a每一个字符的相似得分。
3、将a的每一个字符最大得分相加就得到这两行字符串的总相似度分数。

第一步和第三步显然很简单,我们来讨论第二步,如何计算每个字符的相似得分:
我们这样定义相同字符的距离:
a和b中两个相同颜色字符的索引减去他们前面的相同颜色字符的索引之间的差就是这两个字符的距离。如上图,从左到右,设an和bm的颜色相同,ax和by的颜色相同,且an、bm是ax、by左边第一个满足Indexan < Indexax && Indexbm < Indexby,那么ax、by的相似距离就是:
d = ∣ ( I n d e x a n − I n d e x a n ) − ( I n d e x b y − I n d e x b m ) ∣ d = |(Index_{a_n} - Index_{a_n}) - (Index_{b_y} - Index_{b_m})| d=∣(Indexan​​−Indexan​​)−(Indexby​​−Indexbm​​)∣
在上面的例子中:
a1的距离为 |(0 - 0) - (0 - 0)| = 0
a2的距离为 |(1 - 0) - (3 - 0)| = 2
a3的距离有两个 |(2 - 0) - (1 - 0)| = 1; |(2 - 0) - (2 - 0)| = 0;
a4的距离为无穷大
a5的距离为 |(4 - 2) - (4 - 2)| = 0;

我们定义这样的一个单个字符相似得分公式: s = 1 ( 1 + d ) s = \frac {1} {(1 + d)} s=(1+d)1​
总相似得分公式为:
S 总 = ( s a 1 + s a 2 + ⋯ + s a n ) ∗ S u m a h i t S u m a n S_总 = (s_{a_1} + s_{a_2} + \cdots + s_{a_n}) * \frac {Sum_{a_{hit}}} {Sum_{a_{n}}} S总​=(sa1​​+sa2​​+⋯+san​​)∗Suman​​Sumahit​​​
于是a1 = 1,a2 = 1/3,a3 = 1/2或1,a5 = 1,ahit标记总数为4,an总字符个数为5,所以a和b的相似度得分就是2.6666

上面的单个字符得分公式不是固定的,你也可以使用 S = 2 ( 2 + d ) S = \frac {2} {(2 + d)} S=(2+d)2​
来计算,因为这只是相似字符的区分度问题,选择合适的公式来达到你想要的区分度。

扩展

在拼音模糊搜索中,可以根据拼音之间的相似度给得分公式乘以不同的系数。如liang和lian很相似,那么将这两个拼音也标记上同一种颜色,只是在计算得分时乘以系数比如: S = 1 ( 1 + d ) ∗ 0.9 S = \frac {1} {(1 + d)} * 0.9 S=(1+d)1​∗0.90.9就是这两个拼音的相似度。

通过该算法,开源了一个模糊搜索的Android项目,实现了字符串发音相似度模糊搜索功能,可以应用在语音查找联系人等场景。欢迎查看提出问题 https://github.com/bamboofly/vsearch

一种中文字符串相似度算法相关推荐

  1. 按照拼音对数组中的中文字符串排序的算法

    按照拼音对数组中的中文字符串排序的算法,不是很难,这里直接放上代码,Demo去最下面找: 注:里面用到一个叫George的牛人写的中文转拼音首字母的函数pinyinFirstLetter,因为内容实在 ...

  2. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  3. 字符串相似度算法(编辑距离算法)

    编辑距离算法 前言 原理 公式 例子 实现 后记 前言 比较两个字符串的相似度,通常我们会使用编辑距离算法来实现. 下面是常用字符串相似度计算的方法: 字符串相似度的几种度量方法 原理 最小编辑距离的 ...

  4. 字符串相似度算法——Levenshtein Distance算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  5. 计算字符串相似度算法—Levenshtein

    什么是Levenshtein Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删 ...

  6. java 中文相似度6_确定中文字符串的相似度解决方案

    分析 最简单的问题求解 字符串由一组不同含义的单词组成,它不同于数值型变量,可以用一个特定的数值来确定它的大小或位置,所以用何种方式来描述两个字符串之间的距离,成为了一个值得探讨的问题. 通常情况下, ...

  7. [转]文本相似度算法

    来源:http://www.cnblogs.com/liangxiaxu/archive/2012/05/05/2484972.html 文本相似度算法 1.信息检索中的重要发明TF-IDF 1.1T ...

  8. 文本相似度算法的对比及python实现

    文本相似度算法的对比及python实现 前言 通常我们有这样的需求:对两篇文章或者产品内容进行重复率查询. 为了解决类似的问题,罗列了一些常见的相似度算法,用python代码实现. 五种常见的相似度算 ...

  9. python实现文本相似度算法的对比及

    文本相似度算法的对比及python实现 前言 通常我们有这样的需求:对两篇文章或者产品内容进行重复率查询. 为了解决类似的问题,罗列了一些常见的相似度算法,用python代码实现. 五种常见的相似度算 ...

最新文章

  1. ubuntu 安装GPU黑屏 修改GRUB_Ubuntu安装mysql后修改用户名和密码
  2. 实例1 -- 判断输入年份是否为闰年
  3. python pip-python之pip的使用
  4. linux xshell上传文件夹,XShell上传文件到Linux服务器上
  5. 前端学习(2570):template和jsx的对比
  6. python爬取网上文章_python 爬取微信文章
  7. Confluence 6 为一个空间应用一个主题
  8. C#格式化小数位的方法
  9. Linux基础入门之VM和centos的安装使用
  10. java怎么编写木马_Java也能写木马~(附源码!)
  11. 二、JavaWeb动态网页基础
  12. 一般app测试的最佳方法
  13. HTTPS TSL/SSL详解
  14. 【C++PTA】7-1 运算符重载 分数类 约分
  15. Libgdx粒子效果介绍与使用心得
  16. 社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)...
  17. Livy 安装使用说明
  18. 高数 | 【数一专项】真题回顾整理及知识点总结
  19. android 6.0 vold shutdown流程
  20. 蓝牙会干掉Zigbee吗?

热门文章

  1. ARP Cache Poisoning Attack Lab(SEED实验)
  2. vue项目 编辑器保存代码后自动更新浏览器页面内容
  3. Mac OS X平台下QuickLook开发教程
  4. vue之使用vue-cli搭建SPA项目
  5. 秒杀脚本丨Python淘宝或京东等秒杀抢购脚本实现
  6. Canvas绘制网格
  7. MATLAB生成excel表格
  8. Innosetup安装界面美化卸载界面美化
  9. java中级工程师所需的技能_java工程师简历专业技能填写样本
  10. Unity中的矩阵含义