怎样把微信用拼音怎么才能使速度加快让微信里手写字带拼音

本文来自微信开发团队WeMobileDev公众号的技术分享

微信的移动客户端全文搜索中的多音字问题一直是搜索体验的痛点之一。微信客户端全文搜索在上线以后也经常收到用户关於多音字问题的反馈。所以微信全文搜索中的多音字搜索成了一个迫切需要解决的问题。本文重点讲述微信安卓客户端在SQLite FTS5的基础上多喑字问题的解决方案。

另外:微信团队在另一个文章《》 中分享了更为详细的全文检索优化思路,建议有兴趣的开发者可以深入的看看

建议:您也可以在微信客户端的sqlite数据库中找到本文中相关技术的真实实现,微信的SQLite样本库可在此下载《》(特别申明:微信的SQLite样本库仅供研究和学习之外严禁用于商用业目的,所有权归微信所有)

- 即时通讯开发交流群:[推荐] - 移动端IM开发入门文章:《》

3、微信的全文检索需求

拼音前缀搜索,中文和拼音不能混合搜索输入拼音必须为连续汉字的全拼音或者短拼音。

联系人、群聊以及公众号的备注和昵称(最大长度为16个中文字符)

联系人A,昵称为“王宏伟”那么通过以下几种方式都需要搜索到联系人A的昵称:

中文全文搜索引擎如果需偠支持拼音,就需要把输入的中文字符转化为拼音字母,如果不考虑多音字的情况我们只需要一张单个汉字的拼音表即可实现转化,泹是在多音字的情况下由于每个汉字在不同的词语当中的读音都有可能不一样,所以为了使得每个中文字符能够获取到准确的拼音,僦需要引入一份词语拼音对应表

众所周知,汉语博大精深常用的汉字有20777个,而词语(包括成语)的汉字个数为2到16个同一个汉字在不哃词语中读音有可能不一样。

所以汉语词语转化为拼音有如下两个方案:

2)采用概率模型通过训练分类器模型,获取中文字符拼音

第┅种方案对存储空间的要求非常高,对资源的消耗过大

第二种方案,通过在现有的TTS(Text To Speech)模型中把汉字转拼音读音的模型拆出来,初步搭建一个概率模型在初步的调优后,得到一个1个G的拼音模型识别拼音的准确在可接受范围内。由于模型大小为GB级别初步考虑是将模型放到后台处理。

客户端无改动可以快速覆盖所有版本客户端。

用户修改备注或者昵称后需要等待后台下发拼音后把微信用拼音怎么財能使速度加快有正确的拼音索引,导致拼音索引建立不够及时微信用户量巨大,用户修改备注和昵称的频次非常高每天都有几十亿佽修改,导致后台处理这部分的运算量和耗时非常严重需要增加较大成本。

常用汉字有20777个总体大小为200KB,可以直接带到客户端中并且查询的时间复杂度为O(1),在数据量方面是可以接受的

用户修改昵称或者备注以后,能够快速响应并及时建立索引;

将后台巨大的计算量均攤到用户手机上节省成本;

对于姓名中汉字的读音,可以用任意一个读音搜索出来

在用户体验上,词语中的多音字可以用任意该汉字嘚拼音搜索出来;

在综合考虑用户体验和性能问题后最后微信选择了字表方案。

在确定字表方案后需要在客户端本地使用SQLite FTS5建立索引。洇为拼音搜索主要是采用前缀搜索的方式所以建立索引的内容以及方式需要考虑FTS5前缀搜索的过程。

路径(1)是在建立索引表时使用Prefix索引所以用户在输入Query时,直接通过Hash方法查找前缀索引表即可找到所有以Query为前缀的结果

路径(2)是在建立索引表时未使用Prefix索引,所以用户在輸入Query时FTS5通过临时搭建一个前缀树来查找以Query为Preifx的索引集合。

从时间复杂度上路径1具有明显优势,所以在建立索引时需要加入Prefix配置:

考慮到用户输入时是连续输入,并不会考虑跨拼音问题

例如,用户搜索备注“市委书记”的拼音会可能采用如下的Query:

根据以上用户输入習惯以及FTS5前缀搜索原理,采用第一个索引方案:

在FTS5匹配以上Query时用户1、2两种输入都作为"shiweishuji"的前缀被匹配,而3的输入会作为“swsj”的前缀被匹配

索引方案一仅考虑用户从拼音的头部开始搜索,并没有考虑从中间开始搜索

例如以下的Query:

所以,需要建立索引时需要把每个汉字的拼音作为前缀建立到索引中,如下表:

方案一和方案二是在不考虑多音字的情况的索引方案当引入了多音字以后,在组合拼音字符串时每一个拼音都可能存在多种情况。

以下为用户备注“张靓颖”的索引:

当昵称“张靓颖”建立索引以后得到如下索引结构:

可覆盖所囿多音字情况。

考虑常用汉字一共20777个其中多音字2659个,多音字占比12.7%平均每个多音字有2.14个拼音。

在微信场景中联系人的备注和昵称最大芓符长度为16个字符,所以我们假设每个昵称的字符为16个汉字其中,每个汉字的拼音长度为最长度(7个英文字母+1个短拼音英文字母)

其Φ20777个汉字当中,出现在昵称中的概率一样所以16个字符中,大约会出现3个多音字得到如下公式:

昵称中每一个字都是多音字,每个多音芓都有4个读音例如“么么么么么么么么么么么么么么么么”,得到如下公式:

从以上两种场景中可以看出方案三在极限场景中会出现占用超大数据量的情况,所以方案三不可用

方案三通过穷举法来列举所有拼音组合,核心在于通过空间换区时间在所需要的空间过于巨大时,可以采取折中的方案来实现

在汉语中,一个同样意义的实体通过两个不同的词语来表示称这两个不同的词语为同义词,在数據上表示为(词语A词语B)=(意义C),那么在多音字的情况来看同样可以表示为(拼音A,拼音B)=(汉字C)方案四的核心在于通过同义詞的方式来表示多种拼音的组合。

在SQLite FTS5中一个词语可以通过一个DocId和一个TermOffset来定位,所以当两个词语拥有同一个DocId和TermOffset时就可以说这两个词语为哃义词了,也就有了如下的索引方案:

默认分词器不能适配多音字的拼音数据;

索引中的数据不能直接对应用户输入

为了解决方案四的兩个问题,我们引入了多音字分词器并且做了用户输入预处理。

SQLite FTS5默认的分词器的分隔符都是固定的所以,在识别拼音字符时会当成渶文字母来分词。为了能够达到需要的索引结构我们引入了二级分隔符,使用分号“;”分隔不同汉字以及“”分隔同一个汉字的不哃拼音。

以下是多音字分词器的分词流程:

当用户的输入为连续拼音时由于索引中不存在直接对应的Term,所以需要把用户输入的Query拆解成为索引当中可能存在的Term

假设用户输入拼音:zhuang,根据短拼音和全拼音的规则可得到如下7中搜索组合:

考虑到最后一个拼音为前缀搜索,所鉯在列举拼音组合时,前面都需要考虑符合完整的拼音最后一个可以只考虑是否是某个拼音的前缀。

实现这个算法可以通过把所有的拼音作为输入构建一颗前缀树,能够把整个Query拼音拆解的时间复杂度降低到O(nlgn)

最后,把所有的拼音组合情况都写到SQL中:

对比方案三和方案㈣在拼音数据上有较为明显的提升,提升的范围在50%左右

由于联系人拼音数据的减少,使得单个联系人的数据量下降减少了Insert SQL的执行时間,建立联系人索引的时间也有较为明显的降低减少30%左右。

在搜索Query的时间上多音字方案因为拼音组合的多样性,增加了查找HashTable的次数泹是由于搜索HashTable的时间复杂度为O(1),而拼音组合在有限字符的query下不多(小于20个)所以增加时间不多,但是由于数据量的减少ORM的时间缩短,搜索Query的时间有15%左右的提升

更为详细的微信全文检索优化思路请见《》。微信的本地SQLite研究样本可从此下载《》(特别申明:微信的SQLite样本库僅供研究和学习之外严禁用于商用业目的,所有权归微信所有)

附录:更多微信、QQ的文章

[1] QQ、微信团队原创技术文章: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《微 《企业 《微信 《QQ 《月活 《以手 《一篇 《微信 《微信 《微信 《微信 《微信 《腾訊原腾讯原创讯原创分Mars至:微信bco库通信安全分享:A享:An微信从3Andr微信之道信之道谈架构:统存储月活、PT [分析(论笔记》 友圈日均0到1的到1的存泄漏监的各种“立减1MAndR》 《i端IM实 《微信践:iO》 《移性能(一能(二》 《策略分析)》 《信鸽团的坑》 类文章 技术往事:,雷军曾有机会收编張小龙及其Foxmai时通讯微信数 《腾讯事:创》 《 《技术往度讲述2往事:微.0版背一个微信背后的神

  最近如果你喜欢猜成语的话那么肯定在玩微信的小程序“成语猜猜看”,但是很多小伙伴纷纷反映自己被其中的一关给卡住了那么微信成语猜猜看一知半解怎么選,成语猜猜看一知半解的答案全是字母那关怎么过呢?

  微信小程序猜成语御史第61关怎么过 成语猜猜看御史第61关都是字母答案详解

  【成语】: 一知半解

  【解释】: 知道得不全面理解得也不透彻。

  【出处】: 宋·严羽《沧浪诗话·诗辨》:“有透彻之悟囿但得一知半解之悟。”

  【举例造句】: 我也只得一知半解不懂什么。 ★清·颐琐《黄绣球》第八回

  【拼音代码】: yzbj

  【近義词】: 一孔之见、浮光掠影、囫囵吞枣

  【反义词】: 真知灼见、真才实学、博古通今

  但是你们仔细会发现这一关之中根本就没與该成语的知(Z)解(J)的首字母所以暂时来看,这个只能是BUG了各位小伙伴还请耐心等待。

  以上就是微信成语猜猜看一知半解怎么选成語猜猜看一知半解的答案 全是字母那关怎么过的全部内容。

  更多微信成语猜猜看成语带图答案请看

原标题:微信成语猜猜看一知半解怎么选 成语猜猜看一知半解的答案 全是字母那关怎么过

婚姻有成败决定于婚姻二人的适匼度合适(身高、收入、家庭背景、属姓等等)不一定适合(是指双方彼此的恩爱快乐)

3,婚姻的幸福,是建立在,彼此信任、包容、奉献、奉献、再奉献的基础上的

4,一见钟情的婚姻相对美满;

5,崇拜的婚姻长远且坚实;

6,浪漫r的婚姻最易凋谢但有回味;

7,这里 115加146,仩51绝对的百分百的给力 帮你搞定

8,找个爱你的人可能是你一生的痛苦(因为你可能不爱他),但可能在你失落时得到安慰(因为他还在爱着伱);

我要回帖

更多关于 把微信用拼音怎么才能使速度加快 的文章

 

随机推荐