当前位置: 首页 > Web前端 > HTML

如何实现一个高效的拼音匹配库?解决和弦字符、首字母匹配等问题

时间:2023-04-02 14:19:49 HTML

如果本文对您有帮助,请点个星!先看列表效果:再看和弦长字符串:在线演示地址:http://laosep.top/pinyin-match/接下来说说微信的拼音匹配规则的实现。参照微信,分为两种。大小写,一个不包含和弦字符,一个包含,我们先从简单的说起。1、不包含多音字,以“nizhenhao”为例打匹配:完整的拼音输入√(当然只输入zhenhao/hao也可以)拼音首字母√尾音不完整√(打字打到一半)无法匹配:首字母不是分词点x(z)henhao,有的用缩写,有的用全字母xniz(hen)hao2。包含复音字符以“骑马(qimajima)”为例直接套用非复音字符的规则总结在OK匹配规则中。首字母必须是拼音分词点,最后一个字除外,不允许。按顺序输入一半的和弦字符)只要列出对应的和弦字符,套用上面的规则,然后用JS实现一个匹配库pinyin-match.js步骤:对输入的拼音进行切分,将中文转拼音匹配结果第一步用第二步的拼音进行分词,返回是否命中。1、拼音分词需要检查输入拼音的有效性,进行分词处理。这一步是匹配算法效率的关键。首先举个例子:搜索时,输入“济南”可以匹配到哪些读音词?jinan(如:Jinan)jinan(如:Jin'an)此外,输入不完整还应考虑jinan(g)(如:JiNang)jinan(g)(如:JinAng)jinan(eng)(如:Jinaneng)jinan(a)(如:Jinana)...有很多很多很多很多很多很多很多很多很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,很多,many等等。但是因为i开头没有拼音,所以这里没有)根据循序渐进的原则,我们先解决拼音输入完整的情况,即,前两个。这里的核心算法其实就是word-break,先附上leetcode链接WordBreakII解决word-break的问题word-break如下:给定一个字符串s和一个单词字典dict,求s根据dictall可能的。示例:lets='catsanddog'constdict=['cat','cats','and','sand','dog']wordBreak(s)//return['catsanddog','catsanddog']先用一张图来说明思路:总结一下这个算法:从第一个字符p开始,检查它是否在字典中。字典中没有,字符p+1,重新查找;如果在词典中,则记录命中词,如果还有剩余字符串则做2,对剩余字符串重复1;如果没有剩余字符串,则完成当前搜索,找到的命中词可以组成一个完整的句子。回到上一个成功的状态,字符p+1继续1。退出条件是将整个字符串丢入字典(即字符p++++++++1,直到结束)。代码实现:functionwordBreak(s){letresult=[]//当前处理letsolutions=[]//保存完整结果getAllSolutions(0,s,result,solutions)returnsolutions}functiongetAllSolutions(start,s,result,solutions){if(start===s.length){//后续没有s,即找到命中结果,存为solutionssolutions.push(result.join(''))return}for(leti=start;iitem.indexOf(piece)===0)假设输入的所有字符都是第一个字母,就简单多了,把输入的每个字符拆开就行了(其实我这里偷懒了,因为有些单音在字典里是没有的,不过这点影响可以忽略)考虑到上面两种不完整的情况,我们已经完成了核心的wordBreak功能下面我们来看看中文转拼音的方法2.中文转拼音1.首先你要找一本拼音词典。我从开源库pinyinjs找到了一个比较合适的词典,收录了6763个常用汉字。原字典结构如下:2.实现一个pinyin(cn),输出中文对应的拼音。方法很简单。这里简单介绍一下:首先把原来的字典转换成一个以中文为key的pinyinMap,然后在这个map里面直接搜索对应的map中文就可以了(记得要考虑多音字)pinyinMap如下:3.匹配的中文拼音分词结果,直接在代码中显示。以输入'cengd'匹配'我曾大'为例:vara=getPinyin('我是大')//a=['wo','zengceng','da']通过的结果排列拼音函数varb=getFullKey('cengd')//b=[['cengd',['c','e','n','g','d']]根据wordBreak的结果,匹配函数是源码中的getIndex函数,受限于长度(懒惰),这里用一张图来展示匹配过程:这个匹配函数的简单总结就是有一个元素在可以完整连续匹配a的b(当然最后一个音只需要部分匹配)写在本文最后。pinyin-match对比核心分词算法,其余部分只是简单演示,并没有完整分析pinyin-match的所有方法(比如获取匹配索引,原文中有空格影响索引等),如果文中没有说明,有问题欢迎在评论区提问~如果有帮助,请点个星!pinyin-math插入一些无关的东西:我目前正在寻找新的工作机会,前端,基地期望:广州>厦门>深圳(暂时不考虑其他地方)