1. 中文分词
1-1. 什么是中文分词
分词 就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂得多、困难得多。
比如这样一句话 “小书匠是一款功能强大的笔记软件”,我们进行中文分词后,就会变成一个个词语,下面就是分词后的效果(为了说明的方便,这里用空格来做分隔)。这样的过程,就叫分词,因为只针对中文环境下的操作,所以叫中文分词。
- 1小书匠 是 一款 功能 强大 的 笔记 软件
1-2. 中文分词能用来做什么
从 wiki 或者百科上,我们可以看到分词主要是方便计算机识别语句的含义。更具体一点的应用就是搜索,机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等。
对于普通用户,用得最多的应该就是搜索,可能你并没有察觉你用到了分词功能,但其实搜索内部实现上,大量使用到了分词功能。特别是像百度,谷歌等搜索引擎。如果没有分词功能,数以亿计的网页,想在你按下搜索后的一两秒时间内返回结果,几乎是不可能的。该篇文章的最后,会介绍小书匠的中文分词搜索,虽然不能达到像百度,谷歌这种速度,但对于一般用户的知识检索,还是游刃有余的。
对于普通用户,除了搜索以外,能在感观上体验到分词的好处,这样的例子其实还很多,可能你并没有发觉到。在编辑器领域中,中文分词也可以提高用户的编辑体验。继续阅读下面的文章,定会让你眼前一亮,原来小书匠在对中文编辑操作体验上做了这吗多的改进!
2. 编辑器操作
2-1. 光标移动定位
通常编辑时,我们可以通过 left right 键来左右移动光标,定位光标位置。如果跳跃幅度比较大时,就通过鼠标直接点击一个具体的位置,将光标定位在那里,然后再编辑修改。
对于经常写英文文章的用户,不知道你有没有发现这样的一个技巧,就是按住 Ctrl 再加上 left 或 right 按键,就可以很方便的在 英文词语 之间快速的跳转,而不是像以前只能在 英文字符 之间一个字符一个字符的来回移动。
一个字符一个字符的跳跃,虽然准确率很高,但效率太低。通过鼠标点击,进行光标定位时,虽然优势是能够跨越比较大幅度的定位,但由于双手需要离开键盘,容易造成思路的中断,经常使用的话,反而更影响写作。单词之间的跳跃,正好解决了上面的问题,保证了双手无需离开键盘的同时增加了光标定位的跨越幅度,减少了按键的输入次数,提高了用户的编辑效率。
虽然单词之间的跳跃非常方便,但这个功能对中文确是无效!!!
因为单词跳跃功能是通过单词与单词之间的空格(或者其他标点符号)进行分隔的,而中文词组却是直接连起来,只在一句话需要停顿时,才有逗号句号等标点符号。正因为中文词语之间没有空格,我们按下 ctrl+left/right 时,都是直接跳跃到一句话的结尾,而不是在词语之间跳跃。
想要在中文环境下实现词语跳跃,那该如何操作呢?然道要用户在编辑时,自己手动在中文词语之间加空格?显然这是不合理的,再加上中文环境下,加了 N 多空格的文章,反而影响阅读体验。
小书匠为了解决这个问题,引入了中文分词,实现了中文词语之间的跳跃。所谓中文分词,就是让系统自动对整个语句进行拆分,变成一个一个词语。这个过程不需要用户自己手动输入空格就可以自动完成,改善了用户使用检验。
下面的两个视频,展示的是没有中文分词的光标定位和有中文分词的光标定位
没有中文分词的光标移动
有中文分词的光标移动
2-2. vim 下光标移动定位
vim 在查看模式下时,可以通过 w, b 或者 e 这几个按键,快速的在英文单词之间跳转定位,大大的提高了编辑效率。
但这样的操作技巧,对于中文,同样是没有任何效果,大部份的编辑器都是直接跳转到整个中文语句的结尾。
小书匠专门在 vim 模式下,也做了中文分词适配。
没有中文分词的移动效果
有中文分词后的移动效果
2-3. 双击选择
一般的编辑器,在鼠标双击一个字符时,会选中整个单词,这样的功能也是利用了英文单词之间通过空格来分隔的原理来实现的。
同样的,如果没有嵌入中文分词功能,鼠标双击一个中文字符,编辑器就直接选中了整个中文句子。
因为小书匠引入了中文分词,在编辑器里,直接鼠标双击一个汉字,小书匠自动选择了词语,而其他编辑器则是整个句子都被选中了。
旧版操作上的体验
最新版本操作上的体验
3. 全文中文分词搜索
3-1. 搜索
3-1-1. 正向索引搜索
当在小书匠内按 ctrl + f 时,就会打开搜索对话框,通过该对话框用户可以搜索当前文章里的内容,这就是我们最常见的普通搜索。该搜索操作,系统会将搜索词在文章内完整扫描比对,将符合的结果显示出来。
对多篇文章进行这种普通搜索时,其实就是一个正向索引的搜索。这种搜索需要遍历每篇文章,然后把符合结果的文章显示出来。文章比较少的情况下,再加上高性能的台式机,这种搜索用户是感受不到性能的影响,但是当文章特别多的时候,速度就会明显下降。
像记文章笔记这类软件,随着时间的增长,文章都会线性的增长,如果是使用正向索引搜索,速度必然会线性的下降。为了解决速度的问题,这样的笔记系统,最好的解决方案就是反向索引搜索。
3-1-2. 反向索引搜索
反向索引搜索就是把一篇文章打散开,分成一个一个词语做为最小单元,然后对这些词语进行索引,以后系统要搜索时,只对这些被打散开的词语进行搜索,就可以很快定位到这些词语对应的文章了。
可能有人会有疑问,为什么把文章打散开后,对词语做索引后搜索就会快呢? 其实原因很简单,就是我们的词语数量都是固定的,而文章是通过词语组成,组合方式多样化,再加上文章长短不一,这是一个不确定的因素;反向索引就是把不确定的因素转换成确定的因素。
举个简单点的例子,假设我们的词语只能是一个字,并且是新华字典 8500
个字里的其中一个, 这就是固定因素, 但我们通过这些新华字典里的字写出来的文章,却可以变幻无穷,丰富多彩,这就是不确定因素。但不管文章多么的精彩,篇幅多么的长,文章最终分词打散后,就是新华字典 8500
个字里的其中一个。
再假设我们每篇文章都至少有 10000
个字, 用正向索引搜索时,我们要对文章里的每个字,一个一个的比对,最终比对 10000 次才能知道比对结果;而反向搜索时,因为文章被打散开来,并去掉了重复的字,最终的字最多也超不过新华字典里的 8500
个字,这样比对时,最多也就执行 8500
次(注意是最多,运气好的话,可能就 1 次就可以了)。当搜索两篇文章时,正向索引搜索就要执行 2*10000
次, 而反向索引,因为新华字典里的字并不会因为文章增多,字也变得更多,最终比对时,还是最多就执行 8500
次。
依次类推,文章越多,正向索引搜索比对的次数也就越多,显示结果的速度就会越慢,而反向索引搜索的速度却几乎没有受影响。
当然上面的例子只是大概说明了反向索引的原理,真正应用到实际搜索时,还有很多地方要改进,像分词算法的设计,去掉无意义词,同义词处理,自然语言等,如果对这方面有兴趣,就需要自己在该领域下钻研了,我这里也只是起到抛砖引玉的效果。
小书匠实现了最简单的中文分词搜索(说是最简单,但比起上面举的例子,还是复杂很多)。虽然没有像百度,谷歌那么强大的搜索,但对于一般的笔记用户,小书匠的中文分词搜索还是能够帮助用户快速的查找自己笔记。
3-2. 搜索语法
小书匠上详细的中文分词搜索语法,可以查看这里。