知乎中的“近义词”(四):从搜索到智能

上回我们说到基于Word2Vec可以做一些相对靠谱的搜索引擎。这个其实是非常关键的一点。因为电脑从诞生之初就擅长记忆,计算,穷举类的工作,而并不擅长偏智能方面的工作——比如琴棋书画。这不是说电脑不能做有智能的事情,而是说比如我们要让电脑会下围棋要10000个小时的努力,但让电脑在记忆、穷举方面做得很好可能只要1个小时的努力。Not all tasks are created equal。而搜索,就是那个电脑特别擅长的任务。这篇文想说的是,其实从搜索这个看上去暴力的应用出发,电脑也可以变得很智能。

技术上来看,什么叫搜索引擎(Search Engine)呢?比如我们现在有10个文档,每个文档有一个编号。电脑看一遍这10个文档,记下来了每个文档的特点,我们把这一步叫做“索引”。索引完了以后,你可以给电脑一个词或者一句话,电脑会从这10个文档里面找到和你的搜索关键字最相关的文档,然后把这个文档的编号返回给你。够简单吧?对于Web搜索引擎比如bing,google来说,这个编号就是文档的URL。对于知乎的搜索引擎来说,这个编号就是回答的id。但其实这个编号不一定是字符串或者数字,甚至不一定要两两不同,这引出了很多种玩法。比如每个文档可以是一个知乎问题,而这个编号就是问题的话题。这样当某个用户提了一个新的问题的时候,我们就可以把这个用户的问题内容当做关键字进行搜索,然后根据返回的编号(也就是话题)来自动提示他可以添加什么话题。这样,高大上的“人工智能”就从最土的记忆-搜索中出来了。

还有一种有趣的玩法是给一个知乎答案,猜他是谁写的。比如我们做了个demo,现在模拟一个最简单的“知乎”。找了10个片段。其中5个来自金庸的武侠小说《鹿鼎记》,5个来自大刘的科幻小说《三体》。为了让电脑能认得我们的输入,我们把这10个片段组织成10行文本,每一行的格式类似

金庸<TAB>鹿鼎记的片段

金庸<TAB>鹿鼎记的片段

。。。。。。

三体<TAB>三体的片段

。。。。。

我们搭了一个系统,只要你把这种格式的文本输入进去,按一下“索引”,系统就会读入这些文本,开始索引了。界面类似下图。

索引可能会花一段时间,在这个例子里面可能需要10秒钟左右。当索引结束的时候,下面会出现一个文本框,问你想搜索什么。比如我们想看看这句话“从近代史和现代史上看,科学基础理论研究成果转化为实用技术有两种模式:渐进型和突变型”可能来自三体还是来自鹿鼎记。注意这句话并没有出现在我们索引的文本里,甚至没有出现明显的线索比如人名。那么我们把这句话粘贴进去,点确定:

系统发现,这句话和三体和金庸都有关联,但和三体的联系更为紧密,更有可能是三体里面的。如果你有机器学习背景的话,会知道这是一个比较经典的文本分类的问题,一般需要用机器学习来训练一个分类器。但这里我们并没有用任何复杂的高等数学啊贝叶斯啊分类器啊,只是单纯的用搜索引擎,就把一个人工智能的应用做了出来。

打开“文档的编号可以是任何标签”这个思路以后,其实可以用这个系统做很多很多的东西。比如辨别一个答案是不是干货,是不是爆照,一个新闻是不是谣言,一个用户是男是女,一条私信是不是骚扰。。。Search Engine as a Service并不是传统意义上像出租虚拟机那样出租搜索能力,轻松转变成AI Service的潜力让它价值无穷。

现在是你们自己发挥创造力的时间了:demo系统猛击此处zhihu.grapeot.me/SEaaS.。注意我租的服务器比较烂,索引又比较耗资源,所以如果碰到反应比较慢的时候,等几秒再重试,不要快速反复刷新。谢谢啦。

*从以前的评论来看,有很多朋友问这是什么技术做的。我的后台系统是Python+Flask+GUnicorn+Nginx+Ubuntu。用的是Micro Service架构,因为很多模型比较大,加载比较占内存,这样能够最大程度跨进程复用内存。关于机器学习方面,用的是最简单的jieba分词+Word2Vec+Bag of Visual Words(这是个机器视觉的算法,我把移植到文本上了)+TF-IDF+Inverted index。

文章被以下专栏收录