rongzedong / QuicKid

智能快速拨号,联系人APP,查看通话记录,查看联系人,打电话,发送短信……

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

QuicKid

  1. Quick-Dialog
  2. Voice-Dialog
  3. Handwrite-Dialog

先定义一下几个规则

  1. 完全匹配。指输入字符串与联系人内某一匹配项完全匹配。基础匹配数值为600,无加减分项。

    PanZhiHui-->PanZhiHui

  2. 前置首字母完全匹配。指输入字符串与联系人前几个首字母完全匹配。是前置首字母溢出匹配的特殊形式。有两个加分项, 无加分项,减分项为不匹配的首字母个数。

    PZH-->PanZhiHui。+2-0
    PZ-->PanZhiHui。+2-1

  3. 前置首字母溢出匹配。指在匹配首字母的情况下,还匹配了某一个或者几个首字母后一段连贯的字符串。~~有一个加分项,~~加分项为匹配到的首字母个数,减分项为不匹配的首字母个数。

    PanZH-->PanZhiHui。+1-0
    PZhiHui-->PanZhiHui。+1-0
    PZHui-->PanZhiHui。+1-0
    PZHu-->PanZhiHui。+1-0
    PZhi-->PanZhiHui。+1-1

  4. 前置段匹配。指一个长度为N的连贯字符与联系人内某一匹配项的前N个字符完全匹配。是前置首字母溢出匹配的特殊形式。同时意味着前置首字母溢出匹配事实上不需要加分项,只要保证前置首字母完全匹配的加分项比它大就足够了

    panzh-->PanZhiHui

  5. 后置首字母完全匹配。指输入字符串匹配除第一个首字母以外的其他几个连续首字母。有两个加分项, 无加分项,减分项为不匹配的首字母个数。

    ZH-->PanZhiHui

  6. 后置首字母溢出匹配。后置首字母完全匹配的情况下,还匹配了某一个或者几个首字母后一段连贯的字符串。有一个加分项, 加分项为匹配的首字母的数量,减分项为不匹配的首字母个数。

    ZHu-->PanZhiHui。+1-0
    Zh-->PanZhiRui。+1-1

  7. 后置段匹配。指有一串长度为N的连贯字符与与联系人内某一匹配项的后半部的一段N个字符串匹配,且此连贯字符的开头位置必须是某一首字母位置。*是后置首字母溢出匹配的特殊形式,同时意味着后置首字母溢出匹配事实上不需要加分项,只要保证后置首字母完全匹配的加分项比它大就足够了**。

    ZhiHui/Zhi/Hui-->PanZhiHui

  8. 后置无头匹配。指一串连贯字符在前7种全部未匹配成功的情况下,却被包含在字符串里。加分项为-index,减分项为长度差

    hiHui-->PanZhiHui

查询时匹配以上8种,其他情况不匹配。

排列规则

  1. 查询出的列表将按匹配度排序,匹配度不是一个简单的数值,而是几个有优先级别的匹配字段。优先按照级别排序,级别相同,再按加分项排序,加分项相同,再按照减分项排序,减分项相同,再按照默认的sort_key排序,加分项在大多数情况下是相同的。优先级别从高到低如下。
  • 完全匹配
  • 前置首字母完全匹配、前置首字母溢出匹配、前置段匹配。(当只有一个字母时,按规则#1算)
  • 后置首字母完全匹配、后置首字母溢出匹配、后置段匹配。(当只有一个字母时,按规则#5算)
  • 后置无头匹配。(可以考虑摒弃此匹配,没有人会这么按,而按键出错的可能性导致无头匹配的可能性又极小,往往不是想要的结果)
  1. 输入的一列查询字符串将同时与联系人的名字和电话匹配。
  2. 对于一个联系人,他的名字可能有多种发音,这时候要取匹配度最高的。
  3. 对于一个联系人,他可能有两个甚至更多的电话号码,匹配的时候要分别匹配,而不是单独取匹配度最高的。

事实上仍然可以简单地使用一个数值来表示匹配度。只需要做到低一级的无论怎么加都不可能大于高一级,高一级的无论怎么减都不会小于低一级的即可,因此我们要这时我们就需要对加分和减分顶做一个限制。对于加分和减分做一些数量上的限制。比如说最多+32,最多-32。就目前的情况来看,最多只+2,而减分项有可能任意多。但是不可能太多,出于谨慎考虑,对于减分限制为99个,若减分99次仍然不能影响加分项,则一个加分项至少要是减分项的100倍,那么我们取减分项为0.01,加分项为1。而四个级别分别给出400,300,200,100的加分基础数值。这样仍旧可以获得一个+99的加分空间和-99的减分空间而不会越级。

匹配算法写起来比较麻烦的应该是前/后首字母溢出匹配算法

2014/8/6 星期三 21:48:56 update

优先级其实应该分成6级,分别对应#1,#2,#3,#5,#6,#8匹配规则。

取减分项为0.01,加分项为1不变,对应六级基础数值分别是600,500,400,300,200,100。这样仍旧可以获得一个+99的加分空间和-99的减分空间而不会越级。

匹配的原则是匹配尽可能多的单词

这六个匹配规则还可以分成两大类。

  1. 前置匹配。
  2. 后置匹配。

2014/8/7 星期四 18:04:25 update

#2,#4均为#3的特殊形式; #1看起来是#3的特殊形式,但是它的匹配加分规则不同,所以不属于#3; #5,#7均为#6的特殊形式; #8不属于以上任何形式,事实上#8存在的意义不要不是用来匹配姓名,而是匹配一段电话号码;

因此再次分为4级,分别为#1,#3,#6,#8 ####;

取减分项为0.001,加分项为1,对应四级基础数值分别是4000,3000,2000,1000。这样可以获得一个+999的加分空间和-999的减分空间而不会越级,采取这么大的数值纯属无聊。

About

智能快速拨号,联系人APP,查看通话记录,查看联系人,打电话,发送短信……


Languages

Language:Java 100.0%