1. 离线部分(7个文件)
1.1 关键字推荐模块
英文
1、产生词典文件:单词 + 词频(词频统计作业)
将文件中的单词进行处理,统计每个单词的出现频率并保存到文件中,并按照词频来定义单词展现的先后顺序
2、产生词典索引文件:
目的:加速词典的查找
将单词中的每个字母出现的行号保存下来
例:hello
h: 1 200 300 400
e: 1 200 400 500
l: 1 200 500 700
o: 1 200 700
取交集就是对应的单词
产生对应的索引文件,26个字母 + 行号/下标
中文
1、先去进行分词:cppjieba
2、产生中文词典库:短语/汉字 + 频率
3、中文的索引文件:汉字 + 行号
例:武汉:武 汉 下标取交集
1.2 网页搜索模块
王道 在线 公司
1、建立网页库(RSS作业):把所有xml文件内容存储到一个文件中去,格式如下
[HTML_REMOVED]
[HTML_REMOVED] 1 [HTML_REMOVED]
2、将生成好的网页库进行去重
否则两篇或者多篇文章就可能是完全一样或者相似的
去重方法:
1. TopK:
A 10个频率最高的单词/关键字
B 10个频率最高的单词/关键字
相同
2. Simhash算法,使用第三方库
3、生成网页偏移库:存储 文章的id + 文章的首地址 + 文章的长度
方便按照文章id查找文章内容
4、生成倒排索引库:单词/短语 + 文章的id + 单词/短语的权重(TF-IDF算法)
然后按照id取交集,得到最终文章的id
2. 在线部分
2.1 关键字推荐模块
1、
hello: hello ello hell hellq
待查询的单词与已经返回出来的单词之间需要进行比较,需要使用最小编辑距离算法
hello: hello 不需要变化,就可以满足 0
hello: ello 将它变成hello需要变化一次,添加一个h 1
hello: hell 将它变成hello需要变化一次 添加一个o,1
hello: hellq 将它变成hello需要变化一次 将q变为o,1
hello: hloo 将它变成hello需要变化三次 3
关键词推荐顺序:
1. 优先比较最小编辑距离
2. 出现频率
3. 开头字母字典序
2、服务器返回给客户端使用json格式,客户端,把之前的Linux中的客户端直接拿过来改一下
或者直接用nc命令
3、缓存系统的设计:用hiredis或者自己写(类图有)
2.2 网页搜索
1、余弦相似度的计算
王道 在线 公司
向量:
要查询的关键字向量:Base = (x1, x2, x3, x4 — xn),x1 = 王道,x2 = 在线,x3 = 公司,x4 = ...... xn = 0
文章向量:Y = (y1, y2, y3, y4 ...... yn)、Y1 = (y1, y2, y3, y4 ...... yn) 。。。。。。
计算两个向量之间的夹角,夹角越小,就证明Y向量与待查询的Base向量更接近一些
2、网页的缓存系统,redis hiredis redis-plus-plus
3. 目录结构的设计
bin/:可执行程序
conf/:配置文件
data/:生成的文件信息
include/:头文件
log/:日志文件
src/:实现文件
Makefile
想请问一下根据出现频率推荐最好使用什么算法呢