关于输入法的猜想
每逢期末便是大作业、答辩涌来之时.
这一次我做了一个拼音检索汉字的原型, 数据结构表示如下图(这种数据结构叫做字典树):
.. image:: img/ime.png
每个节点的结构如下:
.. code:: c
typedef struct Node {
// 这个节点保存的字母
char ch;
// a,b..z 26个子节点
struct Node *children[26];
// 保存所有汉字的链表
LinkedList *words;
}
很明显, 太笨了(我笨?还是原型笨?), 当然啦, 我是没做过输入法, 所以这只是我的猜想, 输入法可以把词组也存储在存汉字的地方.
如何使输入法更加准确呢?那就要为每个字或词加入权值了, 另外,
为了更贴合用户的使用习惯, 必须在用户输入后对权值进行更改,
但是这里有一个问题, 如果用户本身输入很快,
输入的同时又必须对权值进行更改, 那么估计会很卡,
所以我想到了可以借鉴\ redis
\ 再hash的时候的想法,
可以安排一个\ daemon
\ 先记录下用户的输入,
在某一个适当的时候把统一进行权值更新;
在这里, 某个适当的时候有两种情况, 一是定时执行, 这种方法很简单,
却不够智能, 很有可能执行权值更新的时候与用户输入产生冲突;
另外一种就是让记录用户权值的\ daemon
\ 进行判断,
在某一段时间用户未激活输入法的时候进行权值更新,
如果此时用户激活了输入法, 立刻暂停权值更新工作.
这就是我对输入法工作原理的猜测.猜测而已.
当然, 与老师交流了一下想法, 老师说搜狗输入法的工作原理类似, 但是是把用户词库单独记录, 检索的时候优先检索用户词库, 再检索自带词库, 并且会把用户词库上传到“云”, 当然啦, 这样的优点还是很明显的, 不会导致单个词库过大而使检索变慢. 但是有一点需要说明的是, 我也不知道搜狗是不是这么做的, 我无从考证.
.. |ime-pic| image:: /public/images/ime-pic.png
更多文章
本站热门
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- frp 源码阅读与分析(一):流程和概念
- 用peewee代替SQLAlchemy
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(二):shim, docker-init和docker-proxy
- Docker组件介绍(一):runc和containerd
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程