由于现在使用拼音输入法较多,很可能输入同音字而无法搜索到结果,或者由于普通话不标准(前后鼻音不分)输入了错误的拼音。例如用户想搜索”牛奶“却输入了刘来(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"}));}

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

  1. 搜狗输入法模糊音设置 (非自定义短语设置)

    在开始之前, 先看一个示例: 当我们某个拼音输错时, 搜狗输入法一定程度上是可以自动帮我们纠正的: 但是遇到 长文本或连续出错 的情况时, 输入法的纠错能力就有点无助: 观察出错的拼音, 我们发现其实 ...

  2. c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作

    c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作 在这里插入图片描述 using Autodesk.AutoCAD.DatabaseServices; using ...

  3. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

  4. 抖快排抖音短视频搜索排名前十方法

    大家都知道,在庞大的流量池塘里,要想引流变现根本不是难题.而抖音就是一个坐拥超级庞大流量的平台.运用一些小技巧,就可以引流到相当大一部分的精准流量.截止到2019年1月,抖音国内日活跃用户超过2.5亿 ...

  5. 世界唯一用于搜索地外生命射电望远镜暂停运行

    如果有外星人最近试图联系我们,那他很可能会失望而归. 原因是接通外星人的"星际电话"--艾伦望远镜阵列正面临着"欠费停机"的窘境.4月22日,美国"搜 ...

  6. 使用Windows本机库扩展用于ESSO AccessProfile的IBM Security Access Manager

    在本文中,了解有关在企业级单点登录(ISAM ESSO)8.2 AccessProfile的IBM Security Access Manager中开发和嵌入Windows本机库的信息. 根据样本库逐 ...

  7. 为什么要做抖音短视频搜索排名

    2021年抖音官方发布一则短视频搜索排名的数据,月活搜索用户抖音已达5.5亿已经超过某度,短视频市场规模将接近2000亿,快手和抖in"C位"出道! 月活用户的搜索数据足以看出人们 ...

  8. iBeacon模块用于搜索附件的iBeacon设备

    HBuilderX1.1.0及以上版本支持此功能. 方法: startBeaconDiscovery: 开始搜索附近的iBeacon设备 stopBeaconDiscovery: 停止搜索附近的iBe ...

  9. Python实现抖音关键词热度搜索小程序(附源码)

    今天给大家带来一个抖音热词小程序,废话不多说,直接上代码 import requests import json import urllib.parse import time headers = { ...

最新文章

  1. 2020-10-29Ubuntu20.04将软件添加至桌面
  2. 模块化与nodeJs
  3. 妇女在IT安全工作人员当中的比例只有10%
  4. YUIDoc的使用方法小结
  5. 美团在Redis上踩过的一些坑-3.redis内存占用飙升
  6. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
  7. [luogu4389]付公主的背包
  8. Apache Flink新场景——OLAP引擎
  9. excel 多次筛选后的range数据处理
  10. 行业大牛都是同时掌握游戏建模和游戏原画的吗?
  11. 推荐游戏玩家使用金山密保保护帐号安全
  12. hbase java客户端_【HBase教程】(八)HBase JAVA 客户端API使用
  13. android餐饮管理系统,餐饮管理软件,餐饮软件,美萍餐饮管理系统,酒店收银系统,饭店点菜系统,餐饮点单库存系统...
  14. Ubuntu下安装UDK
  15. 柳夜熙又更新了,虚拟人的底层技术是什么?
  16. c++ 求N个数的最大公约数和最小公倍数
  17. 简述5G技术在远程医疗应用
  18. vPro里面的v代表什么意思?
  19. 虚拟化开源技术有哪些_您使用哪些开源虚拟化工具?
  20. 查看路由器拨号的宽带密码

热门文章

  1. Vue 数组删除和修改元素后页面立即刷新
  2. 最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
  3. STM32时钟系统了解
  4. ZjDroid--脱壳神器介绍
  5. 【RAC】如何修改SCAN IP的IP地址、名称、端口等信息
  6. android-b9是什么设备,Android 设备上可以实现 3D Touch 吗?| 原力计划
  7. dos脚本批量更改照片命名(文字变更数字)
  8. Cubase中MIDI设备的如何添加面板
  9. 论文评审最大流_关于硕士学位论文评审中出现的问题及其处理
  10. CFDA《药品数据管理规范》疑难点解读