SmartBox自动补全用户输入
用户在输入搜索关键词时,根据已经输入的部分,自动提示出后面可能需要输入的词,既减少了用户输入的劳动量,也可以提示用户当前有哪些备选,有效的降低输错的几率,提升搜索的体验。
在第一期中,我们做了一个汉字提示的功能,从User Log中提取出每天搜索频率最高的词,和这些词命中的搜索结果数,更新到服务器中,然后提供补全提示功能。数据每天凌晨增量更新一次,保证数据的实时性,相比其他产品的补全功能,我们的数据要及时准确的多。
系统结构:
系统的性能:
由于结构简单,使用UDP通信,后台全部使用内存树的结构,处理能力>3000个/秒
数据结构和算法:
1.原始数据 <<string keyword,int freq,int cnt>........>
keyword按照unsigned char建立节点:0~255 最多可以建立 255棵树
下层子节点按照1/4字节(0~16)建立子节点,主要是存储效率和查询效率上考虑,同时使用一个tag标识节点是否是最后一个节点
2.树结构示意图:
3.例如,原始数据中的字符串:我是中国人,分解后:0XA0B0C1D2...这样的十六进制串,按照2中的格式存储到树中
4.用户输入,用户每次按下键盘,触发js的keydown事件,发送一个请求到CGI,CGI将用户输入的内容送到SuggestSvr,suggestsvr分解用户输入串,根据编码去树中查询,最后将结果压入优先级队列中,返回搜索频率最高的前10个结果给用户,值得一提的是,我们对返回结果的用户的KeyWord做了分词处理,以保证用户的搜索结果更加丰富
在实际的运营环境中,我们从log中看到,用户直接输入拼音进行搜索导致失败的比率比较高,例如输入“shouji”来搜索“手机”,在上个版本中,我们做了一个优化,增加了对拼音的支持。
由于汉语的复杂性,支持拼音比仅仅支持汉字要复杂的多,即使在一些比较大型的搜索引擎上,不完善的地方也随处可见。
1.汉字到拼音映射表:
我们准备了一个基本词表,每个汉字->拼音的映射,词表非常小,只有几K,格式如下:
<拼音,汉字 freq,汉字 freq,汉字 freq>
例如<a 阿 13555 啊 13444 呵 13333......>
2.汉字短语到拼音的转化:
根据1中的映射表,我们可以建立这样一个二维数组:
char PY2HZ[65535][32]={.....}
一维下标表示一个汉字的编码,单个汉字是2字节组成,单个汉字的取值范围刚好在[0,65535],可以直接通过数组下标获取到汉字对应的拼音
3.建立索引:
1)针对用户日志中的keyword,首先转换成拼音
例如:我是中国人,根据每个汉字的编码获取到单个汉字的拼音,汉字直接用"‘"分隔,wo’shi‘zhong’guo‘ren
2)建内存树
以每个字母为一个节点建树,{a~z}{A~Z}最多64颗树,实际上远小于这个数字,一些不可见字符
typdef struct NODE{
char value;
Node *pBrother;
Node *pChild;
char ctag; //-3表示到达一个汉字拼音的结尾,-2表示当前节点的字母是一个声母
DocInfo *pDoc;//指向当前短语对应的文档列表,如果短语没有结束,指针为NULL
}Node,*pNode;
typdef DOCINFO{
int iDocId;
int iFreq;
}DocInfo,*pDocInfo;
结构示意图:“手表”和“手机”的存储结构
4)检索时同样把用户输入的拼音串在树中查找
几个挑战:
1.一字多音,例如阿,可以读a,可以读e,这就导致在二维数组中,对“阿”查找拼音的时候比较麻烦,这里的做法是根据频率选择一个搜索频率比较高的
2.同音短语,比如:手机和收集,对应的拼音都是"shou'ji",这种情况处理起来比较简单,在上面的Node结构中,有一个DocInfo *pDocInfo,以数组的方式记录了拼音对应的所有同音短语
3.简拼,比如:sj,对应的可能是"手机",“收集”,“四级"........这种情况,在上面的Node结构中,有一个ctag=-2标识声母,通过这种方式,可以很好的处理简拼
4.混拼,比如:nuojy,对应的是“诺基亚”,混拼的处理方式和简拼的方式比较类似
5.对于一些英文和拼音的处理,电子商务中包含很多英文名的商品名,如何区分英文和拼音还有简拼、混拼,其实这里的关键在于音节的划分,处理上没有太大的区别
SmartBox自动补全用户输入相关推荐
- Android 自动补全提示输入AutoCompleteTextView、 MultiAutoCompleteTextView
以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器. 上效果图: MainActivity.java: package com.joan.testautocoml ...
- PowerShell: 在自定义代码中支持Tab键自动补全
大家好,我是码农杰克~ 在PowerShell中很多Cmdlet在输入参数时按tab键就可以可以自动补全,这是怎么做到的呢? 我们先来看个PowerShell自带命令:Test-Path 在Power ...
- Trie树实现前缀自动补全 + AC自动机实现敏感词过滤
文章目录 背景 扩展 AC自动机 背景 最近参与了某业务系统的开发, 需要根据城市的名字简称,找到其官方的完整名称.比如云南的大理,其实其完整的名称是大理白族自治州.可以参考官方的行政区划,点这里. ...
- JS实现在输入框内输入@时,邮箱账号自动补全
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8&quo ...
- MyEclipse的自动补全功能:输入@或者.没提示
自动补全功能.一般默认的只有输入 . 的时候来才能自动提示. 配置方法: 1. 打开MyEclipse,然后"window"→"Preferences" 2. ...
- Solaris - 使用TAB键自动补全和显示当前用户与目录
一.TAB键自动补全 习惯了其他Linux版本的自动补全,面对Solaris的这种情况,很是尴尬 通过修改如下配置: vi /etc/passwd 找到文件中第一行关于root用户的shell位 ro ...
- 英文输入时的自动补全功能
以搜狗输入法为例,在中文输入状态下,右击搜狗自定义状态栏,将"英文输入(E)"点亮,即可实现英文输入的自动补全
- java输入代码快捷键是什么_eclipse自动补全代码快捷键是什么
eclipse自动补全代码快捷键是空格键和回车键,补全代码功能需设置"Auto Activation triggers for java",代码提示选项补充完整后,输入关键字即可得 ...
- Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位
Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位 下面直接贴出代码 //监听输入框文本长度,并自动补全身份证最后一位验证位 mEdit.addTextChangedL ...
最新文章
- 懂数学的程序员能有多吃香?这是我听过最好的答案丨颠覆认知
- 一起谈.NET技术,云计算和数据
- vue配置vue-router
- Gallery简单应用
- SnipperImages(Silverlight DEMO)控件设计之--Slider和ColorSlider
- 作为 IT 行业的过来人,你有什么话想对后辈说的?2
- python天气预报的功能介绍_python实现智能语音天气预报
- WinZip命令行详解
- 曝微软将发布基于 Excel 的低代码语言:Power Fx
- 最速下降法 理论证明
- [周更]5.unity3D 三体运动(简易版)
- D - Molar mass
- 关于前辈RPC学习的经验分享:我的DedSec RPC
- 你是自己的太阳,无需借别人的光(持续更新)
- S-AES的加密与解密
- 中国新四大发明背后的“数据智能”
- node卸载淘宝镜像
- openstack kilo版本,虚拟机无法ping通外网
- python匹配ip地址
- IEEE-Access 期刊投稿和回信再投稿步骤