项目的技术路线及预期成果
技术路线: 整体项目采用微服务理念,根据业务纵向分割,独立成服务。服务之间互相独立,降低局部故障对整体系统的影响,提高系统的容灾性以及稳定性。每个服务采用Spring、Spring MVC、Spring Boot、MyBatis结构构建。
系统架构图如下:
负载均衡:
采用Nginx作为负载均衡模块,轻量高效,可以和后端的应用服务协调的契合。将用户请求分散给后端服务,降低单机负载。
内容分发网络:
将静态内容(例如用户头像)缓存至CDN服务器,提高用户访问速度,降低服务器负载。
消息队列:
采用ActiveMQ作为消息队列模块,将并行请求转化为串行请求,削峰填谷,保证OJ服务器负载平稳,运行稳定。
OJ编译评测模块:
OJ编译评测模块需要重点处理的问题就是安全问题,由于需要将用户输入源码编译并运行,这个过程中存在较大的安全隐患。我们将对外部输入代码进行白名单验证,并利用Linux系统下成熟的沙箱技术Apparmor对运行期的评测程序做细粒度的权限控制。保证被评测程序的运行不影响服务器的安全稳定。
语音识别模块: 语音识别模块用于解析用户声音,转化为文字再对文档进行搜索。由于语音识别技术过于复杂,我们将调用现有的成熟技术解决方案以实现对音频的解析。语音识别的基本原理如下:
1、发出的语音属于模拟信号,为了对语音信号进行分析和处理,需要进行模数转换
2、数字化后,提取语音信号的声学特征:
1)人耳的生理特性:
生理 感知
强度 响度
基本频率 基音
频谱形状 音色
开合时间 时间
双耳相位差 位置
2)根据人耳的生理特征进行声学特征提取:把每一帧波形变成一个多维向量,可以理解为这个向量包含了这帧语音的内容信息。
3、得出语音识别结果
1)把帧识别成状态
通过“声学模型”里的参数,获取帧和某一状态对应的概率,若干帧数对应一个 状态。
2)把状态组合成音素。
每三个状态组成一个音素。
3)把音素组合成单词。
中文全文检索模块:
1)中文分词 高效准确的中文分词算法是搜索引擎实现的第一步,本程序采用基于CRF算法的中文分词实现。
首先对每一个字计算出一个标签属性,某个字根据CRF模型提供的模板生成了一系列特征函数,这些函数的输出值乘以该函数的权值最后求和得出了一个分数。该分数只是“点函数”的得分,还需加上“边函数”的得分。边函数在本分词模型中简化为f(s',s),其中s'为前一个字的标签,s为当前字的标签。于是该边函数就可以用一个4*4的矩阵描述,相当于HMM中的转移概率。然后通过BEMS合并,将分词结果送入词性数据库中查询词性,去除停词(Stop word)后进行下一步反向索引。
2) 反向索引的建立
将分词后得到的词建立一个字典,按自然顺序排序,合并相同的词,成为文档倒排链表。便于搜索引擎根据关键字快速查询文章。
3) 索引索引 对用户输入的查询语句进行自然语言分析,识别单词关键字(此处和中文分词基本相同)形成自然语言语法树,根据关键词在反向索引表中查询文档。
4) 整合结果文档 根据自然语言语法树对查询到的文档进行合并、差等操作。通过关键词词频等参数计算文档相关度,并排序显示给用户。
数据库服务器:
关系型数据库服务器将采用MySQL Server,NoSQL服务器将采用Redis。我们将用户状态信息(例如session)储存在Redis中,保证应用服务器无状态性,易于平滑扩展。
应用结构层次如下:
我们将应用进行横向拆分,形成Controller,Service,DAO结构。
Controller层负责与用户交互收发信息,验证输入数据合法性,按照一定规则将请求分发给Service。Service层拆分处理请求。DAO层负责与数据库交互。我们采用微服务理念,将复杂而逻辑依赖少的模块(例如搜索引擎、语音识别、OJ测评)独立出来,以微服务的形式存在,服务与服务之间采用RPC协议通讯,每个服务专人负责,保证系统稳定性,降低单服务复杂度。
预期成果:
1、完成《基于java web 完成智能化编程语言初学者导引平台系统》软件设计。
2、对整个项目过程进行总结,做一份项目报告。
3、申请软件著作权。
|