汉语拼音的模糊音扩展(用于搜索纠错)

news/2024/11/24 9:44:31/

    由于现在使用拼音输入法较多,很可能输入同音字而无法搜索到结果,或者由于普通话不标准(前后鼻音不分)输入了错误的拼音。例如用户想搜索”牛奶“却输入了刘来(liulai),那我们可以对liulai进行模糊音扩展,然后一起放到搜索引擎中去搜索。为了避免过度扩展曲解了用户的意图,对于扩展词需要进行排序,越少改动越排在前面(原文排在最前),越多改动越排在后面。在搜索时按照顺序赋予不同的权重。

  类似这样:

 "query": {"bool":{"should":[{"match" : { "t.py":{"query": "lanqiuxie","analyzer":"whitespace","operator":"or"  ,"boost":3}}},         {"match" : { "t.py":{"query": "langqiuxie","analyzer":"whitespace","operator":"or"  ,"boost":3}}}, {"match" : { "t.py":{"query": "nangqiuxie","analyzer":"whitespace","operator":"or"  ,"boost":2}}}, {"match" : { "t.py":{"query": "nanqiuxie","analyzer":"whitespace","operator":"or"  ,"boost":1}}}]}}}

好,现在show一下模糊拼音扩展的算法:

1.声母l和n互换

2.韵母有g和没g互换。

3.变换少的排在前面。

例如 ["liulai"] => ["liulai","liunai","niulai","niunai"]

    //汉语拼音模糊音扩展static public List<String> expand(String[] ss) {int n = ss.length;List<String>[] lists = new ArrayList[n];List<Integer> changes = new ArrayList<>();for (int i = 0; i < n; i++) {lists[i] = expandOne(ss[i]);if (lists[i].size() > 1) changes.add(i);}int max = changes.size();if (max > 4) max = 4;List<String> ans = new ArrayList<>();for (int i = 0; i <= max; i++) {ans.addAll(miss(lists, changes, i, 0, 0));}return ans;}static private Map<String, String> confusingMap = new HashMap<String, String>() {{this.put("in", "ing");this.put("an", "ang");this.put("en", "eng");this.put("un", "ong");}};static private List<String> miss(List<String>[] lists, List<Integer> changes, int c, int b1, int b2) {List<String> list = new ArrayList<>();if (c > changes.size() - b2 || c < 0) return list;int n = lists.length;if (c == 0) {StringBuilder sb = new StringBuilder();for (int i = b1; i < n; i++) {sb.append(lists[i].get(0));}list.add(sb.toString());} else {int fc = changes.get(b2);StringBuilder sb = new StringBuilder();for (int i = b1; i < fc; i++) {sb.append(lists[i].get(0));}String pre = sb.toString();List<String> left = miss(lists, changes, c - 1, fc + 1, b2 + 1);for (int i = 1; i < lists[fc].size(); i++) {for (String s : left) {list.add(pre + lists[fc].get(i) + s);}}pre += lists[fc].get(0);left = miss(lists, changes, c, fc + 1, b2 + 1);for (String s : left) {list.add(pre + s);}}return list;}static private List<String> expandOne(String py) {List<String> list = new ArrayList<>();list.add(py);if (py.equals("yang") || py.equals("yan")) return list;if (py.startsWith("l") || py.startsWith("n")) {List<String> vs = changeVowel(py.substring(1));String[] ln = py.startsWith("l") ? new String[]{"l", "n"}: new String[]{"n", "l"};for (String sm : ln) {for (String s : vs) {String nw = sm + s;if (!nw.equals(py)) list.add(nw);}}} else {List<String> vs = changeVowel(py);return vs;}return list;}static private List<String> changeVowel(String s) {List<String> list = new ArrayList<>();list.add(s);if (s.endsWith("iang") || s.endsWith("ian")) return list;int len = s.length();for (Map.Entry<String, String> en : confusingMap.entrySet()) {String k = en.getKey(), v = en.getValue();if (s.endsWith(k)) {list.add(s.substring(0, len - k.length()) + v);break;} else if (s.endsWith(v)) {list.add(s.substring(0, len - v.length()) + k);break;}}return list;}public static void main(String[] args) {System.out.println(expand(new String[]{"niu","nai"}));}


http://www.ppmy.cn/news/661381.html

相关文章

Vue-cli3 ,js根据汉字或拼音模糊搜索功能,汉字支持同音字、多音字,支持首字母

输入汉字模糊查询同音字&#xff0c;多音字&#xff0c;支持首字母&#xff0c; 目标用户为视障人士&#xff0c;需求是&#xff1a; 匹配字段&#xff1a;“行为” 。 可以使用 “兴魏”&#xff0c;“性未”&#xff0c;“xw”&#xff0c;“xingwei” &#xff0c;“航为”…

jquery easyui实现汉字拼音首字母模糊查询

本片文章并非原创&#xff0c;而是将网上的方法整理了一下&#xff1b;网上给出的代码不一定完全适合自己的项目&#xff0c;具体的要更加自己的情况修改&#xff1b; 不要直接复制粘贴代码&#xff0c;这样是行不通的&#xff1b;自己要理解前人这样实现的目的和原理 在实现…

vue pinyin-match下拉框设置拼音模糊搜索

<el-form-item label"姓名&#xff1a;" prop"substation"><el-selectv-model"formInline.substation"placeholder"全部"filterablevalue-key"id":filter-method"pinyingSub"clearableclear"clearS…

什么是模糊查询?

什么是模糊查询 介绍 &#xff08;1&#xff09;当想查询学生姓名中包含字符a&#xff0c;就需要使用到模糊查询&#xff0c;模糊查询的话使用关键字是like&#xff08;像&#xff09; &#xff08;2&#xff09;通配符 &#xff1a;任意一个字符 张_&#xff1a;张三&#x…

拼音模糊查询+java,拼音模糊查询实现

例如:模糊查询班级中所有姓 “李、刘” 的学生,只需要在查询的时候输入一个 “L” 进行查询。 string PYM = ""; foreach (char c in PersonName) {if ((int)c >= 33 && (int)c <= 126) {//字母和符号原样保留 PYM += c.ToString(); } else {//累加拼…

vue+iview实现拼音、首字母、汉字模糊搜索

最近项目做的后台管理系统中&#xff0c;要求实现一个支持拼音、首字母和汉字模糊搜索的下拉框。项目是用vueiview做的&#xff0c;iview中有select远程搜索。但是&#xff0c;iview框架也有弊病就是会将输入框中的输入值进行过滤&#xff0c;如果你搜英文的&#xff0c;ok是可…

js拼音模糊搜索

2019独角兽企业重金招聘Python工程师标准>>> https://github.com/xmflswood/pinyin-match 下面以vue-cli项目的代码做范例 1.先引用该工具&#xff0c;在用到的子组件单独使用 import PinyinMatch from pinyin-match2.使用computed即时过滤&#xff0c;注意&#xf…

antd-select拼音首字母模糊查询

antd-select拼音首字母以及汉字模糊查询 cnchar安装引入使用spell方法stroke方法 下拉框数据下拉框重写筛选函数 百度搜了很久&#xff0c;jQuery方法在react里会报错&#xff0c;终于找到了一个可以实现的第三方库cnchar。可以实现拼音首字母以及汉字模糊查询 cnchar 安装 …