分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019

资源列表

  • 基于SVM分类器的动作识别系统

    摘 要动作识别领域近年来随着动作采集技术的成熟而高速发展,因其无需借助任何 计算机系统的传统输入设备就能够准确识别出用户意图,对三维动作数据进行数据 处理与挖掘的技术,现已广泛运用到了计算机动画、游戏、新型人机交互和智能家居控制等领域。
    支持向量机(Support Vector Machine, SVM)凭借其在小训练样本、非线性和高 维模式识别中的优势而广受关注。本文对经典 SVM 二分类算法进行研究,在此基 础上将 SVM 算法推广到了多分类中。此外通过获取智能手机中的加速度传感器、 陀螺仪和方位传感器的数据,搭建了一个动作数据采集、传输和存储平台,支持多 用户传输存储其动作数据。采用 SVM 多分类算法训练预处理后的动作数据,并采 用粒子群优化算法(PSO)对 SVM 参数进行优化,建立动作分类模型,实验证明该模 型能够 97.30%的准确率识别出用户的动作意图。
    为了验证基于 SVM 分类器的动作识别系统的运用场景,本文将其运用到了智 能家居家电控制领域,通过软件搭建了一个智能家居模拟模块,可以模拟实体智能 家居的一系列状态信息(如打开电灯)。通过对用户动作数据的分类学习,可以达到 通过动作信息控制家电开关等状态动作的功能目的,为基于 SVM 分类器的动作识 别系统找到了一个应用场景。
    [关键词] 动作识别 SVM 多分类 粒子群优化 智能家居
    ABSTRACTWith the motion capture technology matures and promotion, fast and efficient access to a large number of real-time and three-dimensional motion data has become a reality. Because has the ability to accurately identify the user’s intention without the help of any conventional computer system input devices, the action of the three-dimensional data processing technology has been widely applied to computer animation, games, new humancomputer interaction and intelligent home control field.
    Support vector machine (SVM) has its unique advantages in solving the small sample, nonlinear and high dimensional pattern recognition. This paper through to studying classical SVM binary classification algorithm, on the basis promoted the binary classification to multi-classification field. In addition, by obtaining data on the smart phone accelerometer, gyroscope and compass sensor, built a movement of data collection, transmission and storage platform, to support multi-user transmission data and stored its action data. After data normalization, using SVM multi-classification algorithm, and using PSO algorithm for SVM parameters optimization, built their action data model. The experiment proved that the action model can predict the user’s action intentions with 97.30% accuracy.
    In order to verify the application scenarios of motion recognition system based on SVM classifier, this paper applied it to the fields of smart home control module, through built the smart home simulation module that can simulate a series of status information of appliances (such as turn on lights) by software. Based on user’s motion data learning, SVM classification model can control the appliance’s status. This find an application scenario based SVM classifier action recognition system.[Key words] motion recognition SVM multi-classification PSO smart home
    第一章 绪 论第一节 研究背景及意义SVM 是基于统计学习的学习算法。有限样本空间即可得到较高准确度的模型, 能够对训练样本进行非线性分类,且在高维空间中具有较低的算法复杂度的特性, 使得 SVM 算法被广泛应用。
    SVM 算法目前已经在生物信息学、语音识别、人 脸检测和数据挖掘等许多领域 取得了优秀的成果。SVM 既优化模型复杂度又优化经验风险,且随着样本空间维数 的增高不会增加计算复杂度,因此它经常被应用到高维模式中。
    人体动作包括四肢、头或面部等的姿态或运动过程,这些动作具有丰富的含义, 是一种人与环境的信息传递方式。计算机接收动作信号的输入,对动作信号进行检 测分析,得出动作的特定意图的过程,称为计算机动作识别。其已经在教育、体育、 游戏等领域得到了广泛的运用。动作识别领域主要通过数学方法来分析手势信号, 其目的是让计算机理解人类的动作语言
    围绕人体动作所展开的工作可回溯至上世纪 70 年代,心理学家通过实验结果 证明:人类视觉系统可以通过感知运动过程中的光点序列变化,从而推断出运动的 类型比如站立、奔跑等。实验也表示人体动作往往代表了特定的动作序列代表了特 定的用户意图。
    随着传感器和计算机视觉技术的成熟和推广,动作识别领域渐渐发展成了两个 方向:基于视觉传感器,和基于可穿戴传感器的人体动作识别。前者主要通过外部 图像采集设备,如运动摄像头等,对人体的动作信息进行捕捉,通过动作关键帧的 提取和分析,得出用户的动作意图。后者主要通过安装传感器,对运动中的动作信 号(如加速度大小)进行收集,而后对数据进行数学分析,从而得出用户的具体意 图。近年来,随着人工智能的发展以及其在动作识别领域的成功运用,也为动作识 别的分析预测精确度带来了极大的提升。其中比较常见的是各种基于概率的统计识 别方法:决策树、K 临近、贝叶斯、SVM、神经网络和隐形马尔科夫(HMM)等。
    本文通过对 SVM 算法的学习和研究,并将其应用在动作识别系统中,结合智 能家居的概念,模拟实现了基于 SVM 分类的动作结果对家电状态的控制,验证了 一种新型的智能家居控制方式的可行性,对 SVM 算法和动作识别系统的推广和应 用有重要的意义。
    第二节 国内外研究现状SVM 方法被提出后,由于 SVM 算法能解决之前使用神经网络等算法无法解决 的问题,从而引起了国内外研究学者的广泛兴趣。在国内外学者的广泛研究下, SVM 算法理论在短短几年就涌现了大量的研究成果。1998 年 Weston et al.和 Vapnik 在 SVM在回归问题和多值分类扩展以及它的泛化性方面进行了研究;1999 年Anthony et al.等人在 SVM 硬领域的学习误差上给出了严格的理论界定;2000 年 Shawe-Tylor 和 Cristinanini 软领域 SVM 也给出了类似的误差界定;随着学者们对 SVM 理论研 究的深入,许多以 SVM 为基础的延伸算法得到了提出,如 1999 年 Smolaet al.提出 的 SVM 应用在分类和回归问题上;其他一些学者还扩展了 SVM 算法的概念,如 1997 年 Mangasarian 等人对通用 SVM 的概念进行了详细的阐述[1]。 SVM 最初被应用到了手写识别领域。当时美国邮政服务局为了自动识别手写的 邮政编码而引入了 SVM,实际证明,采用 SVM 方法识别效果优于其他神经网络算 法。SVM 的出现同时为字符识别领域开创了一个新的研究方向。
    近些年,国内也涌现出了大批 SVM 研究成果。比如 LS_SVMlab、OSU_SVM3.00、 stprtool\SVM 和 SVM_Steve Gunn 四种 SVM 方法的 MATLAB 工具箱被海军工程 大学的陆振波博士研究开发了出来。刘向东等提出了一种在提高识别速度情况下保 持较高精度的快速 SVM 算法(FCSVM)。
    基于机械和物理、基于图像和基于传感器的动作识别是该领域的三个主要研究 方向。基于机械和物理的动作识别的研究起源于 1983 年,该时期也产生了被认为是 动作识别领域最早的专利 Grimes 数据手套的专利。1987 年,通过光纤传感器测量 手指的弯曲数据,VPL 公司制造了 Data Glove 进行手势识别。国内的高文等人将 Data Glove 数据手套与 ANN 和 HMM 相结合建立了中国手势识别系统,使一些较 为简单的手势识别率达到了 90%左右。
    由于数据手套对动作采集设备的依赖性太强等,研究人员开始将计算机视觉技 术应用到了动作识别领域。通过图像处理技术对动作图像进行分析,从而实现手势 动作的识别。这其中最具代表性的产品为微软公司的产品 Kinect,其能够通过摄像 头捕捉人体各个部分比较细微的动作,从而在人机交互方式中带给用户一种全新的 舒适体验。
    基于图像的动作识别系统受到对周围环境依赖大和识别过程中对硬件要求高的约束而发展受阻。而基于传感器的动作识别由于其特有的优势而广受关注。孔俊其 等人的研究课题——基于三维加速度传感器的手势识别,对简单的数字和动作进行 了分类识别,取得了较好的实验效果。
    目前国内研究者们在将 SVM 方法应用于动作识别领域的过程中,得了一些显 著的成就,但是大部分研究者都是针对动作的图像信号,而针对传感器信号的研究 和实验较少。为了验证这种方法的可行性,本文采用 SVM 方法对采集智能手机的 加速度、角速度和方位信号作为 SVM 算法的输入信号,进行了实验和验证。
    第三节 论文结构本文内容共分为五个章节,章节介绍如下:

    第一章,绪论。首先介绍了动作识别和 SVM 的基本现状和发展情况,为后续 的研究和开发工作奠定了背景基础。
    第二章,SVM 算法研究。主要对 SVM 进行了理论知识的推导,并介绍了多分 类 SVM 的构造方法,和利用 PSO 对 SVM 参数进行优化的步骤。
    第三章,动作采集模块的设计与实现。主要介绍了动作采集和传输的方案与实 现。
    第四章,动作识别模块的设计与实现。主要介绍了:数据接收和处理模块, SVM 算法模块,智能家居模拟模块的设计和实现方案。
    第五章,结论。对 SVM 分类算法运用到动作识别系统中的分类效果进行了总 结,并分析了比较了神经网络、贝叶斯分类等其他分类器对动作数据的分类效果。

    第四节 本文主要任务与成果本文主要任务与成果在以下六个方面: ·在分析理解 SVM 算法的基础上,将传统的 SVM 二分类模型延伸到多分类,使 其适应本文的动作识别系统的需要。并提出使用 PSO 对 SVM 参数进行优化; ·搭建了一个针对动作数据的采集、传输和存储平台。 ·
    搭建智能家居模拟模块,能够模拟实体智能家居设备的各类属性和状态,包 括:能够发出学习信号,对新的动作数据进行有效的学习;能够接收控制命令,并根据控制命令改变自身的属性和状态; ·完成 SVM 核心算法模块,模块功能包含:对动作数据进行系列预处理,对新 的动作数据进行 SVM 算法学习并构建模型,能够通过模型对用户的动作数据进行学 习并预测得出的动作意图结果,向智能家居模拟模块广播控制命令,使其相应地改 变属性状态; ·为了验证 SVM 分类器动作识别系统应用到智能家居控制交互模块中的大规模 应用的可能性,整合上述功能,并实现了多用户同时在线使用和分析的场景; ·最后运用其他分类算法,如 KNN 算法、神经网络等对相同动作数据进行分类 学习,简单比较了不同算法的不同特性。
    动作采集方面,通过对智能手机中的加速度、角速度和方位传感器的调用,获 得了设备持有者的实时动作数据,通过对数据的预处理过程,采用 SVM 对数据进 行训练得到分类模型。该模型能够对动作数据进行分类得到用户的特定动作意图。
    并结合智能家居的概念,用软件模拟了智能家居网络中的各种家电设备(智能电灯) 的状态,搭建完成了智能家居模拟系统。

    SVM 分类算法方面,根据提取到的动作数据特性,对动作数据进行归一化处理, 减少算法的计算复杂度和增加分类的准确率。本文在对 SVM 算法进行理论推导和分析的基础上,将传统的二分类 SVM 算法推广到了多分类上,更好地满足了本文 的动作识别系统的需要。利用 PSO 对 SVM 的参数进行了优化,较之传统参数寻优 方法在预测准确度上有了更优秀的表现。
    第二章 SVM 算法研究本章将对 SVM 原理进行推导分析,随后提出构造多分类 SVM 的几种方法。最 后介绍了利用 PSO 对 SVM 参数进行优化的方法。
    第一节 SVM 方法介绍最优分类面 SVM 的核心思想是从线性可分条件下,寻找最 优边界距离的分类超频面问题得以提出。
    1、最优分类面在图 2.1 中,两类不同数据点表示两类样本,在 线性可分条件下,H 能够对两类样本进行正确分隔。
    𝐻1,𝐻2两直线过两类样本中离 H 最近的点,且与 H 平行。𝐻1和𝐻2之间的线段长度叫做两类的分类间隔 (margin)。

    下面对最优分类面做如下定义:能将图中的两类训练样本完全正确地分隔,且 保证𝐻1,𝐻2之间的分类间隔最大的分类面,称为最优分类面。分类线 H 保证了训练 样本的经验风险最小化,和测试样本的错误率最小。
    设(𝑥𝑖,𝑦𝑖)为线性可分样本集,其中 i = 1, …, n, x∈ 𝑅𝑑, 其中 y ∈ {−1,1}是分类的 类别标识,则分类判别函数具有如下一般形式:g(x) = w∙x + b则最优分类面的方程为:𝒘 ∙ x + b = 0观察式(2-1)可得,w、b 的取值决定了最优分类面的形式,可将分类超平面简单 表示为 (w, b)。但是当 w 和 b 同时与非零常数 k 相乘时,(kw, kb)决定的分类超平面不变,两组不同的参数决定了同一个分类超平面。
    引入规范超平面的概念就是为了解决这种矛盾。在规范超平面中,所有的训练 样本都满足|𝑔(𝑥)| ≥ 1,𝐻1,𝐻2上的样本则满足|g(x)| = 1,𝐻1,𝐻2的平面间距离为 2 ||𝒘|| ,当||w||最小使,可得𝐻1,𝐻2间的分类间隔最大。同时分类线必须满足:𝑦𝑖[(w ∙ 𝑥𝑖) + b] − 1 ≥ 0,i = 1,2,…,n如果一个分类面同时满足式(2-2)和||w||最小的条件,我们就称之为最优分类面。 我们称满足 f[(w ∙ 𝑥𝑖) + b] − 1 = 0,i = 1,2,…,n要求的点为支持向量。支持向量支撑 了最有分类面,既平行于最优分类面,又距离最优分类面最近。
    下面将介绍如何对最优分类面进行求解。
    将式(2-3)进行拉格朗日函数转换:

    将原问题化为了 Lagrange multiplier 的极小值问题,即:

    由 KKT 定理可得,最优解满足:𝛼𝑖(𝑦𝑖((𝜔 ∙ 𝑥𝑖) + 𝑏) − 1) = 0由此可得只有支持向量的系数𝛼𝑖不为 0,因此𝜔可以表示为:

    将式(2-5)和式(2-6)代入到式(2-4)中,原拉格朗日函数化简为:

    将原问题化为如下的 Lagrange multiplier 对偶问题:

    若𝛼∗为问题(2-9)的一个解,则:

    选择不为零的𝛼𝑖代入式(2-7)中解出𝑏∗后得到最优分类面是:

    其中 sgn 为函数符号。最优分类函数由训练样本中的支持向量作为支撑,非支 持向量对最优分类面的求解无意义,其拉格朗日系数为 0。
    至此,对于任意未知样本的输入,都可以将其代入最优分类函数 f(x),得到其分 类结果。
    2、广义最优分类面在本文 2.1.1 节中所讨论的最优分类面有一个前提条件:数据样本能够被线性 函数没有差错地进行分类。这种假设是在最理想的情况下,实际是大部分数据集都 不能使用线性函数进行分类。在求解 SVM 最优分类面的时,误差样本会对结果造 成很大的影响。
    因此,在解决实际问题的时候,往往在约束条件中添加一个松弛项ξ𝑖, ξ𝑖 ≥ 0, 式(2-2)转化为:𝑦𝑖[(w ∙ 𝑥𝑖) + b] − 1 + ξ𝑖 ≥ 0,i = 1,2,…,n目标函数为:

    其中参数 C 可调节,表示松弛项ξ𝑖在目标函数中所占比例。C 越大表示最优分 类面对误差项的调整程度越大。C 的可调节是算法有了较高的鲁棒性。
    3、高维空间中的最优分类面如果训练样本在原特征空间维度是线性不可分的,那么在原特征维度下进行 SVM 计算寻找到的最优分类面分类效果往往不佳。为了解决这个问题,可通过非线 性变换,将问题转换到高维数据空间中,进而求解分类问题。
    如图 2.2 展示了原空间到高维空间的转换原理图。

    SVM 算法需要合理选择核函数类型。实际应用中常用的核函数类型有:
    (1) 线性核函数:

    (2) 多项式核函数:

    (3) 径向基核函数(RBF):

    (4) S 型核函数(Sigmoid):

    RBF 所对应的特征维数无穷大,可对任意数目的样本得到最有分类结果,因为 得到了最广泛的应用。而 RBF 中最常用的又数高斯核函数,其核函数表达式为:

    其中𝑥𝑐为函数的中心点,σ为函数的宽带参数。
    将该核函数应用到分类函数中,得到最优分类函数:

    4、支持向量机通过引入核函数变换,将问题变换到了更高维数据空间的优化问题,在高维空 间中求解最优的分类函数,我们称这种方法为支持向量机。
    支持向量机具有如下特点:
    (1) 引入核函数对原数据空间进行高维映射,使对原本低维空间中不可分的数据 得到了较好的分类结果。

    如图 2.2 的分类例子,在二维空间中线性不可分,但是将其扩展到三维空间时, 能够很好地找到最优分类面。
    (2) SVM 方法旨在划分最优超平面,该算法的核心为找到使分类边界之间的间隔最大的参数值。如图 2.4 所示,H 为最优超平面,SVM 算法是要将 H1 和 H2 之间的边界距离最大化。通过 Lagrange multiplier 变换得到最优分类决策函数为:

    (3) SVM 决策函数的分类结果最终依赖于为输入值和支持向量的内积结果。通 过核函数作为桥梁连接,将高维空间和低维空间的内积运算进行相互转化, 优化了算法效率。
    (4) 支持向量在计算 SVM 决策函数时起决定性作用。由图 2.4 可知,由两个决 策平面 H1 和 H2 决定了最优分类平面 H,除了 H1 和 H2 上的点外,其他样本点都未参与计算,我们成 H1 和 H2 上的点位支持向量。

    (5) SVM 算法具有较好的鲁棒性。其决策函数由支持向量进行构建,当样本空 间中增加或删除非支持向量的数据时不会对决策函数产生影响。
    第二节 多分类的支持向量机本文构建的 SVM 分类器的动作识别系统,用户动作意图的多样性是传统二分 类 SVM 所无法解决的,故此需要将 SVM 算法从二分类推广到多分类的应用中。下 面将介绍几种常见的多分类 SVM 构造方法。

    多分类问题可以由多个二分类问题组成,将多个二分类进行组合分解,从而 形成一个多分类 SVM 模型。常用的技巧包括一对一、一对多、有向无环图方法。 一次求解多分类 SVM 问题的所有分类超平面。该方法逻辑简便易懂,但是 具有计算时间复杂度高的缺点。
    第三节 本文 SVM 算法的实现通过上面对 SVM 算法的介绍和分析推导,说明 SVM 算法能很好地满足本文构 建的动作分类器的要求:有限样本空间、样本数据线性不可分。本文选取了台湾大 学林智仁教授等开发的的 SVM 开源代码包 LIBSVM 作为本文的算法实现。LIBSVM 的多分类实现方式为上文介绍的一对一方法,通过在在 k 个分类之间设置k(k−1)/2 个 SVM 的方式,构建多分类模型。每个 SVM 各自得出其分类结果,选出得票最高的结果作为分类结果。LIBSVM 代码包封装并实现了 SVM 算法中的大量复杂的推导和计算过程,开 发了对 SVM 算法影响较大的各类参数可供调节,如惩罚系数 C,核函数系数σ等, 能够很好地满足本文搭建基于 SVM 分类器的动作识别系统的需要。
    第四节 粒子群优化 SVM 参数通过上文对 SVM 的推导过程可知,参数的选取对其准确性有较大的影响,本 节介绍 PSO 对 SVM 参数进行优化的方法步骤。
    1、SVM 参数介绍ε:不敏感系数,该参数表示算法对误差的敏感程度。支持向量的数量和ε的值 成反比关系;
    σ:核函数参数。该参数影响样本在高维特征空间中的复杂程度,核函数参数的 改变隐含地改变了映射函数,从而决定了线性分类面的最小分类误差。
    C: 该参数影响置信范围和经验风险的比例,通过对该参数的调节,能够使 SVM 算法达到最佳的推广能力。经验误差的惩罚和 C 的值成正比关系。
    目前常用的方法是通过不断尝试的方法来确定较好的算法参数,从而获得相对 较为优秀的参数组合。
    2、粒子群优化算法介绍粒子群优化算法(Particle Swarm Optimization,简称 PSO)是一种新型进化计算方 法,算法是对鸟群的群聚行为的模拟。
    PSO 对问题进行优化的过程中,空间中有唯一的一个食物(即 PSO 要寻找的最优解) ,假设空间中存在一群在搜索食物的鸟(每只鸟为一个粒子),但是鸟不知道 要寻找的食物的具体位置,只知道和食物的距离远近、自己曾经搜索到的和食物最 近的位置和鸟群搜索到的和食物最近的位置,每只鸟会根据当时所在位置和个体经 验最近距离和鸟群经验最近距离比较,从而更新自身的速度和位置,通过不断迭代, 找到食物的位置(或距离食物最近的位置),这就是 PSO 的核心思想。
    PSO 的数学描述为:在一个 D 维空间中,m 个粒子组成一个粒子群。向量𝑝𝑖 = (𝑝1,𝑝2,…,𝑝𝐷),i = 1,2,…,m 表示第 i 个粒子的位置。 f(x)为待优化的目标函数,通过 将 xi 代入 f(x)得到的适应值与 pbest 和 gbest 进行比较,得到该粒子位置的优劣,从 而更新期速度和位置。𝑣𝑖 = (𝑣𝑖1,𝑣𝑖2,…,𝑣𝑖𝐷),i = 1,2,…,m表示粒子 i 的飞行速度的 矢量,𝑝𝑝𝑏𝑒𝑠𝑡𝑖 = (𝑝𝑖1,𝑝𝑖2,…,𝑝𝑖𝐷),i = 1,2,…,m表示粒子 i 的经验最优位置, 𝑝𝑔𝑏𝑒𝑠𝑡 = (𝑝𝑔1,𝑝𝑔2,…,𝑝𝑔𝐷)表示整个种群 搜索到的经验最优位置。
    粒子群搜索的每一次迭代更新:𝑣𝑖 = 𝑤 ∗ 𝑣𝑖 + 𝑐1 ∗ 𝑟𝑎𝑛𝑑() ∗ (𝑝𝑝𝑏𝑒𝑠𝑡𝑖 − 𝑝𝑖) + 𝑐2 ∗ 𝑟𝑎𝑛𝑑() ∗ (𝑝𝑔𝑏𝑒𝑠𝑡 − 𝑝𝑖)𝑝𝑖 = 𝑝𝑖 + 𝑣𝑖其中:i = 1,2,… ,m,w 控制了历史速 度对当前速度的影响,表示惯性权重; 𝑐1和 𝑐2为加速因子,分别表示个体经验值对速 度的影响和群体经验值对速度的影响; rand()产生[ 0,1]的随机数。
    3、粒子群优化 SVM 参数选取 SVM 的两个参数惩罚因子 C 和 核函数参数σ作为 PSO 的优化目标。
    训练样本和测试样本集通过本文第三 章构建的动作采集模块进行采集,总共100 组数据,随机选取 70 组数据作为训练集, 其余作为测试样本集。 设每一个 PSO 粒子代表 SVM 算法的 一组参数,将该组参数下的 SVM 分类准确 度作为粒子的适应度函数,其形式如下:

    其中,n 是训练样本的数量,𝑦𝑖是实际值, ̅𝑦i是预测值,𝑓𝑓𝑖𝑡𝑛𝑒𝑠𝑠是适应度值。 算法具体实现过程如下:

    读入样本集,对数据进行预处理; PSO 参数初始化,设 PSO 算法参数 w = 0.8,𝑐1 = 𝑐2 = 2,种群规模为 50, 最大迭代次数𝐶𝑚𝑎𝑥 = 500,解空间为二维空间,分别为惩罚因子C ∈ [0.01,500]和核函数参数σ ∈ [0.01,10]; 随机各粒子的初始速度和位置,将每个粒子的𝑝𝑝𝑏𝑒𝑠𝑡𝑖设为当前位置,𝑝𝑔𝑏𝑒𝑠𝑡 设为群体中位置最好的粒子位置; 使用训练集训练 SVM 模型,并根据适应度函数𝑓𝑓𝑖𝑡𝑛𝑒𝑠𝑠 = 1 𝑛 ∑ 𝑓(𝑥) 𝑛 𝑖=1 更新粒 子的适应度值; 将粒子的适应度值和𝑝𝑝𝑏𝑒𝑠𝑡𝑖, 𝑝𝑔𝑏𝑒𝑠𝑡进行比较,并根据比较结果进行更新; 按照𝑣𝑖 = 𝑤 ∗ 𝑣𝑖 + 𝑐1 ∗ 𝑟𝑎𝑛𝑑() ∗ (𝑝𝑝𝑏𝑒𝑠𝑡𝑖 − 𝑝𝑖) + 𝑐2 ∗ 𝑟𝑎𝑛𝑑() ∗ (𝑝𝑔𝑏𝑒𝑠𝑡 − 𝑝𝑖), 𝑝𝑖 = 𝑝𝑖 + 𝑣𝑖 更新粒子的速度和位置;
    如未达到算法的停止条件,则返回至 3 继续循环。否则求出最优解,算法结束。

    注:算法的终止条件为达到最大迭代次数𝐶𝑚𝑎𝑥。经过粒子群优化算法得到的 SVM 参数为:𝛔 = 𝟎.𝟎𝟎𝟏𝟏𝟓,C = 0.48,得到的 SVM 预测准确度为 97.30%。
    第五节 本章小结本章学习和研究了 SVM 的原理方法,对影响 SVM 算法性能和准确度的基本参 数进行了介绍,而后对 SVM 的各个特点进行了分析和总结。随后确定了选用 LIBSVM 作为本系统的 SVM 算法实现,最后介绍和说明了利用粒子群优化算法对 SVM 参数进行优化的方案。本章是基于 SVM 分类器的动作识别系统的算法理论基 础。
    第三章 动作采集模块设计与实现本文为了调用智能手机的加速度传感器、陀螺仪和方位传感器的状态值,获得 设备持有者的系列动作数据,编写完成了一个安卓应用,APP 提供登陆、注册、动 作特征量的获取显示和更新,并将动作数据发送至服务器的功能。
    第一节 动作采集模块概述随着移动互联网的飞速发展,智能手机的硬件配置也不断攀升,如今智能手机 中已经集成了大量的传感器模块。智能手机中的各类传感器模块可以很好地满足本 文搭建动作识别系统的动作采集需要。本文搭建的动作识别系统的动作采集模块如图 3.1 所示。

    智能手机集成的各类传感器模块不断丰富,这些传感器模块可以通过 Android 编程很顺利地进行调用并获取到其传感器状态信息,这为我们实时高效地捕捉动作 数据带来了极大的便利性。本文通过 Android 编程,调用和获取传感器的状态信息, 包括:加速度传感器、陀螺仪和方位传感器,加速度、角速度和方位这几个维度的 数据可以很好地还原出设备持有者当时的三维轨迹信息,为后面的 SVM 算法分类 器训练带来了可能。
    第二节 采集动作特征说明通过调用智能手机的加速度传感器、陀螺仪和方位传感器,每种传感器分别返 回了状态信息,这些状态信息分别表示了不同的含义,下面将这几个特征量进行详 细解释。
    1、加速度传感器该装置被用来测量加速度值。通过测量外界加速度对内部机械结构的震动特性 的影响,以此获得设备加速度值的大小。调用加速度传感器模块,可以获得该时刻 下传感器的 x、y、z 轴的加速度数值,单位为m/𝑠2。
    其数据具有如下特点:

    向左倾斜运动,x 轴为正。 向右倾斜运动,x 轴为负。 向上倾斜运动,y 轴为正。 向下倾斜运动,y 轴为负。 垂直向上运动,z 轴为正。 垂直向下运动,z 轴为负。
    2、陀螺仪陀螺仪(英文:gyroscope)是感测与维持方向的 仪器。陀螺仪的主要构成模块为一个可旋转的转子。 可以通过智能手机中的陀螺仪传感器得到 x、y、 z 轴的三轴角加速度的值,其单位为r/s。
    且其数据具 有如下特点:

    将手机水平正面朝上静止与桌面上,x 轴默认为 0,y 轴默认 0,z 轴默认 0。 逆时针旋转,z 轴为正。 顺时针旋转,z 轴为负。 向左旋转,y 轴为负。 向右旋转,y 轴为正。向上旋转,x 轴为负。向下旋转,x 轴为正。
    3、方向传感器
    方向传感器获取三轴角度(度)。如下:

    方位:获得 Y 轴与地磁北极的偏移角度(水平时)。角度取值 0°到 360°。 x 轴和水平面的夹角:角度取值-180°到 180°。z 轴向 y 轴旋转取值为正。 y 轴和水平面的夹角:角度取值-90°到 90°。x 轴向 z 轴旋转取值为正。
    第三节 动作采集 APP 设计与实现1、APP 设计概要动作采集系统搭载运行在 Android 平台,通过编程实现了对智能手机传感器模 块(包括:加速度传感器、陀螺仪和方位传感器模块)的调用,得到了某一时刻下 三种传感器的状态信息。
    系统主要功能和流程图如图所示。

    其中登陆注册模块主要提供了用户的登陆和注册功能,服务器将会对不同用户 建立不同的 SVM 分类器模型,响应不同用户的请求,并广播至不同用户的模拟智 能家居网络,使智能家居的状态属性做相应的改变。

    数据采集模块是动作采集 APP 的核心模块,主要完成了对加速度传感器、角速 度传感器和方位传感器模块调用,获取了设备某一时刻的状态信息,并通过网络请 求的方式,设备的状态消息,对应着的是设备持有者的动作消息发送到了服务端, 在服务端对数据进行了有效的存储和计算。
    2、动作采集和传输方案基于 SVM 分类器的动作识别系统,通过采集设备持有者的某一段时间的动作 数据,处理和传输至服务器。本文搭建的动作识别系统的动作采集模块的设备采集 APP 有关动作采集和传输的说明如下。
    首先每一次动作获取,采集到加速度传感器、陀螺仪、方向传感器三个模块的 共 9 个动作数据,从中选取我们需要的 8 个数据,分别为:x 轴加速度(a_x)、y 轴 加速度(a_y)、z 轴加速度(a_z)、x 轴和水平方向夹角(o_y)、y 轴和水平方向夹 角(o_z)、x 轴角速度(g_x)、y 轴角速度(g_y)、z 轴加速度(g_z),通过这 8 个 数据,可以完整还原出设备持有者某一时刻的三维动作模型。

    同时考虑到动作数据的时效性,只采集动作结束前的 2 秒时间内的动作数据, 在这 2s 的时间内共采集 20 组数据,即数据采集频率 10 次/s。
    在 APP 启动时,会初始化一个 20*8 的二维数组 ACTION_TEMP,用于缓存每 次更新的动作数据,数据的排列和储存格式为: a_x, a_y, a_z, o_y, o_z, g_x, g_y, g_z。
    通过按下智能手机的“音量-”按键触发,开始以 10 次/秒的频率更新动作数据, 每次更新动作数据,都会在 ACTION_TEMP 中新产生一条动作数据,如果 ACTION_TEMP 数组的存储满后,会覆盖数组中存在时间最久的数据。当弹起智能 手机的“音量-”按键时,会根据 ACTION_TEMP 的状态组装待发送的数据。
    考虑到采集动作开始采集和结束采集这两个时间点的动作有可能会有较大的噪 声,只采用弹起智能手机“音量-”按键前的 0.5s – 1.5s 的 1s 时间内的动作数据进行 组装,组装格式成一个待发送的动作字符串,格式为:

    a_x1, a_x2, … , a_x10, a_y1, a_y2, … , a_y10, a_z1, a_z2, … , a_z10, o_y1, o_y2, … , o_y10, o_z1, o_z2, … , o_z10, g_x1, g_x2, … , g_x10, g_y1, g_y2, … , g_y10, g_z1, g_z2, …, g_z10
    通过 HTTP 网络请求方式,发送至服务器。
    第四章 动作识别模块设计与实现第一节 动作识别模块概述本文构建了一个基于 SVM 分类器的动作识别系统,通过对动作采集模块采集 到的动作数据进行有效的接收和储存,而后对数据进行噪声处理、归一化等预处理 过程,并利用改进的 SVM 多分类算法对动作数据进行分类器的训练。通过实践, 本文搭建的 SVM 分类器的动作识别系统,动作识别准确率达到 97.30%。
    下面将就动作识别系统构建过程中的动作识别模块的架构和功能方面做如下概述。
    1、后台架构动作识别系统后台需要为该系统的用户提供稳定可靠、高效便捷的后台服务, 据此,系统技术选型如下:

    编程语言:JAVA 对象生命周期管理:Spring 数据持久化框架:Hibernate 数据库:MySQL WEB 容器:Tomcat
    后台系统采用 JAVA 语言编写完成,使用 Spring 框架作为系统对象生命周期的 管理,并采用 SpringMVC 框架编写具有 RESTful 风格的接口,使动作采集 APP 和 智能家居模拟模块能够通过 HTTP 服务调用的方式管理后台资源。系统运行在 Tomcat 容器中,提供高可用性和并发访问的服务。

    2、系统运行流程动作识别的动作学习过程功能流程图如下:

    如图 4.1 所示,在接收到通过网络发送过来的动作数据后,会根据目前登陆的 用户,找到该用户对应的已经训练好的 SVM 分类器模型,通过将接受到的动作数 据输入到分类器模型中,得到预测值,即表示了该动作对应的用户特定意图。
    如接受到模拟智能家居模块发来的学习指令,会激活 SVM 分类器模型的更新 学习流程,对该用户的 SVM 分类器模型进行再学习和更新。
    整个 SVM 动作分类器的动作识别模块包含:动作学习模块、动作预测模块、 智能家居模拟模块。
    第二节 数据预处理算法效果的好坏程度很大程度上受限于数据的预处理的效果,常用的数据预处 理方法有归一化处理。
    在使用传感器采集动作信息时,由于人体动作的幅度不可能每次都相同,因此 采集到的动作信号值范围相差很大,这样采集到的信号在进行手势识别时难以区分。 而且由第二章的分析可知,输入数值太大,在进行 SVM 分类器计算时会影响识别 速度。因此我们将数据进行归一化处理,把需要处理的数据经过处理后限制在需要 的一定范围内,使它们的数值更加规范,具有更明显的可比性,以此来降低识别难 度,提高识别速度。 本系统中为了便于数据的运算将数据归一化到[0-1]的范围内。 通过分析可知本文采集的动作特征具有一定的取值范围,可针对数据的不同取值范 围做数据的归一化处理。
    针对加速度传感器的数据,在应用在智能家居控制的场景下,用户正常使用, 通过对大量动作数据的观测发现,用户的 ax 动作值得大小分布如图所示:

    由上图可得ax ∈ [−20,20],同理可得ay ∈ [−25,25],az ∈ [−30,30]。
    因此选取动作数据的取值范围为: a ∈ [𝑎𝑚𝑖𝑛,𝑎𝑚𝑎𝑥] ,𝑎𝑚𝑖𝑛 = 10.0,𝑎𝑚𝑎𝑥 = 10.0,其中 a 表示加速度传感器的值的 大小,即 ax, ay, az;
    g ∈ [𝑔𝑚𝑖𝑛,𝑔𝑚𝑎𝑥] ,𝑔𝑚𝑖𝑛 = 10.0,𝑔𝑚𝑎𝑥 = 10.0,其中 g 表示陀螺仪的值的大小, 即 gx, gy, gz;
    oy ∈ [𝑜𝑦𝑚𝑖𝑛,𝑜𝑦𝑚𝑎𝑥] ,𝑜𝑦𝑚𝑖𝑛 = −180°,𝑜𝑦𝑚𝑎𝑥 = 180°;
    oz ∈ [𝑜𝑧𝑚𝑖𝑛,𝑜𝑧𝑚𝑎𝑥] ,𝑜𝑧𝑚𝑖𝑛 = −90°,𝑜𝑧𝑚𝑎𝑥 = 90°;
    按照如下公式对数据进行归一化:

    动作接收模块,主要提供接收动作数据的功能。
    服务器会监听是否有新的动作数据从动作采集 APP 发送至服务器。该过程通过 服务器后台提供一个动作接收的 HTTP 服务调用接口的方式实现。当接收到从动作 采集 APP 发送的数据后,服务器会执行如下流程:

    将动作数据进行预处理;更新该用户的待预测动作属性 TO_PREDICT, 待学习动作属性 TO_LEARN 的值(动作预测模块将会获取 TO_PREDICT 的值作为 SVM 动作分类器模 型的输入,动作学习模块将会在接受到动作学习指令后,获取 TO_LEARN 的值作为新模型训练的训练集);
    第三节 动作预测模块当后台系统监听到有新的动作数据从动作采集 APP 发送达到的时候,会启动动 作预测的流程:

    查找该用户的 SVM 分类器模型 Model;
    将待预测数据 TO_PREDICT 作为输入,根据 Model 得出预测值;
    将预测值添加到动作预测缓存队列中,等待智能家居模拟模块的获取。

    通过这种方式,使动作预测模块能够对每一个接受到的新动作数据进行预测, 并得出具体的预测值,并将预测值的信息传递到智能家居模拟模块中,改变智能家 居模块的状态属性。
    第四节 动作学习模块动作学习模块是基于 SVM 分类器的动作识别系统的核心模块,其提供的主要 功能包括:对动作数据进行预处理、根据动作数据利用 SVM 分类器算法得出分类 模型。
    动作学习模块会监听智能家居模拟模块,当接收到学习指令后,会执行如下的 动作学习流程:

    接收到的学习指令的含义为某家电的某状态,拼接动作学习数据和动作意图 (例如电灯 1 的开启状态对应的标签值为 1,动作学习模块接收到学习指令 1,表示此时该用户对应的最新动作数据 TO_LEARN 对应的动作意图为电 灯 1 开启状态);
    将 TO_LEARN 数据持久化到数据库中;
    从数据库中获取该用户的所有学习动作数据,将其作为训练集,按照第二章 得到的 SVM 算法,对该用户的 SVM 分类器模型进行训练;
    将新的分类器模型保存为文件,替换旧的模型。

    通过以上步骤,实现了对每一次学习指令的响应,更新学习得到的最新的动作 数据,并替换旧的分类器模型。实现了旧模型的替换,使新的预测动作作用在新的 分类模型上。
    第五章 智能家居模拟模块本文构建的基于 SVM 分类器的动作识别系统,是一个从动作采集,到动作数 据的传输和存储系统,并通过改进的 SVM 分类算法,训练得到 SVM 分类器,对新 的动作数据输入能够有较好的分类效果。
    并结合时下智能家居概念,将该动作识别系统应用到了智能家居的控制模块中, 实现了一种新型的控制方式,改变了传统的基于遥控器或者手机 APP 点按的控制方 式,对用户的手势动作进行动作识别,得到其特定的动作意图,以此来控制智能家 居做出相应的状态和属性的改变。本节将构建一个智能家居模拟模块,通过软件模 拟了实体智能家居的各种属性和状态,可以发送学习指令到动作识别模块,接收动 作识别模块发送的控制命令并改变其状态和属性。
    1、模拟学习模块模拟学习模块可以向动作识别模块发送学习指令。其主界面如下图所示。

    主界面包含一系列的控制选项,开始预测和停止预测作为一个开关选项,控制 后台服务是否对新动作数据进行实时预测并返回。
    学习列表包含电灯 1、电灯 2、电视 1 等模拟智能家电,并以按钮的形式表名了 该家电的状态,点击学习列表的某一按钮,向服务器发送一条学习指令,服务器的 动作学习模块,会将最新的动作数据 TO_PREDICT 和该学习指令对应起来,作为一 条新的 SVM 分类器训练数据,服务器会将新训练得到的 SVM 分类器模型替换旧模型。
    2、模拟显示模块模拟显示模块能接收动作识别模块对于新动作的预测结果,并更新该家电的状 态显示。其主界面如图所示。

    模拟显示模块通过轮询的方式和服务器进行通信,每 0.5 秒向服务器发起请求 获取是否有新的控制消息,如果得到有新的控制命令,则更新显示模块中智能家电的状态属性。
    第六章 结 论第一节 其他分类算法效果比较本文搭建的动作识别系统,采用 SVM 算法进行分类,得到了较好的//TODO 效 果。本节将使用相同的动作数据集,对 SVM 和 K 临近算法、神经网络进行对比和分析。
    1、K 临近算法K 临近算法(K-Nearest Neighbor, KNN)是最简单的机器学习算法之一。其分类依 据是, 如果一个样本在特征空间中的 K 个最相似(即特征空间中的最近邻)的样本 中的大多数属于某一个类别,则该样本也属于这个类别。
    使用相同的训练数据集和测试数据集训练 KNN 分类器,本节通过 sklearn 机器 学习代码库编写测试代码,其 Python 源码详见附录。
    实验得到最终的分类准确度为 85.58%;
    2、神经网络算法神经网络算法(Neural Network Algorithm)是机器模拟人类思维方式的一种学习 方式。算法信息储存在各个神经元中,信息的分布式存储带来的好处是,各个神经 元可以并行地计算处理,从而使算法的运行过程高效执行。
    通过实验可得,神经网络算法的分类准确度为 89.78%。
    3、结论本文搭建的动作识别系统,用户需要在只经过极少的几次训练之后就得到准确 分类模型(小样本);用户每次的数据往往都和上次数据具有一定差别,但是又表示 的是同一意图,动作数据在特征空间上表现出线性不可分,和低维下分类效果不佳 的情况,通过上节对 KNN 和神经网络的分类效果比较可得知,SVM 算法在动作识别上具有较好的效果。
    第二节 总结与展望1、总结本文在综合介绍和了解分析动作识别领域和 SVM 算法的背景下,提出并实现 了通过调用智能手机各动作传感器来采集用户的动作信号,并使用 SVM 算法分析 动作信号,最终搭建完成了一个基于 SVM 分类器的动作识别系统。
    为了验证该基于SVM分类器的动作识别系统的应用前景,结合智能家居概念, 将该动作识别系统应用到智能家居的控制模块,通过识别用户特定动作的意图,从 而控制智能家电状态。实验证明,该方案提供了一种新颖的家电控制方式,并取得了较好的实验结果。
    最后比较了 SVM 算法和其他常见分类算法,如 KNN、神经网络的分类效果, 证明了 SVM 算法在小样本情况下的分类效果较为优秀。
    2、展望本文提出的动作识别系统虽然具有较高的识别准确率 97.30%,但是仍然有一定 的优化空间。
    用户动作数据的不精确,和动作采集过程中的误差,会影响分类效果的准确性。为了提高分类准确性,可以在数据预处理环节对误差进行进一步的处理。
    本文通过将动作识别系统和智能家居概念结合,找到了一个动作识别系统的一 种应用途径。但是本文提出的结合方案还是比较初级的,仅仅是将其应用到了核心 控制方式的改变上,可以在后期通过对应用场景的深入挖掘,从而对动作识别系统 的应用场景有更加广阔的扩展。
    参考文献[1] 杨石焕. 基于支持向量机的手势识别研究[D]. 河北省:燕山大学信息科学与 工程学院, 2014.
    [2] 张倩;杨耀权. 基于支持向量机核函数的研究[J]. 电力科学与工程, 2012, 28(5): 43-45.
    [3] 谌璐. PSO-SVM 学习算法及其在空间数据分析中的应用[D].西安工程大 学,2012.
    [4] 张妤. 支持向量机集成学习方法研究[D].山西大学,2008.
    [5] 蔡婕. 支持向量机训练算法的研究[D].西安理工大学,2009.
    [6] 王昌喜, 杨先军等. 基于三维加速度传感器的上肢动作识别系统[J]. 传感 器技术学报, 2010, 23(6): 816-819.
    [7] 王见, 陈义, 邓帅. 基于改进 SVM 分类器的动作识别方法[J]. 重庆大学学 报, 2016, 39(1): 13-17.
    [8] 蔡美玲. 三维人体运动分析与动作识别方法[D]. 湖南省:中南大学信息科学 与工程学院, 2013.
    [9] Sushmita M, Tinku A. Gesture Recognition[J]. A Survey IEEE Transactions on System, Man And Cybemetics, 2007, 37(3): 311-324.
    [10] 刘为, 高尚. 一种新条件下的三次样条插值[J]. 信息技术, 2011,87(8): 23-24.
    [11] 潘泉, 孟晋丽. 小波滤波方法及应用[J]. 电子与信息学报, 2007, 29(1): 236239.
    [12] 白鹏, 张喜斌, 张斌.支持向量机理论及工程应用实例[M]. 西安: 西安电 子科技大学出版社, 2008: 5-46.
    [13] 任洪娥, 霍满冬. 基于 PSO 优化的 SVM 预测应用研究[J]. 计算机应用研 究, 2009, 26(3): 867-869.
    [14] Bingquan, Shen, Jinfu, Li, Fengjun, Bai, and, Chee-Meng, Chew, “Motion Intent Recognition for Control of a Lower Extremity Assistive Device (LEAD)”, IEEE International Conference on Mechatronics ans Automation, Tapan, 2013, pp. 926931;
    [15] 聂云. 基于 Android 的 WoT 物联网商城终端应用的设计与开发[D].北京邮 电大学,2014.
    [16] 王东. 人工神经网络理论及其在泥沙科学中的应用研究[D].四川大学,2003.
    0 评论 10 下载 2018-09-26 17:05:32 下载需要14点积分
  • 基于rabbitMQ的微服务架构消息组件设计与实现

    摘要随着互联网的高速发展,淘宝、微信、12306和各类直播平台等各种规模庞大、高频率、高峰值的应用层出不穷,而且在一些特殊节点,比如淘宝的双十一购物节、12306的春运抢票高峰等,系统的访问量更是日常流量的几万甚至千万倍。为了支撑起如此庞大的性能需求,迫切需要各种层面的配合。
    传统的单体式架构,虽然易于开发、部署和扩展,但是存在很多的弊端,特别是应用变大或者团队扩大,这些弊端将更为明显和严重,对企业的长远发展是十分不利的。
    由此,技术人员在2012年提出了微服务的概念,指明组件化和服务化是系统架构发展的必然趋势,虽然在一定程度上增加了前期开发的复杂度,提高了部署的技术难度,但是可以为企业的长远发展建立坚实的基础,其利益远大于弊端。因此,研究微服务系统架构的优势和核心要点,探索rabbitMQ技术在大型业务系统中的应用,对于开发低延迟、高并发、高性能、高可用、高可靠的应用系统很有辅助作用。
    基于上述背景,本毕业设计在深入理解微服务架构的技术背景、实现原理与优缺点的前提下,对微服务架构中各个组件之间基于消息队列的异步通信模式进行了技术研究,以典型的消息队列rabbitMQ为主要技术手段,以时下流行的轻量级框架spring boot为容器,借助java开发语言,实现了微服务架构常用的消息中间件。
    论文首先对所用技术进行了理论研究与概述,然后利用以上技术实现了三种应用场景下的应用组件,分别是邮件服务器、复杂业务拆分和分布式任务处理;该组件可与业务应用集群通过消息队列进行通信,作为一个独立的模块帮助业务系统完成一些功能,减轻服务器压力。
    【关键词】rabbitMQ springboot 微服务 消息中间件
    AbstractWith the rapid development of the Internet,various large-scale, high-frequency, and high-peak applications such as Taobao,WeChat, 12306, and various types of live broadcast platforms emerge in anendless stream, and at certain special nodes, such as Taobao’s Double 11thShopping Festival and 12306 Spring Festival. To grab the peak of votes, thesystem’s traffic is tens of thousands or even ten million times the dailytraffic. In order to support such a large amount of performance requirements,there is an urgent need for various levels of cooperation.
    Although the traditional single-unitarchitecture is easy to develop, deploy, and expand, it has many drawbacks,especially if the application becomes large or the team expands. Thesedrawbacks will become more apparent and serious, which is very unfavorable tothe long-term development of the company.
    As a result, the technicians proposed theconcept of microservices in 2012, indicating that componentization and serviceare inevitable trends in the development of system architecture. Although thecomplexity of pre-development has been increased to some extent, and thetechnical difficulty of deployment has been improved, It can establish a solidfoundation for the long-term development of the company, and its benefits faroutweigh the disadvantages. Therefore, to study the advantages and core pointsof microservice system architecture, and to explore the application of rabbitMQtechnology in large-scale business systems, it is helpful to develop lowlatency, high concurrency, high performance, high availability, and highreliability of application systems.
    Based on the above background, under thepremise of in-depth understanding of the technical background, implementationprinciple, and advantages and disadvantages of the microservice architecture,this graduation design conducted a technical research on the asynchronouscommunication model based on the message queue among the various components inthe microservice architecture. The message queue rabbitMQ is the main technicalmeans. With the popular lightweight framework spring boot as a container, withthe help of the Java development language, the message middleware commonly usedin the microservice architecture is realized.
    The paper firstly studies and summarizes thetechnologies used, then uses the above technologies to implement theapplication components in three application scenarios, namely, mail server,complex service splitting, and distributed task processing; this component canbe used with business application clusters. The message queue communicates asan independent module to help the business system perform some functions andrelieve server pressure.
    [key words] rabbitMQ springboot message queue light server
    1 引言1.1 选题背景及论文意义近年来随着互联网的高速发展,淘宝、微信、12306和各类直播平台等各种规模庞大、高频率、高峰值的应用层出不穷,而且在一些特殊节点,比如淘宝的双十一购物节、12306的春运抢票高峰等,系统的访问量更是日常流量的几万甚至千万倍。为了支撑起如此庞大的性能需求,迫切需要各种层面的配合。自此微服务系统架构和作为中间件定位的消息队列应用应运而生,被广泛运用于消息分发、分布式服务调用、高峰值流量访问等场景。
    传统的单体式架构中,所有的核心和边缘业务均集中在一个工程中,依靠一个应用就能完成所有的业务和功能,其优势在于易于开发、易于部署、易于扩展,单体式应用的开发仅依靠IDE就能实现,开发完成后将工程打包为war或者jar即可在合适的环境中运行,使用负载均衡技术即可实现应用多副本的性能扩展。
    但是单体式应用在具备这些优势的同时,也有很多的弊端,一旦应用变大或者团队扩大,这些弊端将更为明显和严重。主要体现在以下几个方面:(1)代码量巨大,当团队成员变更时不利于新成员快速理解和修改代码;(2)资源消耗量大,启动时间长,特别是当系统业务功能扩展使得规模扩大时,仍作为一个整体在web容器中运行,资源消耗与启动时间尤为明显,且生产效率和部署效率大大降低;(3)持续部署与应用扩展困难,难以进行规模化开发,同时技术栈长时间不更新等各种问题,企业的长远发展是十分不利的。
    在上述背景下,技术人员在2012年提出了微服务的概念,指明组件化和服务化是系统架构发展的必然趋势,虽然在一定程度上增加了前期开发的复杂度,提高了部署的技术难度,但是可以为企业的长远发展建立坚实的基础,其利益远大于弊端。因此,研究微服务系统架构的优势和核心要点,探索rabbitMQ技术在大型业务系统中的应用,可以学习到如今的技术热点,对于开发低延迟、高并发、高性能、高可用、高可靠的应用系统很有辅助作用。
    1.2 系统现状与发展分析消息队列的概念在互联网尚未发展成熟的早期已经被提出,Microsoft用消息队列作为消息处理技术,实现两台计算机之间的通信。目前基于消息队列的技术产品非常丰富,具体包含以下几种类型:为企业应用而设计的企业型消息队列,具体产品有ActiveMQ、HornetQ、rabbitMQ;互联网型的消息队列,产品有Kafka,RocketMQ;轻便型消息队列,有memcacheq、Redis、zeroMQ等。随着微服务架构的流行,作为一种优秀的应用程序间通信技术,消息队列得到了更广泛的应用。
    作为一项在云中部署应用和服务的新技术,微服务已成为当下最新的热门话题。微服务这一概念出现于2012年,目前正处于发展初期,对于使用微服务架构的利与弊,各界IT技术人员各执一词,但无论存在多大的争议,越来越多的企业和开发者开始倾向于基于微服务思想去构建业务系统框架,并取得了良好的效果,诸如Amazon、Netflix以及Git等,都是应用微服务架构的成功案例。在国内,各大互联网巨头如阿里、百度、华为等,都是云服务和微服务架构的先驱,其中,阿里巴巴的电商平台——淘宝是最典型的微服务和中间件应用实例。其消息队列服务于整个阿里巴巴集团已超过10年,历经了阿里巴巴交易核心链路反复打磨与历年双十一购物狂欢节的严峻考验。在淘宝的整个微服务架构中,交易是系统的核心域,物流、支付等是系统的支撑子域,短信服务、会员系统、积分系统等是通用子域(如图1-1所示)。各个领域之间寻找到内聚和耦合的合理平衡点,所有的服务都在云中注册和互相发现,支撑起庞大的业务流量需求。

    总之,中间件和微服务作为新型的架构思想,将给IT行业带来巨大的冲击,虽然也存在诸多不足,但整体来看目前的发展趋势是十分乐观的,对于IT技术人员来说,无疑是一个必须研究的课题,也是一个挑战,是每个IT企业应该纳入技术库的一种架构。
    1.1 论文主要内容及组织结构本毕业设计题目是《基于rabbitMQ的微服务架构消息组件设计与实现》。在深入理解微服务架构的技术背景、实现原理与优缺点的前提下,对微服务架构中基于消息队列的异步通信模式进行了技术研究,以典型的消息队列rabbitMQ为主要技术手段,以时下流行的轻量级框架spring boot为容器,以java为主要开发语言,实现了微服务架构常用的消息中间件。论文的组织结构如下安排:
    本文第一部分对选题背景、论文意义、现状与发展分析、论文组织架构等进行概括,阐述使用微服务架构与传统架构各自的思想异同点与优缺点;第二部分对本设计所使用的关键技术进行介绍,包括编程语言、数据库、技术框架等,重点对rabbitMQ、Spring Boot和微服务架构的概念、应用场景、技术原理等进行了详细的说明;第三部分为系统的需求分析,本设计实现的是基于rabbitMQ的消息中间件,因此,我们以邮件服务器、复杂业务拆分和分布式任务处理等rabbitMQ常见的三个应用场景为模拟对象,分别对这三个场景进行需求描述;第四部分为系统功能设计,阐述消息中间件系统的整体功能模块、上述三个rabbitMQ应用场景的具体功能设计以及系统数据库结构设计;第五部分阐述具体的功能实现,并展示毕业设计成果,对其中的关键功能点进行功能描述,以页面截图和关键代码作为支撑。第六部分为总结,对本系统的优势与不足进行分析总结,并提出今后的优化方向与理论方案。
    论文的具体组织结构如下图1-2所示:

    2 关键技术介绍本章对消息中间件所采用的技术进行初步的介绍,组件采用java为主要开发语言,使用SpringBoot作为开发框架,mysql作为数据库,mybatis为持久层框架,消息中间件与应用集群中的其他组件之间的通讯使用消息队列rabbitMQ。
    作为目前使用最广泛的高级开发语言,java语言具备丰富API和成熟的企业应用开发框架;mysql是一个开源的RDBMS(即关系型数据库管理系统);SpringBoot是一个用于快速搭建Spring应用的全新框架;mybatis是一个优秀的持久层开源框架,支持普通的sql查询、存储过程和高级映射;rabbitMQ是一个基于AMQP的可复用的企业消息系统。这些在以下章节中将分别对其进行具体介绍。
    2.1 系统基础技术介绍2.1.1 mysql简介mysql是一个被广泛使用的开源RDBMS(关系型数据库管理系统),mysql自身所用的SQL语言语法是最常用的访问数据库的标准化语言。mysql采用了双授权政策,分为社区版和商业版,相比于oracle 和sql Server昂贵的费用和超大的内存占用,mysql由于总体拥有成本低、体积小、速度快,尤其是开放源码,是中小型web网站数据库的首选,尤其受个人开发者的青睐。
    2.1.2 spring mvc简介Spring MVC框架是当今在web开发中应用最广泛的开源Java框架,为开发强大、高性能的Web应用程序提供了坚固的全面的技术支持。并且非常容易上手开发。SpringMVC框架采用MVC(模型 - 视图 - 控制器)架构和松散耦合的Web应用程序组件。MVC模式使得应用程序的输入逻辑,业务逻辑和UI逻辑分离,同时让这些层次之间松散耦合。模型(Model)封装应用程序数据,视图(View)进行视图解析渲染模型数据,渲染出用户所能看到的页面,控制器(Controller)负责处理分发用户请求,并将数据传递给视图进行渲染。
    SpringMVC具备以下几个特点:明确的角色划分,高复用的代码,简单的配置方式,高定制的绑定、验证,灵活的model转换,可适配非侵入。其功能非常强大,能够设计出结构清晰的层次,同时其天生与Spring框架集成(具有IOC容器,AOP等特点),提供使用方便的格式、和数据绑定机制,强大的约定大于配置的契约式编程支持,灵活的数据验证,支持restful风格等。
    2.1.3 mybatis介绍MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO映射成数据库中的记录。在开发过程中使用mybatis generator工具根据数据库内容生成实体对象和映射文件,大大减轻了手动书写类似代码的工作量。
    2.2 SpringBoot框架介绍2.2.1 SpringBoot简介Spring Boot是近年来非常流行的框架,它的设计目的是简化传统Spring项目繁琐的配置过程和开发过程。在以前传统的Spring项目中,一般来说都是使用applicationContext.xml来配置项目,对于小白性的开发者来说,常会因为配置的纰漏而导致项目无法启动,Spring Boot的出现则解决了这些传统弊病。该框架使用特定的方式来配置,从而让开发人员免除繁琐的配置工作。简单来说Spring Boot就是传统Spring 框架的进阶简介版,就像maven整合管理了大量的jar包,spring boot整合了spring 旗下的各种框架。使用此框架则可以让开发者将更多的时间放于业务开发上,而不是配置搭建上。
    2.2.2 框架应用场景与优势Spring Boot脱胎于传统的Spring框架,自然具备其优秀基因,而且具有快速搭建的特性,可以让开发者快速开发、搭建出一个Web应用。Spring由于其繁琐的配置,一直被开发者吐槽,各种繁琐的XML配置让人眼花,而且配置错误很难定位。因此使用spring boot自带的Java Config方式对Spring进行配置的Spring Boot是传统spring 框架的一大进化。一般被作为微服务的首选框架,只要是Web后端都可以考虑使用用SpringBoot框架。
    总体来说,SpringBoot框架使配置、编码、部署、监控变简单,如图2-1到图2-3所示。

    虽然Spring Boot优势这么亮眼,但是仍有着一些不足,SpringBoot如今仍是一个微框架,离健全的微服务还有一定的距离。譬如,没有提供相应的服务发现和注册的配套功能、监控功能不全。没有健全的相应的安全权限控制方案,对于REST风格的支持,还要自行结合项目实际情况进行规范化工作。
    通过以上对SpringBoot的简单分析,可以看到SpringBoot对于Java快速开发是有帮助的,因为其简化了开发过程配置过程部署过程和监控过程;但仅仅只有SpringBoot并不足以开发一个完整的大型应用,还需要与外围框架进行集成,尤其是在服务发现和注册,认证鉴权和监控等方面。
    2.3 rabbitMQ介绍2.3.1 概念、原理与特点RabbitMQ是一个由erlang开发的AMQP的开源实现,是消息队列的一种,可以实现应用程序之间的数据传输和通信。不同于传统的远程过程调用,通过使用消息队列MQ,应用程序通过读写出入队列的消息来进行通信。
    AMQP (AdvancedMessage Queue),即高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
    消息(message)是指在应用程序间传递的数据。消息可以是简单地只包含文本字符串,也可以包含复杂的实体嵌入对象。消息队列(Message Queue)是一种应用间的通信方式,消息写入消息队列后,应用程序可以立即返回,接下来交由消息系统来确保消息的可靠传递。也就是说,消息发布者只需要把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。
    RabbitMQ在易用性、扩展性和高可用性等方便具备极大的优势,常用于在分布式系统中存储转发消息,其特点有可靠性(reliability)、灵活路由(flexible routing)、消息集群(clustering)、高可用(high available queues)、多种协议(muti-protocol)、多语言客户端(many-clients)、管理界面(management UI)、消息跟踪机制(tracing)、插件机制(plugin system)等。
    所有MQ产品从模型抽象上来说都是如图2-4所示的过程:生产者(producer)生成消息,发布到队列(queue)中,通过路由(exchange)机制将消息发送到监听的消费者,进行消息的下一步处理。

    如图2-5为RabbitMQ的内部实现,其中的专有名词解释如下:

    1.message
    消息,消息是不具名的,它由消息头和消息体组成,是消息队列传输的数据对象。
    2.publisher
    消息的生产者,向消息队列中写入消息的客户端应用程序。
    3.exchange
    交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
    4.binding
    绑定,用于消息队列和exchange之间的关联。一个binding就是基于路由键(routing key)将exchange和mq连接起来的路由规则,所以可以将exchange理解成一个由binding构成的路由表。
    5.queue
    消息队列,是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直保留在队列中,直到消费者连接到这个队列将其取走。
    6.connecting
    网络连接,比如一个TCP连接。
    7.channel
    信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 连接开销是非常巨大的,所以引入信道的概念,以复用一条 TCP 连接。
    8.customer
    消息的消费者,从消息队列中读取消息的客户端应用程序。
    9.virtual host
    虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /。
    10.broker
    表示消息队列服务器实体,它提供一种传输服务,维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输。
    2.3.2 应用场景与实例从上面的描述中可以看出,消息队列是一种实现应用间异步协作的通信机制,常见的应用场景有如下三种:
    1. 业务异步处理
    通常,用户登录注册成功需要发送短信和邮件通知,有如下三种方式,(1)串行方式,如图2-6所示,首先将注册信息写入数据库,然后发送注册邮件,最后发送注册短信,上述三个任务全部成功完成后返回客户端。显然,这种方式存在一个问题,相对注册功能而言,发送短信和邮件并不是必须的,它只是一个通知,不涉及注册业务,使得客户端等待没有必要等待的东西。(2)并行方式,如图2-7所示,注册信息写入数据库后,发送短信的同时发送邮件,同样上述三个任务完成后返回客户端,降低了客户端等待的时间。(3)消息队列处理通知消息方式,如图2-8所示,注册信息写入数据库之后立即返回,客户端的响应时间即为注册处理所需时间,而与注册功能无关的邮件短信通知直接写入消息队列,由消息队列消费者异步进行数据持久化和邮件短信发送等进一步处理。
    比较这三种处理方式,显然使用消息队列的方式,客户端相应速度是串行的三倍,是并行的两倍。
    串行方式

    并行方式

    使用消息队列处理通知消息

    2.应用解耦
    所谓应用解耦,是将系统庞大的业务拆分成各自独立的模块,每个模块在单独的进程中对外提供自身的服务,各模块之间以rabbitMQ等消息机制进行通信,合作完成系统整体功能。以某电商系统的双11购物狂欢节为例,用户下单之后,订单系统需要将订单信息通知库存系统以更新商品库存以及进行后续的物流配送,传统的做法要么采用串行方式,将订单处理和库存处理代码逻辑写在同一个系统中;要么如图2-9所示,让订单系统调用库存系统的接口。串行方式使得业务逻辑复杂,代码不易维护,而且一个环节出错将导致整体操作回滚;而订单系统调用库存接口的方法又使得订单系统和库存系统存在耦合现象,当订单系统出现故障时,无法访问库存服务,导致下单业务失败的局面。

    引入消息队列机制后,订单系统与库存系统使用MQ进行通信,如图2-10所示,订单系统作为生产者,库存系统作为消费者,当用户下单后,订单系统将消息写入消息队列,返回用户下单成功;而库存系统订阅订单系统消息,获取下单信息,进行库存信息处理,使用这种方式,即使库存系统出现故障,消息队列也能保证订单消息的可靠投递,不会导致消息丢失。

    3.流量削峰
    流量削峰即使用消息队列存取机制进行访问流量控制,减轻服务器压力,一般在定时活动如秒杀抢购中应用广泛。在秒杀活动中,一般会因为访问量过大导致系统因性能问题而发生故障,此时若使用消息队列,就可以达到控制流量的目的。如图2-11所示,服务器收到用户的请求之后,将数据写入消息队列,消息数量达到最大值之后则直接抛弃消息或跳转到错误页面,秒杀业务系统根据队列中的请求信息做后续的业务处理,如此一来,首先可以控制活动人数,超过一定阈值的的订单直接丢弃,其次可以缓解短时间内的超大流量压垮应用。

    2.4 微服务架构介绍2.4.1 微服务架构概念微服务构架是近年来提出的新构架。它最早由MartinFowler与James Lewis于2014年共同提出。微服务即是“微”的服务,相比单体式系统构架,将原本庞大的功能拆分为多个独立不同的微小服务,使整个系统划分成多个不同的互相独立的小颗粒点。
    目前,微服务概念并没有一个统一的说法,其范围比较广泛,以此为基础的各种框架也不都相同。即使现在微服务还是新兴概念,但已经成为软件开发的趋势,成为各大互联网公司、软件开发公司首选的基础构架。
    微服务有如下几大特性,服务组件化、按业务团队组织、智能端点与哑管道(服务调用方式、实时、异步中间件)、去中心化治理(组件能根据不同的业务特点选择不同的技术平台)、基础设施自动化、演进式设计、容错设计。
    2.4.2 微服务架构的优势根据微服务架构的概念描述,独立部署、扩展性强,是微服务架构的明显优势。具体来说,首先,通过将巨大单体式应用分解为多个服务,解决了复杂性问题。应用被分解为多个可管理的分支和服务,每个分支负责一个功能模块,各自有清晰的边界,整个系统模块化。不仅如此,单个服务更容易开发和维护,而且可以被复用,每个服务都可以由专门的团队来开发,使得开发者自由选择所用的技术。再者,微服务架构中的每个组件独立部署,不再需要协调其它服务部署对本服务的影响,可以使得部署更快速。最后,微服务架构模式使得每个服务独立扩展,可以灵活地根据需求的规模来部署每个服务,甚至硬件资源。
    3 系统需求分析3.1 系统简介本系统并不是实现一个具体的业务功能,而是作为一个组件,集成于各类应用中,通过rabbitMQ与其他应用通信,从队列中读取数据进行数据持久化和完成特定的功能。消息中间件的功能很多,本系统以其中的几种应用场景为模拟对象,来说明消息中间件的工作原理和能完成的功能。实现的应用场景包括“邮件服务器”、“复杂业务拆分”和“分布式任务处理”,将在以下章节进行具体的场景和功能介绍。
    3.2 应用场景描述3.2.1 邮件服务器消息中间件可用于邮件服务器,通过队列监听业务系统的邮件消息,进行本地数据解析(包括参数和模板的数据渲染)和邮件发送,并记录发送日志。同时,为了实时适配业务系统的需求变更,邮件服务器提供邮件模板管理(增删改查)和日志查询功能,便于监控和管理。
    3.2.2 复杂业务拆分当一个系统很复杂时,可以使用消息中间件技术进行拆分,使用消息队列进行通信,实现业务的异步处理,提高容错率。例如在电商系统中,用户购买商品涉及订单系统、库存系统和物流系统,这些系统如果全部在一套代码中实现业务处理,那么无论是效率、容错率,还是用户体验,都达到理想的效果。因此,可以将订单系统、库存系统、物流系统拆分成单个的业务组件,约定好数据的传输格式,订单系统仅处理订单信息,库存系统仅根据订单系统传递的客户下单数据更新商品库存,物流系统仅根据库存系统传递的收货数据处理配送信息,那么整个系统将形成一个业务流水线,各个组件各司其职。
    3.2.3 分布式任务处理在规模较大的系统中,由于用户量大,经常会出现流量高峰时系统性能瓶颈的问题,如果将所有的访问压力集中在一个系统中,无疑会带来性能的压力。此时将事物处理拆分出来,并复制出多个节点,使用各自的消息队列与主系统进行通信,主系统将用户请求随机地通过消息队列分发到各个处理系统节点,由处理系统进行分布式数据处理。
    3.3 系统需求分析为了更好地说明消息中间件的典型应用场景,本系统将通过简单的业务处理去模拟在实际业务系统中消息中间件需要实现的功能和扮演的角色,并提供各类前端页面便于演示和可视化。以下为上述应用场景中的具体需求描述,其中3.3.1是属于消息中间件系统整体的需求,3.3.2是数据消息中间件作为邮件服务器的需求,3.3.3是系统作为抽离库存系统的需求,3.3.4是多队列监听处理大量任务的需求。
    3.3.1 系统整体需求描述消息组件涉及较多的资源,因此消息中间件需要配置一个系统管理用户来维护,一方面以适应实时适配业务变更的需求,另一方面管理和监控整个系统资源。
    3.3.2 邮件服务器需求描述在邮件服务场景中,邮件服务器需要承担主业务系统中的邮件消息解析和发送功能,并记录发送日志,提供邮件模板的增删改查。具体需求如下:
    1.邮件消息监听
    邮件服务器中,需要使用rabbitMQ队列与其他业务系统进行通信,对业务系统的邮件消息进行监听,获取邮件发送相关数据,并持久化存入数据库。
    2.邮件内容解析
    rabbitMQ队列监听器接收到消息后,根据模板名找到模板内容,并使用视图解析技术将模板与数据进行渲染,合成邮件内容,持久化存入数据库,等待发送。
    3.邮件发送
    邮件服务器需要实现邮件发送功能,通过集成java mail API将解析后的邮件内容封装成真正的邮件消息实体,发送到应用系统在消息数据中封装的收件人邮箱地址。
    4.邮件模板管理
    邮件服务器中的模板数据是随着业务系统的需求变更而变更的,当业务系统中邮件内容发生变化时,邮件服务器中模板也要进行更新。因此邮件服务器中要提供邮件模板管理功能,系统管理员需要对邮件模板进行增删改查,适应业务变化。
    5.邮件发送日志监控
    为了方便运维人员对邮件发送情况进行监控,需要提供邮件发送日志查询功能。需要将所有的邮件发送流水持久化到数据库表中,同时数据库中需要记录发件箱地址、发件人昵称、收件人邮箱、发送时间、主题、模板名、传入消息参数、邮件内容解析结果、解析后邮件内容、发送结果等信息,从而便于系统管理员查看邮件发送情况,及时解决线上问题。
    3.3.3 复杂应用拆分需求描述复杂应用拆分是指将大型的业务系统拆分成独立运行的子系统,各个子系统各司其职完成完整的业务处理。以从电商系统抽离库存系统为例,将库存业务从大型的电商业务中抽离出来,作为一个独立的业务处理模块对其他业务模块提供服务。抽离的库存系统需提供商品库存查询的功能,并对订单系统中的订单消息进行监控,根据订单信息更新商品库存。当用户下单成功后,订单系统给库存系统发送一个消息,告知库存系统某商品成功售出多少,然后由库存系统进行库存数据处理。
    3.3.4 分布式任务处理需求描述分布式任务处理是指在处理大规模的任务时,将处理应用复制出多个应用实例,使用消息队列的消息分发机制实现任务的并行处理。每个应用实例在各自独立的进程中运行,通过rabbitMQ队列与任务生产者进行通信,因此一个生产者对应多个消费者。事务生产者将数据写入消息队列,多个消费者负载均衡地读取数据和进行数据处理。还需提供分布式任务处理结果查询界面,以便于查看队列处理事务的情况,在页面上展示事务内容、处理应用实例、处理时间等。
    4 系统功能设计4.1 总体功能概述基于前面的需求分析,我们对此系统需要实现的功能有了一定的了解。由于本系统通常作为一个应用集群中的组件使用,实现的功能是多样的,且多数功能都只是为了展示组件在应用集群中运作的方式和结果,因此不涉及具体完整的业务功能,其涉众范围也与该组件真正的应用场景有关。在以上选取的三个场景中,涉众严格来说只有管理员,登录之后可以对系统当前的数据变化方便地进行监控和查看,便于演示。如图4-1所示为系统整体功能模块图。

    4.2 详细功能设计4.2.1 整体功能1.管理账户登录
    系统管理员账号密码为系统初始化,账号密码在系统配置文件中进行配置。用户访问此系统时,进入到登录页面,输入账号密码,点击登录,后台读取配置文件进行身份校验。当系统页面一定时间段内无交互时,登录会话超时,需重新登录,超时时间可配。
    4.2.2 邮件服务器1.邮件消息监听
    在消息中间件中生成传输邮件发送消息的消息队列(mail_queue),监听该队列的程序段读取队列中的邮件消息数据后,对其进行数据校验、模板解析、并持久化存入数据库,记录处理日志。
    2.邮件内容解析
    传递到消息中间件的邮件消息不能直接作为邮件发送出去,需要将业务参数与邮件模板解析成完整的邮件内容才能进行发送。在此功能模块中,使用freemarker模板引擎技术,根据邮件消息数据中的模板名字段选择邮件模板,与业务参数一起进行数据渲染,生成邮件内容。
    3.邮件发送
    此功能将实现邮件发送。在消息中间件中,利用Spring提供的@Schedule注解定时任务调度每间隔一段时间从数据库中读取出待发送的邮件记录,集成javamail API,搭建一个邮件发送客户端,并在数据库中记录发送日志。
    4.邮件发送日志查询
    邮件发送日志有两种,一种是邮件数据解析日志,查询所有接收到的邮件消息邮件模板解析失败日志记录;另一种是邮件发送日志,查询解析成功的邮件数据的发送日志记录,包括发送成功和不成功的日志。
    5.邮件模板管理
    邮件模板管理实现对邮件模板的增删改查,支持业务变化时灵活地更新邮件模板的内容。
    4.2.3 复杂业务拆分此场景模拟电商平台的订单系统和库存系统之间的异步通信,消息中间件的角色为库存系统,此处不考虑两个系统间保持数据一致性的方案,默认两个系统的数据一直是同步的。
    1.订单生成消息监听
    在消息中间件中生成订单-库存消息队列(order_stock_queue),监听该队列的程序段接收到订单系统写入的订单信息后,根据消息中的商品编号和购买数量更新商品库存数量。
    2.更新商品库存
    商品的库存数据存入数据库库存表中,当接收到订单消息后,从消息数据中得到商品编号,购买数量,将库存表中对应的商品数据已售数量和库存数量更新。
    3.商品库存管理
    为方便查看系统处理订单数据和库存数据的结果,前端提供商品数量的查询页面,展示商品编号、商品已售数量、商品库存数量。
    4.2.4 分布式任务处理1.事务消息监听
    创建多个MQ消费者监听应用发送的事务消息,本系统以加减乘除模拟事务处理,消息中包含两个整数参数,监听该消息的程序段对这两个参数进行常规的数学运算,并将结果和处理该事务的对列明写入数据库便于监控。
    2.事务处理并写入数据库
    对接收的参数做加减乘除数学运算,将结果存入数据库。
    3.事务处理结果查询
    方便查看各个队列处理事务的情况,从数据库中读取数据,在前端页面展示。
    4.3 数据库设计在4.2章节的详细设计中提到了各个业务场景功能中大致的数据库存储数据内容,具体的数据库表结构设计如下
    4.3.1 邮件服务器mail_ask_for表存储所有接收到的邮件消息。监听邮件消息队列的程序段读取到邮件消息后,对消息进数据校验和模板解析,无论是否解析成功,结果均存入mail_ask_for表(表结构如表4.1所示)。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    sn


    create_time
    datetime

    YES
    创建时间


    update_time
    datetime

    YES
    更新时间


    version
    int
    0
    NO
    数据版本


    msg_from_nick
    varchar

    YES
    发件人标签


    msg_to
    varchar

    YES
    接受者邮件地址


    temp_enable
    tinyint
    0
    NO
    是否使用模板,0:不使用,1:使用


    param
    text

    YES
    参数(json格式)


    attachment
    text

    YES
    附件列表(json格式)


    temp_name
    varchar

    YES
    模板名称


    subject
    varchar

    YES
    邮件主题


    context
    text

    YES
    消息内容


    send_type
    tinyint
    0
    YES
    发送状态,0:实时发送 1:定时发送


    timing
    datetime

    YES
    定时发送时间


    dealwith_state
    tinyint
    0
    YES
    0处理成功,1处理失败!


    remark
    varchar

    YES
    备注



    mail_send_record存储解析成功的、进行发送处理的邮件消息记录。上述邮件消息解析成功后,存入mail_send_record表,由定时任务每间隔一段时间读取待发送的邮件记录,进行邮件发送,并更新发送次数和发送状态,表结构如表4.2所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    sn


    create_time
    datetime

    YES
    创建时间


    update_time
    datetime

    YES
    更新时间


    version
    int
    0
    NO
    数据版本


    msg_from_nick
    varchar

    YES
    发件人标签


    msg_to
    varchar

    YES
    接受者邮件地址


    subject
    varchar

    YES
    邮件主题


    context
    text

    YES
    消息内容


    send_status
    tinyint
    0
    NO
    发送状态,0:未发送,1:已发送 3 发送失败 4:处理中 5:记录已取出


    send_times
    int
    0
    NO
    发送次数



    mail_send_log表存储mail_send_record表中邮件发送日志流水,发送成功记录发送日志,发送失败记录发送日志和失败原因,表结构如表4.3所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    sn


    create_time
    datetime

    YES
    发送时间


    mail_sn
    varchar

    YES
    邮件sn


    send_status
    tinyint
    0
    YES
    发送状态,0:未发送,1:已发送 3 发送失败 4:处理中 5:记录已取出


    remark
    varchar

    YES
    备注



    mail_template表存储邮件模板数据,通过temp_name字段唯一确定模板记录,模板内容为freemarker语法,表结构如表4.4所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    sn


    create_time
    datetime

    YES
    创建时间


    update_time
    datetime

    YES
    更新时间


    version
    int
    0
    NO
    数据版本


    temp_name
    varchar

    NO
    模板名称


    temp_group_name
    varchar
    默认分组
    NO
    模板分组名


    temp_subject
    varchar

    YES
    模板标题


    temp_context
    text

    YES
    模板内容


    temp_enable
    tinyint
    0
    NO
    是否可用,0:不可用,1:可用



    mail_attachment存储每个邮件消息要发送的附件信息,从邮件消息队列中解析而来,表结构如表4.5所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    sn


    create_time
    datetime

    YES
    创建时间


    update_time
    datetime

    YES
    更新时间


    version
    int
    0
    NO
    数据版本


    msg_sn
    varchar

    NO
    邮件sn


    attachment_name
    varchar

    NO
    附件名字


    attachment_path
    varchar

    YES
    附件地址



    4.3.2 复杂业务拆分product_order表存储订单信息,当监听订单-库存消息队列的程序段读取到数据之后,持久化到product_order表,表结构如表4.6所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    商品编号sn


    create_time
    datetime
    CURRENT_TIMESTAMP
    NO
    创建时间


    update_time
    datetime
    CURRENT_TIMESTAMP
    NO
    修改时间


    product_sale
    bigint
    0
    YES
    购买数量



    product_stock表存储商品库存信息,表结构如表4.7所示。



    column name
    datatype
    default value
    is nullable
    comment




    sn
    varchar

    NO
    商品编号sn


    create_time
    datetime
    CURRENT_TIMESTAMP
    NO
    创建时间


    update_time
    datetime
    CURRENT_TIMESTAMP
    NO
    修改时间


    product_name
    varchar

    NO
    商品名称


    product_sale
    bigint
    0
    YES
    已售数量


    quantity
    bigint

    NO
    库存数量



    4.3.3 分布式任务处理distributed_result存储任务处理结果,监听分布式任务的消息队列读取消息后,将消息中的参数a、b和对这两个参数的数学运算结果写入此表,模拟任务处理,表结构如表4.8所示。



    column name
    datatype
    default value
    is nullable
    comment




    create_time
    datetime
    CURRENT_TIMESTAMP
    NO
    创建时间


    update_time
    datetime
    CURRENT_TIMESTAMP
    NO
    修改时间


    sn
    varchar

    NO
    事务编号


    deal_queue_name
    varchar

    NO
    处理应用


    parameter_a
    int

    NO
    参数a


    parameter_b
    int

    NO
    参数b


    result_add
    int

    NO
    a+b


    result_reduce
    int

    NO
    a-b


    result_multiply
    int

    NO
    a*b


    result_divide
    float

    NO
    a÷b



    5 系统功能实现为更好地说明rabbitMQ在实际应用系统中的应用机制,本系统将实现一个包含4个应用实例的应用集群,有1个消息生产者和3个消息消费者,通过MQ进行通信,拓扑图如图5-1所示。

    5.1 系统管理员登录生产者应用和消费者应用均提供管理员登录页面。管理员的账号密码在系统的配置文件中进行配置,本设计使用admin/a123456作为账号密码,运行系统,在浏览器中输入http://localhost:8080/login.action 显示系统登录页,如图5-2所示,输入账号密码,点击登录进入功能页。登录信息使用session进行会话管理,30分钟无操作则登录失效。
    由于生产者和消费者角色的不同,因此其包含的功能也不尽相同。生产者应用中登录成功后的首页如图5-3所示,包含发送邮件消息、创建批量任务消息、创建订单消息等功能;消费者应用登录成功后的首页如图5-4所示,包含邮件模板管理、邮件日志查询、库存查询、分布式任务处理结果等功能,具体功能将在下文进行详细介绍。

    5.2 邮件服务器5.2.1 邮件模板管理功能主页如图5-5所示,在邮件模板管理功能中,分页查询当前系统中的模板数据,使用列表展示,点击”添加模板”可进入模板添加页面,如图5-6所示;点击操作栏中的”更新”可进入模板编辑页面,当前模板信息在表单中回显,如图5-7所示。

    5.2.2 邮件消息监听和持久化系统使用rabbitMQ队列进行消息传输,在系统配置RabbitConfig中进行队列生成,关键代码和相关配置文件如图5-8,5-9所示,在监听方法中加入@RabbitHandler和@RabbitListener注解,以实现消费者事件监听。
    rabbitMQ服务搭建在远程服务器中,具体搭建过程与本设计无关,故省略。rabbitMQ提供了管理界面,可查看当前队列信息,启动消费者应用后,会生成三个队列,如图5-10所示。

    5.2.3 邮件发送在生产者应用中提供了邮件消息生成页面,如图5-11所示。点击各个按钮,将创建一个邮件消息到消息队列,消费者监听后进行发送处理。以”模板实时发送带参数带附件”为例,点击此按钮,将在mail_ask_for表生成一条邮件请求数据,模板解析成功后,在mail_ask_record中生成一条待发送数据。经过邮件发送定时任务处理后,使用java mail将邮件发送到收件人。邮件发件箱配置如图5-8所示,邮件发送关键代码如图5-12,5-13,5-14,5-15所示。收件人收到的邮件如图5-16所示。

    5.2.4 邮件日志查询在消费者应用中提供了邮件日志查询页面,如图5-17所示,接收的邮件消息将有四种处理结果,分别是内容解析成功、内容解析失败、发送成功和发送失败,且只有内容解析成功的邮件才会进行发送处理,点击列表上方的状态单选按钮可切换查询条件。

    5.3 复杂业务拆分本系统以简单的商品购买和库存查询功能来模拟大型电商平台中订单系统与库存系统分离的应用场景。在生产者应用中,提供了创建订单消息的商品购买页面,如图5-18所示,列表展示商品信息,点击操作栏中的”购买”按钮将生成一个订单消息,并发送到消息队列。

    在消费者应用中,提供商品库存查询页面,如图5-19所示。当消费者应用接收到来自生产者应用的订单消息时,会更新商品库存。在该页面中,点击操作栏中的”订单列表”可以看到该商品的订单记录,如图5-20所示。

    5.4 分布式任务处理在生产者应用中,提供了创建大量任务的按钮用于测试,如图5-21所示,点击该按钮,会批量生成50条消息放入消息队列供消费者处理。

    在上文的系统拓扑图中有介绍,将开启三个消费者实例来并行处理这些任务,分别是consumer、consumer1和consumer2,此时在rabbitMQ 管理界面可以看到,监听分布式任务消息的队列rookie_distributedqueue拥有了三个消费者,如图5-22所示。这些消费者同时监听发布到rookie_distributedqueue队列中的消息,负载均衡地进行任务处理。在消费者应用中提供了任务处理结果查询页面,如图5-23所示,通过列表中”处理实例”字段的数据,可以看出生成的50个任务消息大致均衡地被3个消费者实例处理了。

    6 总结与展望6.1 应用优势本系统作为消息中间件,模拟实现了rabbitMQ的三种典型的应用场景,可以方便地集成到各大应用集群中作为消息,只需更改其具体的业务实现即可。在邮件服务器中,使用java mail技术,真实地实现了邮件客户端,可以将邮件发送出去,且发件箱信息在配置文件中,更改发件人账号只需简单地更改配置文件。
    本系统使用spring boot,启动简单,配置方便,是一个轻量级的组件,且由于使用消息队列监听与其他应用进行通信,在本地进行数据持久化,数据稳定可靠,可扩展性强。
    6.2 优化方向与方案rabbitMQ的应用场景远不止本文所描述的三种,其队列有多种类型,可以灵活适配各种业务需求,当作为邮件服务器时,不仅可以将系统的邮件发送功能分离出来,还可以将短信、站内消息等均抽离到邮件服务器,将邮件服务器作为业务系统的消息中心,扩展出更丰富的消息服务。
    另外,由于时间等客观因素,本系统只能简单地模拟业务场景,展示出使用消息队列的异步通信原理和方式,起到示意作用,而应用在真实的业务系统中时,涉及到的数据处理复杂度远不止于此种程度,而且分布式业务处理所带来的数据不一致问题,在真实的业务场景中是务必要考虑的。
    参考文献[1] 鱼朝伟,詹舒波.基于RabbitMQ的异步全双工消息总线的实现[J].软件,2016,37(02):139-146.[2] 杨家炜.基于Spring Boot的web设计与实现[J].轻工科技,2016,32(07):86-89.[3] 欧阳荣彬,王倩宜,龙新征.基于微服务的数据服务框架设计[J].华中科技大学学报(自然科学版),2016,44(S1):126-130.[4] 王永和,张劲松,邓安明,周智勋.Spring Boot研究和应用[J].信息通信,2016(10):91-94.[5] 李华.基于Spring boot的高职院校实践教学管理系统的实现[J].绵阳师范学院学报,2016,35(11):70-74.[6] Spring boot集成RabbitMQ[J].电脑编程技巧与维护,2017(02):4.[7] 黄小锋,张晶.微服务框架介绍与实现[J].电脑与信息技术,2016,24(06):14-16.[8] 李春阳,刘迪,崔蔚,李晓珍,李春岐.基于微服务架构的统一应用开发平台[J].计算机系统应用,2017,26(04):43-48.[9] 马巍,武欣嵘,郑翔,张文强,童玮.RabbitMQ在实时监控系统中的应用[J].军事通信技术,2017,38(01):82-85.[10] 张晶,黄小锋,李春阳.微服务框架的设计与实现[J].计算机系统应用,2017,26(06):259-262.[11] 张峰.应用SpringBoot改变web应用开发模式[J].科技创新与应用,2017(23):193-194.[12] 温晓丽,苏浩伟,陈欢,邹大毕.基于SpringBoot微服务架构的城市一卡通手机充值支撑系统研究[J].电子产品世界,2017,24(10):59-62.[13] 王志勃,王麒森,毕艳茹.互联网环境下微服务框架分析与研究[J].信息与电脑(理论版),2017(22):23-25.[14] 谭一鸣. 基于微服务架构的平台化服务框架的设计与实现[D].北京交通大学,2017.[15] 马雄. 基于微服务架构的系统设计与开发[D].南京邮电大学,2017.[16] 荀崇崇. 分布式服务与服务集群技术研究[D].成都理工大学,2017.[17] 李楚畅. 基于MBaaS架构的移动后端服务框架的研究与实现[D].北京邮电大学,2017.[18] 宋鹏威. 开放式微服务框架的设计与应用[D].北京邮电大学,2017.[19] 程岚岚,田文涛,汪剑.基于Spring Boot的网页健康性评级系统的设计与实现[J].电脑与信息技术,2018,26(02):45-47.[20] 袁佳,郭燕慧.基于rabbitmq的海量日志的分布式处理[J].软件,2013,34(07):19-23.[21] 吴炜鑫,王宇,王兴伟.基于AMQP的校园消息总线系统的设计与实现[J].通信学报,2013,34(S2):180-183.[22] 李健. 基于RabbitMQ的核查地震交互分析软件的调度设计[A]. 中国地球物理学会国家安全地球物理专业委员会、陕西省地球物理学会军事地球物理专业委员会.国家安全地球物理丛书(十)——地球物理环境与国家安全[C].中国地球物理学会国家安全地球物理专业委员会、陕西省地球物理学会军事地球物理专业委员会:,2014:7.[23] 陈璞. 基于RabbitMQ的电子商务系统设计与实现[D].天津大学,2015.[24] Felipe Gutierrez. Spring Boot, Simplifying Everything[M].Apress:2014-06-15.[25] Chris Schaefer,Clarence Ho,Rob Harrop. Spring Projects: Batch, Integration, XD, and Boot[M].Apress:2014-06-15.[26] Jing Jing Yan,Yun Fang Ma. Learning-Sphere Curriculum and Course Development of “Java Web Application Development” Based on Working Process[J]. Applied Mechanics and Materials,2013,2388(321).[27] Akitoshi Yoshida. MOWS: distributed Web and cache server in Java[J]. Computer Networks and ISDN Systems,1997,29(8).[28] Gun Ho Lee,Junsu Jung. Web framework with Java and XML in multi-tiers for productivity[J]. Future Generation Computer Systems,2006,23(2).
    致 谢从开始选题,经历了近半年的资料收集、材料整理、论文写作和系统开发,且在此期间还坚持公司实习,今天终于完成了毕业设计和毕业论文,也算是给大学生活画上了一个完美的句点。
    论文得以完成,要感谢的人实在太多了,首先要感谢我的毕业设计指导老师,老师同时也是我大学四年的导师,无论是在专业素质的培养还是职业发展的选择上,都给予了我莫大的帮助。老师还要同时指导其他两位同学的论文,加上本来就有的教学任务,工作量之大可想而知,但在一次次的回稿中,精确到每一个字的批改给了我深刻的印象,使我在论文之外明白了做学问所应有的态度。同时,还要感谢实习公司的岗上导师,为我的毕业设计提供了技术支持,让作为本科生的我接触到了微服务架构和rabbitMQ等新的技术,为毕业设计增加亮点。
    论文的顺利完成,也离不开其它各位老师、同学和朋友的关心和帮助。在整个的论文写作中,各位老师、同学和朋友积极的帮助我查资料和提供有利于论文写作的建议和意见,在他们的帮助下,论文得以不断的完善。另外,要感谢在大学期间所有传授我知识的老师,是他们的悉心教导使我有了良好的专业课知识,这也是论文得以完成的基础。
    0 评论 3 下载 2018-09-26 16:42:27 下载需要20点积分
  • 基于BeautifulSoup和jieba的用户投书文本知识图谱构建研究与实现

    摘要自从google公司推出旗下的产品KnowledgeGraph以来,知识图谱这个概念越来越受到学术与工业界的关注。如何以质量参差不齐的网页数据作为原始数据源,构建知识图谱已经成为了一个热门的研究课题。
    互联网技术的迅速发展导致了网民数量的快速增长。愈来愈多的人热衷于在网络论坛上发表想法。在这个背景下,投诉类型论坛吸引了政府和个人的广泛关注。他们都希望能从投诉类型论坛的帖子中获取一些有价值的信息。
    本文首先介绍本课题的研究背景,主要任务与目标:构建基于投诉文本的知识图谱;然后介绍本课题相关的技术背景:知识图谱以及文本情感分析;接着介绍实验的数据处理和构建知识图谱的算法设计:本文使用Beautiful Soup进行文本提取,使用jieba工具进行分词,使用流水线方法进行实体关系抽取;随后本文介绍具体的实验过程,给出实验结果和实验评估;最后本文对本课题的工作做一个总结和展望。
    关键词:知识图谱;情感分析;命名实体识别;关系抽取
    AbstractSincegoogle company introduced its product Knowledge Graph, the concept of knowledgegraph has been increasingly concerned by academic and industrial circles. Howto use the Web page data with uneven quality as the original data source tobuild a knowledge graph has become a hot research topic.
    Therapid development of Internet technology has led to a rapid increase in thenumber of Internet users. More and more people are keen to express ideas inonline forums. Under such circumstances, the complaint type forum attractedwide attention from the government and individuals. They all hope to get somevaluable information from the complaint type forum post.
    This paper first introduces theresearch background, main tasks and goals of the project: constructs atext-based knowledge map; then introduces the related technical background ofthis topic: knowledge graph and text sentiment analysis; then introduces theexperimental data processing and algorithmic construction of the knowledgegraph design: This paper uses Beautiful Soup for text extraction, and usesjieba tools for word segmentation, and the use of pipeline method for entityrelationship extraction; then this paper describes the specific experimentalprocess, gives experimental results and experimental evaluation; Finally, thispaper summarizes and prospects the work of this topic.
    Keywords: knowledge graph;sentiment analysis; namedentity recognition; relation extraction
    前言当前,随着互联网相关技术的不断蓬勃发展,以及人们经济水平的不断提高。愈来愈多的人开始通过计算机或者便于携带的手机连接至因特网。搜寻自己想要的内容。与此同时,随着愈来愈多的人参与至因特网中,互联网上产生数据大爆炸。大量的碎片化的数据信息使得人们眼花缭乱,不知所措。
    在这种情形下,搜索公司巨头谷歌在几年前推出一款重磅产品:谷歌知识图谱。谷歌知识图谱旨在解决搜索结果质量不高的问题。它将互联网上的数据联系起来,使之不再是没有意义的字符串,数据变成了具有关联性的实体。谷歌通过这款产品,提升了用户的搜索体验,巩固了其搜索技术的霸主地位。与此同时,无论是工业界还是学术界都对知识图谱技术产生了浓厚兴趣。
    我国的宪法规定了公民具有监督权。传统上,普通群众监督的方式一般是拨打有关单位电话或者信访等。但随着互联网进入了人民的生活,互联网的便利性给人以深刻印象,越来越多的人选择通过在互联网上发言来行使相关权利。在这种背景下,苏州市政府于2005年建立了苏州阳光便民12345网站,给了想要投诉的群众一个良好的平台。
    本文以投诉类型网站为切入点,通过从网页中提取投诉文本,中文分词,停用词过滤,实体关系识别等步骤构建基于投诉文本的知识图谱。旨在从庞大的投诉类型数据中提取出有价值的信息。
    第一章 概述1.1 引言互联网的发展导致了“数据大爆炸”。但正所谓”乱花渐欲迷人眼”,大量的数据反而导致人们很难从中获得有效信息。于是诸如谷歌、百度之类的搜索平台在上世纪九十年代应运而生,他们一般采用向量空间模型(Vector Space Model)。然而这些基于关键词匹配的搜索技术目前存在一些缺陷:搜索引擎缺乏互联网网页中人、物、事之间的联系,因此无法完成精确搜索。
    于是知识图谱这一概念应运而生。它将人物和事物作为实体,并构建他们之间的关系。数据不再是孤立的个体,相反数据之间充满了联系。目前,面向特定领域的中文知识图谱的项目比较缺乏。因此,构建一个特定领域的知识图谱具有重要现实意义。
    我国的互联网正在蓬勃发展中。截至2018年初,我们国家的互联网用户已经颇具规模,达到近八亿人。网民人群数量的急剧增长改变了我国传统监督体系。人们可以通过互联网在各大论坛上面发表自己的意见,提出自己的不满和诉求。基于互联网的舆论监督正在发挥着越来越重要的作用。
    本文的工作关注互联网用户投诉这一特定领域,以投诉文本作为原始数据,构建基于投诉文本的知识图谱。
    1.2 课题的主要任务和目标本课题的主要内容是(1)对投诉文本进行分词,从而为之后提取实体以及他们之间的关系奠定基础。(2)对投诉文本进行停用词过滤,除去影响结果的冗余信息。(3)从投诉文本中提取实体概念。(4)用实体概念以及他们之间的关系构建知识图谱。本课题的主要任务是基于用户投诉文本进行知识图谱的构建,即输入一个关键词输出与该关键词相关联的信息。并以视觉(图片)的方式呈现这些信息。
    1.3 本文的组织本文的第一章是概述,主要阐述课题背景以及课题的主要任务与目标。本文第二章介绍相关技术背景:一是知识图谱技术背景,二是文本情感分析技术背景。第三章介绍数据整理和算法的设计:首先是数据清洗的方法,接着是中文分词,然后是停用词处理,最后是知识图谱的提取。第四章介绍具体实验设计、分析、和评估方法。第五章对本课题做一个总结并且对课题做进一步展望。最后是参考文献和致谢。
    第二章 相关技术背景2.1 知识图谱2012年谷歌发布了一款重磅产品“知识图谱”(Knowledge Graph)。知识图谱可以将谷歌的结果进行知识系统化,用户所输入的任何一个关键词都能获取完整的知识体系。比如你输入特朗普,谷歌的侧栏就会告诉你特朗普的相关信息,比如他的身份,配偶,以及其子女信息等等。换句话说在知识图谱的概念里面,一切都是一个实体,而非简单的,没有联系性的字符串[1]。事实上知识图谱是大数据时代的必然产物,互联网上爆炸的数据使得人们迫切需要一个将这些数据关联起来的工具。
    知识图谱本质上是一个语义网[2]。语义网络最早可以追溯的上个世纪六十年代,它是一个有向图,这个有向图由顶点和边构成。顶点代表实体或概念,有向图中的边代表实体或概念之间的关系。在早期,语义网络的构建一般由手工构建。知识图谱的数据源是互联网上的网页数据,包括结构化,半结构化,以及非结构化数据。其中大部分数据都是非结构化的。这些数据需要通过数据清洗等手段进行数据的预处理,因为这些原始数据里面充满了噪声比如歧义等等。
    大体上,知识图谱的构建可以分为以下几个部分:一是实体或概念的获取;二是关系的提取;三是实体或概念与关系的关联,去除伪信息以及互斥信息,构建知识图谱。常见的实体或概念与关系的识别方法有两种:一是流水线方法[3],二是端到端识别方法。关于实体关系的去除伪信息以及去除互斥信息。最近提出了一种可行的方法是使用概率软逻辑[4],它既可以捕获事实之间的概率依赖关系又在实体和其关系之间执行全局约束。根据应用场景,实体或概念与关系的存储可以采用关系型数据库以及NoSQL。如果使用场景需要高性能计算,则需要配合Hadoop或者Spark使用。
    2.2 文本情感分析文本情感分析又被称为意见挖掘[5],是指对存在主观情感倾向的文本进行情感分析和提取的过程。文本情感分析技术一般被用来做网络营销、企业舆情监控、政府舆论监控等等用途。一般来讲,文本情感分析技术可以划分成几个子任务,首先是提取给定文本的主题。接着是确定陈述者主体,然后是提取该主体的陈述的主观性语句,过滤那些客观性语句。最后是对他的情感倾向进行判断分析。根据给定文本的粒度不同,可以将文本情感分析划分为词汇级,语句级,篇章级,以及海量数据级。针对海量数据级,随着互联网的发展,网络的各个平台都存在“网络水军”,他们所陈述的意见往往都是不真实的,可能会对最终结果造成较大影响。因此需要首先根据噪声的特征进行数据清洗。
    常见的文本情感分析方法有:(1)基于机器学习的技术,比如支持向量机等等。(2)基于词典的方法,即对一个新出现的词,根据词典中相似词对其进行情感倾向推理。目前,中文的文本情感分析还存在一些挑战,具体在:(1),效果良好的英文文本情感分析技术无法在中文文本上获得相同效果。(2),不同语境下的情感分析技术效果不佳,等等。随着智能手机的火热以及诸如微博这类信息发布和分享平台的发展,短文本的情感分析将会越来越受到人们的重视。
    第三章 数据整理和算法设计3.1 数据的清洗本课题的数据是“苏州阳光便民12345”网站的投诉网页,格式是HTM如图3.1所示。

    “苏州阳光便民12345”是由苏州市人民政府组织创建的网站。它成立于2005年,网站的建站目的是通过整合政府部门和有关行业单位的公共服务资源,设立统一的服务热线平台,365天×24小时为市民提供方便、快捷、优质、规范的服务。
    市便民服务中心为市政务办下属、副处级、公益一类事业单位。主要职责:一是负责拟订全市便民服务工作的标准、规范,并组织实施;二是负责市“12345”政府公共服务热线的运行管理,承担与其他市级公共服务热线和服务平台的对接、联动、合作;三是负责市“12345”政府公共服务热线的诉求受理、答复,事项的交办、跟踪、督办和回复回访,协助做好承办单位的业务协调、服务质量和服务效果的监督考核工作;四是依托“12345”服务平台,开展社情民意调研、舆情分析,向公众提供相关的政务信息服务;五是参与文明创建、社会信用、城市管理、城市综合服务标准化、政风行风、作风效能、绩效管理等公共事项的管理;六是参与防汛防旱、防台风、突发水污染、突发固体废物污染、食品安全等突发事件的应急管理;七是指导各市、区便民服务业务工作。
    可以从图3.1看到该HTM网页中的本文所需要的投诉文本:(1)投诉标题;(2)投诉正文(3)网友针对投诉内容的跟帖与回复。
    为了提取这三类文本,需要观察该HTM的源码。三类文本都在HTM网页固定的标签之中:对于投诉标题,如图3.2所示,它总是位于H1标签中最里面的位置。而投诉正文和跟帖回复则位于属性开头为“postman”的TD标签之中,如图3.3以及图3.4。
    投诉标题位于H1标签最里面
    投诉正文位于属性的开头为“postman”的TD标签之中
    投诉回复也位于属性的开头为“postman”的TD标签之中
    从HTM格式的数据中提取特定标签内容的工具有很多,本文使用比较常见的工具:Beautiful Soup。利用该工具提取出投诉文本之后,本文需要对其做进一步处理。
    3.2 中文分词为了从文本中提取实体或概念与关系,本文首先得对投诉文本进行中文分词。所谓分词就是将连续的字符串或序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,因此,在词理解上就比较直观。而汉语中词与词之间没用分界符,因此需要本文进行分词。
    分词的算法有很多,总体可以分为两类:一类是无词典的分词方法,另一类是有词典的分词方法。所谓无词典就是根据汉字串在汉字语料中出现的概率来推断出该汉字串是否为词。有词典的分词方法是根据现有词典进行分词的方法。常见的有词典分词算法有:

    正向最大匹配算法;逆向最大匹配算法;双向匹配法;邻近匹配算法;最短路径匹配算法;基于统计的最短路径分词算法。
    正向最大匹配算法的思想是以中文字符串的首字为起点,找到在中文字符串中出现的最长的词。这即是该字符串的第一个分词,剩余的字符串按照相同的方法处理。逆向最大匹配算法的做法和上面的正向对最大匹配算法相反,它以汉字字符串的尾部为起点,找到最长的词汇,然后切分。并对剩余的汉字字符串做相同的动作。双向匹配算法是将正向最大匹配算法和逆向最大匹配算法结合起来,构成新的算法。邻近匹配算法是一种改进的最大匹配算法,它改进了了正向最大匹配算法的效率。最短路径匹配算法是将汉字字符串进行全切分,接着构建汉字字符串切分的有向无环图。每一个汉字分词对应一条边,每条边上有一个权值。找出从有向图的起点到终点的最短路径,该路径包含的词就是汉字字符串的切分结果。基于统计的最短路径分词算法是对最短路径匹配算法的一种改进,它根据词频给词典里的词分配不同的权重,具体的权重值可以通过大规模语料库获得。
    常用的分词工具有很多,本文选择比较常见的jieba分词工具。Jieba分词工具所采用的分词算法便是上述的基于统计的最短路径分词算法。在有向无环图中求最短路径,把分词问题变成用动态规划解决的最短路径问题。对于未登录词,jieba采用了基于汉字成词能力的隐马尔可夫模型,使用维特比算法。
    3.3 停用词处理经过上一步的分词处理,投诉文本变成了汉字词汇序列。但是这些词汇序列中还存在着停用词,本文需要对其进行过滤。停用词就是停止处理的词语,因为这些词语没有实际的含义。却占用存储空间,并且会对结果产生影响。停用词的过滤一般有以下几种方法:

    将数据集中的高频与低频词汇找出,人工提取有用的词汇,剩余的就是停用词。参考互联网上的常用中文文本停用词表。
    本文将使上述两种方法结合起来,先参考哈工大停用词表,再对高低频词汇人工筛选。
    3.4 知识图谱提取设计知识图谱中的结点代表实体,边代表实体之间的关系。接下来本文需要做的是实体识别和关系抽取。
    在本章的前面几小节里面,本文对投诉文本进行分词,停用词过滤。一组中文词汇集合。为了进行实体识别,本文对该词汇集合中的所有词按照其词频从大到小进行排列,选取词频较高的词语,把他们当作实体。关于关系抽取,常见的主要有两种方法。一种是流水线方法[6],另一种方法是基于神经网络的联合学习[7]。
    流水线方法的思想是:

    第一步,将实体与实体之间两两组合。第二步,进行关系分类。
    与流水线方法不同,联合学习对实体识别和关系抽取使用单一模型,比如使用 Long Short Term Memory networks模型等等。
    本文使用实现简单的流水线方法,首先进行实体识别,再进行关系抽取。
    3.5 本章小结本章具体讨论了构建基于投诉文本的中文知识图谱的步骤以及各个步骤所使用的算法:首先从HTM格式网页提取投诉文本。本文使用Beautiful Soup来提取这些文本。接着对投诉文本进行中文分词。这一步本文使用的工具是jieba分词。随后本文对词汇集进行停用词过滤。针对不同的主题,停用词也不尽相同。本文采用了参照停用词表与人工筛选相结合的方法,对停用词过滤。最后本文进行提取知识图谱。本文采用的是流水线方法,将问题分成两个子任务:实体识别和关系抽取。对于实体识别,本文采用两两组合配对的方法。
    第四章 实验设计分析和评估4.1 实验设计如图4.1所示,本文的实验设计可以划分为以下几个步骤:

    从网页中提取投诉文本;对投诉文本进行分词;停用词过滤;提取高频词作为实体;计算实体相关性;构建知识图谱。

    首先本文使用BeautifulSoup提取HTM文件中投诉文本,投诉文本又可以分成投诉标题,投诉正文,以及投诉回复三个部分。本文分别编写不同的代码提取之。
    对于投诉标题,由于它位于H1标签中最里面的位置。因此本文采用以下主要代码提取它:
    from bs4 import BeautifulSoup #导入包import reimport oslist=os.listdir("../html")f=open("../text/投诉文本.txt","w",encoding='utf-8')#utf-8方式打开#print(len(list))for i in range(0,len(list)): path = os.path.join("../html", list[i]) t="../text/htm/"+str(i)+".txt" if os.path.isfile(path): soup = BeautifulSoup(open(path, 'rb')) # 以rb的方式打开文件 tf=open(t,"w",encoding='utf-8') headlist = soup.find_all('h1') for head in headlist: alist = head.find_all('a') for a in alist: if ("[咨询投诉]" not in a.string): f.write(a.string) f.write("\n") tf.write(a.string) print(a.string) # 接着提取正文和回复 <TD id=postmessage。。。。> tdlist = soup.find_all('td', attrs={'id': re.compile("postmessage")}) for td in tdlist: text = td.get_text() f.write(text) tf.write(text) f.write("\n") print(text) tf.close() print(i)f.close()
    在上面代码的第14行,本文过滤了“咨询”,“投诉”这两个停用词。原因是短语“咨询投诉”在每个HTM网页中固定位置都会出现,因此失去了实际的意义。
    对于投诉正文和投诉回复,它们都位于属性的开头为“postman”的TD标签之中,因此可以用下面的代码提取:
    tdlist = soup.find_all('td', attrs={'id': re.compile("postmessage")})for td in tdlist: text = td.get_text() f.write(text) tf.write(text) f.write("\n") print(text)
    本文通过上述两份主要的代码从HTM网页中提取投诉文本,并将投诉文本写入txt格式文件中。
    接下来,本文从这个txt格式文件中读取投诉文本,使用jieba分词工具对其进行分词。并用停用词表进行停用词过滤。最后按照词频从高到低对词语排序,选取前1500个词语。主要代码如下:
    import jiebaimport refrom collections import Counterf=open("../text/投诉文本.txt",'r', encoding='UTF-8')#只读,注意编码方式of=open("../text/高频词.txt",'w', encoding='UTF-8')ef=open("../text/实体.txt",'w',encoding='UTF-8')jieba.load_userdict('../text/自定义词.txt')#导入自定义词#加载停用词表stopWord = [line.strip()for line in open('../text/停用词.txt').readlines() ]line=f.read()if line: seg_list = jieba.cut(line, cut_all=False) c = Counter() for x in seg_list: if len(x) > 1 and x != '\r\n'and (x not in stopWord )and not x.isdigit(): if(not re.match(r'[a-zA-Z]+',x)):#正则表达式过滤英文 c[x] += 1 for i in c.most_common(1500): of.write(str(i[0])+' '+str(i[1])+'\n') ef.write(str(i[0]) + '\n') print(i)f.close()of.close()ef.close()
    经过观察,jieba对于极个别未登录词的分词效果不好,例如词语“寒山闻钟”被划分成了“寒山闻”。因此需要在jieba中导入自定义词:
    jieba.load_userdict('../text/自定义词.txt')#导入自定义词
    同时,高频词中存在诸如“&#”,英文字符串,数字,等等无意义的词语,这些都没有被过滤掉。解决的方法是在停用词表里添加停用词,如图4.2,并且配合正则表达式进行过滤:
    for x in seg_list:if len(x) > 1 and x != '\r\n'and (x not in stopWord )and not x.isdigit(): if(not re.match(r'[a-zA-Z]+',x)):#正则表达式过滤英文 c[x] += 1for i in c.most_common(1500): of.write(str(i[0])+' '+str(i[1])+'\n') ef.write(str(i[0]) + '\n') print(i)

    为了对处理结果有一个感性认识,本文使用了matplotlib库来进行数据可视化,以柱状图的形式展示高频词的词频分布情况,下面是主要代码:
    import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['simHei']plt.rcParams['axes.unicode_minus']=False#解决中文乱码问题file=open("../text/高频词.txt",'r',encoding='UTF-8')eef=open("../text/实体关联.txt",'r',encoding='UTF-8')ees=open("../text/实体关联排序.txt",'r',encoding='UTF-8')eesdic={}eesline=ees.readline()while eesline: text=eesline.strip('\n') eesdic[(text.split()[0],text.split()[1])]=text.split()[2] eesline=ees.readline()freq=[]k=0for i in eesdic.values(): freq.append(float(i)) k+=1 if k>=15000: breakplt.bar(range(len(freq)),freq,color='gray')plt.show()file.close()eef.close()ees.close()
    接下来,本文将进行实体识别和关系抽取。为了探究实体之间的相关性,本文将之前的前1500个高频中文分词两两组合,并且计算这两个实体在同一个HTM格式的投诉网页上出现的频率。经过实验,单独按照某两个实体在网页中一同出现的频率降序排列并不能准确描述实体与实体之间的关联性。本文采用了如下公式:K= P(A,B)/(P(A)P(B))上面公式(1)中的P(A)*表示实体A在数据集中出现的概率,P(B)表示实体B在数据集中出现的概率。而P(A,B)则表示实体A和实体B同时出现在某个投诉网页上的概率。本文将计算K值并降序排列得出关联性最强的实体,主要代码如下:
    eef=open("../text/实体关联.txt",'r',encoding='UTF-8')ef=open("../text/高频词.txt",'r',encoding='UTF-8')kf=open("../text/实体关联排序.txt",'w',encoding='utf-8')#utf-8方式打开eedic={}edic={}eesdic={}line=eef.readline()while(line): text=line.strip('\n') eedic[(text.split()[0],text.split()[1])]=text.split()[2] #print(eedic) line=eef.readline()line=ef.readline()while line: text = line.strip('\n') edic[text.split()[0]] = text.split()[1] line=ef.readline()for i in eedic: eesdic[(i[0],i[1])]=int(eedic[i])*33526/int(edic[i[0]])/int(edic[i[1]])sort=sorted(eesdic.items(),key = lambda x:x[1],reverse = True)for i in sort: kf.write(str(i[0][0])+' '+str(i[0][1])+' '+str(i[1])+'\n') print(i)eef.close()ef.close()kf.close()
    接下来,本文将编写应用程序来展示实验的结果,该应用程序的功能是:用户通过在输入框内输入中文字符串,并点击搜索按钮,应用程序便将该字符串当作实体,返回与该实体相关的信息。本文使用了tkinter库来编写图形界面程序,该应用程序的主要代码如下:
    import tkinter as tkfrom tkinter import *file=open("../text/实体关联排序.txt",'r',encoding='UTF-8')dic={}#存放数据的字典line=file.readline()while(line): text=line.strip('\n') dic[(text.split()[0],text.split()[1])]=text.split()[2] line=file.readline()print(len(dic))delete=['客户']def searchEntity(text): for i in dic: if text==str(i[0]) and str(i[1]) not in delete: print(str(i[1])) strvar.set(str(i[1])) return elif text==str(i[1]) and str(i[0]) not in delete: print(str(i[0])) strvar.set(str(i[0])) return; print("NONE") strvar.set("NONE")def button(): t=search.get() searchEntity(t)def labelClear(): t=search.get()gui=tk.Tk()gui.title('基于投诉文本的知识图谱')gui.geometry('500x300+700+300')search=tk.Entry(gui)go=tk.Button(gui,text='GO',command=button)clear=tk.Button(gui,text='CLEAR',command=labelClear)strvar=StringVar()strvar.set("")label=tk.Label(gui,textvariable=strvar)search.pack()go.pack()label.pack(padx=5, pady=80)gui.mainloop()file.close()
    4.2 实验结果分析本小节将要分别展示:

    提取投诉文本;投诉文本分词以及停用词过滤并且提取高频词;实体相关性计算;搜索功能应用程序,这几个部分的结果。
    首先是投诉文本的提取,如图4.3所示:

    可以在上图中看出,用BeautifulSoup工具从苏州阳光12345网站的网页中提取投诉文本效果比较良好,基本完成了对投诉标题,投诉内容,以及投诉回复这几部分内容的提取,而且没有提取其他无关的内容。
    投诉文本的分词,停用词的过滤以及高频词的提取的结果如图4.4以及4.5所示:

    图4.4的第一列是分词结果,第二列是词频。上图显示用jieba分词工具分词,并且结合停用词表进行停用词过滤。导入自定义词,最后得出的高频词结果比较合理。过滤了无意义的英文词语,以及数字符号。

    图4.4的横轴代表前1500个高频词,纵轴代表这些高频词所对应的词频。该图显示了高频词的词频从高到低的变化:前200个词语的词频急速下降,而后面的词语的词频缓慢下降最终趋于平稳。
    根据公式(1),可以得出实体与实体之间的相关程度。本文将实体与实体序列按照它们之间的相关度从高到低排列,结果如图4.6以及图4.7所示:

    上图显示的是前15000个实体与实体序列的K值分布情况。该图显示:前面的一小段的K值下降十分迅速。随后K值趋于平稳。
    最后,本文展示搜索功能的应用程序,其界面如图4.8:

    在上图的输入框里输入中午字符串,应用程序得到相应结果。如图4.9:

    上图显示:当用户输入“非机动车”中文字符串时,应用程序将该字符串当作实体,返回与之相关的实体“机动车道”。
    当用户输入的字符串被当作实体后找不到相关联实体,应用程序结果如图4.10所示:

    4.3 实验评估本文的实验数据是33526个HTM格式网页。本文以图片的形式展示基于投诉文本的知识图谱结果。如图4.11。

    可以从上图看出,大体上基于文本的知识图谱中的实体关联比较准确。但是仍然存在一些关联度较低的实体组合被错误识别为高关联度等问题。这是本课题以后需要改进的方向。
    4.4 本章小结本章首先阐述了实验的整个流程步骤。接着进行具体的实验设计:

    用BeautifulSoup 工具提取投诉文本。该步骤的提取准确率高,为接下来的步骤奠定了良好的基础。用jieba分词工具对上一个步骤的文本数据进行分词,并使用停用词表对划分好的词语进行过滤,之后提取高频词语。使用matplotlib库,以直方图的形式展示高频的词语的词频分布。该步骤中,在被提取的高频词里仍然存在这一些没有实际含义的词语,比如在图4.4中,“一下”就是没有实际含义的词语。本文使用的停用此表没能很好的过滤。使用流水线方法进行实体识别和关系抽取。这种方法的编程语言实现较为简单但是准确率不高,容易出现累计错误问题。最后本文通过使用tkinter库编写应用程序,以视觉的方式展示了基于投诉文本的知识图谱的搜索应用。本章的最后进行实验评估,对33526个网页数据进行实体关系抽取,并用视觉方式展现结果。
    第五章 总结和展望5.1 课题总结联系具有普遍性。大数据时代下,如何把互联网上良莠不齐的数据联系起来成了一个热门的研究课题。而其中知识图谱技术便是一个很好的解决方案。知识图谱将互联网上的“字符串”当作实体,构建他们之间的关系。
    本文首先介绍课题的内容,任务,以及目标。接着,本文介绍课题的技术背景:第一是知识图谱的技术背景;第二是文本情感分析的技术背景。随后本文介绍搭建基于投诉文本的知识图谱的数据整理算法以及知识图谱提取算法。接下来,根据这些算法,并且结合诸如Beautiful Soup、jieba分词、matplotlib等等工具进行具体的实验,取得了预期的实验效果。
    5.2 课题展望虽然本课题实验取得了一定的效果,但是由于知识图谱构建技术正在发展之中,技术不是非常成熟。再加上个人对知识图谱构建和相关技术的理解并不十分深刻,以及课题研究时间紧迫等等原因。本文的相关工作目前仍然存在一定问题,下面详细阐述这些问题。
    一是停用词过滤效果不是十分理想,可能的原因是本文的数据属于特定主题:投诉类文本,而本文选择停用词表是通用停用词表。另一个可能的原因是本文的数据是网络数据,与书面类型的文本数据相比文法结构缺乏严谨。因为停用词过滤的效果较差,影响了后续部分的实验结果。一种可能有效的方法是使用两种类型的停用词表进行停用词过滤,一种表是投诉类型停用词表,另一种表是网络停词表。将这两个表结合起来可能会对来源于网络的,投诉类型的数据的停用词过滤有显著效果。
    二是在实体识别部分,本文采用的是流水线方法。该方法的实现较为简单,但是流水线方法存在很多问题:首先是准确率不高,因为流水线方法是将实体与实体两两组合,这样就出现了冗余,从而导致了较低的准确率。使用流水线方法的另一个弊端是算法执行效率低,也就是流水线方法的时间复杂度较高,为O(n2)。一种改进的方法是使用联合学习的算法。
    三是知识图谱程序的展示结果形式比较单一,不具备美观性。可以改进的措施是放弃使用应用程序,改用web页面展示结果。同时使用互联网上成熟的前端框架,保证页面的美观性。
    参考文献[1] Singhal A. Introducing theknowledge graph: things, not strings[J]. Official google blog, 2012.
    [2] sowa J F. Principles ofsemantic networks: Exploration in the representation of Knowledge[J]. FrameProblem in Artificial Intelligence, 1991(2-3):135–157.
    [3] Young D M. Pipelined method andapparatus for processing communication metering data: U.S. Patent 6,377,939[P].2002-4-23.
    [4] Pujara J, Miao H, Getoor L, etal. Knowledge graph identification[C]//International Semantic Web Conference.Springer, Berlin, Heidelberg, 2013: 542-557.
    [5] Pang B, Lee L. Opinion miningand sentiment analysis[J]. Foundations and Trends® in Information Retrieval,2008, 2(1–2): 1-135.
    [6] Young D M. Pipelined method andapparatus for processing communication metering data: U.S. Patent 6,377,939[P].2002-4-23.
    [7] Zheng, Suncong, et al.”Joint entity and relation extraction based on a hybrid neuralnetwork.” Neurocomputing 257 (2017): 59-66.
    致谢我要感谢我的指导老师,他所讲授的课程生动活泼。在课堂上,他深入浅出的授课风格给我留下了深刻的印象,激发了我对自然语言处理的兴趣。他对学生认真负责,每周都会组织一场例会,与我们探讨当前工作进展,并指出下一步的方向。在老师身上,我看到了我们大学优秀的师风师德。他是我学习的榜样,向他致敬!
    0 评论 3 下载 2018-09-26 12:43:25 下载需要6点积分
  • 基于Android的真人社交游戏辅助应用APP设计与实现

    摘 要时至今日,社交已成为人们生活中必不可少的一部分,社交网络的盛行已经成为一种必然趋势。与此同时,人们的娱乐化需求也越来越重要,游戏产业也得到了飞速发展。为了满足人们的社交化,娱乐化的需要,越来越多的公司开始结合社交和游戏,走社交和娱乐相辅相成的路线。在软件应用行业,也有越来越多的公司着手开发结合游戏的社交应用。
    本设计完成的应用为一款移动游戏社交应用,本设计根据软件设计的标准流程,从软件的需求分析、可行性分析着手,然后进行软件的总体设计和详细设计与实现,最后进行软件测试确保软件的功能能达到预期标准.本设计将软件开发划分为三大基本模块:服务器端,数据库端以及客户端.整个应用基于Java编程语言编写,其中服务器端再次细分为Java Web服务器和TCP Socket服务器,数据库端分为MYSQL数据库和SQLITE数据库,客户端基于Android平台开发,本应用的核心目标为:游戏与社交,实现的核心功能为:即时通信,游戏,社交。以实现核心功能为目的,再次将Android客户端分为两大部分:核心功能部分与附加功能部分,核心功能部分细分为四个模块:登录注册,消息中心,游戏中心,状态圈;附加功能部分也细分为四个模块:上传下载中心,用户中心,工具中心,设置中心。
    关键词:社交;游戏;即时通信;Android;服务器
    ABSTRACTToday, socialnetworking has become an indispensable part of people’s lives, the prevalenceof social networking has become an inevitable trend. At the same time, people’s entertainment needs moreand more important, the game industry has been rapid development. In order to meet people’s social, entertainmentneeds, more and more companies are beginning to combine socializing and games,take social and recreational complementary route. In the softwareapplication industry, there are more and more companies started to developbinding social game applications.
    In this paper,the final design is a social mobile recreation applications. This design follows the standard process ofsoftware design, the design start from the software requirements analysis andthe feasibility analysis, then begin designing the software, and developing thesoftware, finally testing the software, ensure that the software has reachedthe expectations. The development process of thissoftware is divided into three basic modules:the server,the database, and theclient. The entire software based on the Javaprogramming language, the server side is divided into two parts: The Java WebServer and the TCP Socket Server. The databaseside is also divided into two parts: The MYSQL database and the SQLITE database. The Client side is based on the Android platform. The core goal of this software: Sociality andRecreation. The main function of the software:Socaility, Recreation and Instant Message. In order toachieve the goal, The Android client is divided into two parts: Part of thecore functions and part of additional functions. The Core partis subdivided into four modules: The Login Register module, The Message Center,The Game Center and the State Center; The additional part is also subdividedinto four modules: The Upload and Download Center, The User Center, The ToolsCenter and the Setting Center.
    Keywords:Sociality; Recreation; Instant Message; Android; Server
    第1章 绪论1.1 引言社会在不断进步,科技在不断发展,随着历史的车轮缓缓前行,现今已悄然进入了移动互联网时代。在这个新的时代,社交网络,娱乐产业都趋于移动化,移动社交应用和移动游戏应用的出现也越来越契合时代的背景。
    1.2 课题的背景及意义移动社交应用,顾名思义是运行在移动终端上的社交应用,社交应用的核心就是社交网络,而社交网络以”六度空间”理论为基础,含盖以人类社交为核心的所有网络服务形式,社交网络让互联网从一个研究部门,学校,商业应用平台扩展成为了一个人类社会交流的工具。社交网络起源于网络社交,网络社交的起点就是电子邮件,随着互联网的普及应用与发展,网络社交也有了其它的形式,例如BBS的出现进一步推动了网络社交的发展。而后来的即时通信和博客的出现进一步的丰富了网络社交,就这样,随着网络社交的悄悄演进,特别是近年来移动网络作为一种新兴事务,得到了前所未有的深入和普及,手机平台应用越来越广泛,社交网络越来越趋于移动化,手机成为了新的社交网络的载体。在这种移动社交大环境下,移动社交应用成为了新的宠儿。
    近年来随着移动网络的发展,游戏娱乐方式也趋于移动化,移动游戏应用的出现契合时代的背景,特别是近年来手机游戏的迅速发展更是预示着移动游戏也将是将来的大方向。因此,在目前的移动游戏和社交快速发展壮大的背景下,开发出一款结合游戏的移动社交应用正能抓住时代的脉搏。
    本文旨在设计并开发出一款结合游戏和社交的移动游戏轻社交应用,应用主体定位为游戏和社交,即结合游戏与社交,与好友一起玩游戏,和共同游戏爱好的人成为好友。通过本应用认识更多的好友,扩大自己的社交圈子。
    1.3 国内外研究现状在国外,自从社交网络兴盛后,各种社交应用层出不穷,从2004年横空出世,并且取得巨大成功的Facebook,到2006年出现,并同样取得成功的Twitter,无不证明着社交网络的必然性。近年来,人们的娱乐化需求也越来越多,这时候,社交巨头也将市场瞄向了游戏领域,像Facebook里面就有着游戏中心,里面充斥着原生游戏或者是第三方开发的游戏,结合社交化,娱乐化,两者相辅相成。
    在国内,社交网络也潜力无限,被称为中国版Twitter的新浪微博,被比作中国版Facebook的人人网,它们一出现就取得了不错的成功,再到后来腾讯公司强势推出基于熟人社交的微信,再到靠细化定位,从夹缝中迅速成长的基于陌生人社交的陌陌,再到后来的一些其它半熟社交,陌生人社交应用,比如遇见,比邻等,再到最近依靠给图片打标签这个用户的强需求而迅速崛起的Nice,现今国内的社交领域已经是多个巨头并存的情况。
    而为了适应人们娱乐化的需求,很多社交巨头都开始结合游戏,娱乐化,推出了很多游戏社交功能,像陌陌和微信都有自己的游戏中心,人人也开始植入一些自制的或者第三方游戏应用。
    总体来说现在已经进入了一个移动游戏社交新时代。
    1.4 课题工作综述本论文的主要工作是,研究并设计开发出一款移动游戏轻社交应用,该应用包括的最主要的功能为用户的即时通信,社交以及游戏.研究的技术内容主要分为:

    JavaWeb技术和基于TCP的Socket技术,分别用来实现本应用的Web服务器端和Socket服务器端。Android应用开发,学习并精通Android技术,掌握良好的应用架构和开发流程.包括Android基础四大组件,不同组件之间的信息交互,常用UI的设计,多线程编程,不同进程和线程之间的交互,以及使用复用性和扩展性良好的设计模式等内容。数据库的学习与使用,包括学习并熟练掌握一些常用的SQL语句,能够使用常用数据库,MYSQL和SQLITE等,以及学会进行简单的数据库优化等内容。数据库与服务器以及客户端之间的交互,掌握不同代码之间的数据库调度接口,能够通过数据库实现代码中重要数据的持久化功能。网络编程,包括Socket服务器以及Android客户端之间通信数据的封装与解析、加密,以及Java Web服务器与客户端之间的HTTP请求,以及JSON解析等内容。
    1.5论文框架结构本论文总体分为六章,每一个章节及其对应内容作如下安排:

    第一章:简述移动游戏社交应用的研究背景,现状,以及介绍本文研究的主要内容和论文的组织结构第二章:介绍软件的需求分析第三章:介绍软件的总体设计过程第四章:介绍软件的具体实现过程第五章:介绍软件的测试过程第六章:总结本文的工作,展望未来
    第2章 需求分析需求分析是软件定义阶段的关键一步,也是软件生存周期中最重要的一步.通过它可以全面的了解整个系统的功能和结构方面的要求,然后在此基础上进行软件的设计。该部分的主要工作是确定系统必须完成哪些目标,也就是要对目标系统提出准确、清晰、具体、完整的要求。
    2.1 系统开发目标采用Java编程语言和使用Android平台以及与数据库技术相结合,开发出一个具有良好用户界面,功能齐全,运行稳定,交互性良好的移动游戏轻社交软件。本软件的定位为:游戏与社交,即通过本应用,用户可以通过玩同一款游戏来促进社交关系,可以直接与其他用户即时通信,也可以通过发表状态和评论来与其他用户交互,还可以通过查看附近的人,随机寻友来扩大自己的社交圈。
    2.2 用户需求分析开发一款软件,用户分析是必不可少的一个流程,因为软件最终面向的是用户,是需要用户来使用的,所以要从用户的角度分析,而用户的需求一般都有一些共同点:
    1.界面友好
    一款软件如果操作界面不友好,很容易让用户失去耐心,导致用户的流失.所以良好的交互界面是本软件的一个重要部分,这样可以增加用户黏性。
    2.操作简便
    用户很难愿意花费大量时间去学习如何使用一款软件,而且用户不是开发人员,程序的内部逻辑用户是不知道的,所以开发人员必须提供给一些封装好的便捷的操作接口来给用户使用。
    3.运行稳定流畅
    软件有可能在运行时出现不可预料的错误从而造成软件卡顿,崩溃.一款设计良好的软件必须避免这种情况,要避免用户体验差,造成一些用户对软件失去信心从而造成用户流失。所以软件的健壮性要强,要尽可能的将错误捕获,后台分析处理,一切都要站在用户的角度来看问题。
    2.3 功能需求分析一款软件的功能分析一般分为核心功能以及附加功能,核心功能是该软件的定位功能,是必不可少的功能,而附加功能一般是为了增加软件的可用性,以及用户体验而额外增加的功能.本软件的功能分析如下:
    2.3.1 核心功能本软件的定位是一款移动游戏轻社交应用,以游戏和社交为核心,要实现的核心功能为:
    1.用户注册登录
    一款网络应用登录注册是必不可少的功能,本软件的注册登录功能简洁明了,还包括手机短信验证,密码找回等一些便民服务。
    2.消息中心
    作为一款轻社交应用,要具备有社交通信功能,本软件的消息中心可以查看系统消息或者好友发送的消息,可以查看好友状态以及随时向好友发送消息,可以随时与其它用户通信,包括匿名通信,实名通信,还可以随机寻友和按照需求信息匹配好友,以及包括摇一摇寻友和附近的人等功能。
    3.游戏中心
    作为一款游戏轻社交应用,可以通过一起玩游戏来认识新的好友,与好友互动,所有游戏中心必不可缺,用户可以通过游戏中心,查看发布在服务器端的各种游戏信息,如果发现心动的游戏,可以通过下载中心下载该游戏,下载后的游戏作为第三方应用,可通过本应用直接打开,这样用户不仅可以玩到趣味的游戏,还可以晒晒游戏的积分,与好友一起竞赛。
    4.状态圈
    最为一款社交应用,状态圈功能必不可少,在这里,可以查看自己或者朋友发的状态,包括发送状态,管理自己状态,点赞,评论等功能。
    2.3.2 附加功能一款软件除了必备的核心功能外还应该拥有额外的附加功能,这样可以增强用户体验,本软件的一些附加功能如下:
    1.下载上传中心
    作为一款完整的网络应用,必不可免的会从网上下载各种内容,或者是上传自己的资料到服务器,所以本应用为了方便使用,直接内嵌一个下载上传中心,该本应用下载或上传都会使用本应用内置的中心,这样既方便又便捷。还可以断点多线程下载上传,自定义下载路径,自定义上传文件。
    2.工具中心
    最为一款用户体验好的应用,应该包含一些便民服务,本应用中包含的功能有:

    自定义皮肤功能,用户可以自定义应用的界面背景以及标题栏背景定位功能,随时实地知晓自己身处何处
    3.用户中心
    除了最简单的登录注册功能,还应该提供给用户更多的操作控件,本应用就包含了用户中心,里面包括一些用户会经常使用的功能,比如查看个人详细信息,修改用户资料,修改密码,反馈意见等功能.还包括积分处理功能,本应用中每个用户都有一个积分属性,通过做任务可以获取积分,比如下载游戏,摇一摇签到等操作会增加积分,当积分累计到一定值后可以进行消费,例如可以用一定的积分进行幸运大轮盘抽奖,有一定概率获取VIP或者其它奖品,或者可以消耗大量积分直接成为VIP,成为VIP后可以开启更多功能。积分功能可以增加用户黏性,增加应用的生存周期。
    4.设置中心
    一款良好应用应该允许用户自定义一些设置,本应用用户可以在设置中心根据自己的喜好进行一些应用的功能设置,比如通过设置中心,用户可以选择是否开启应用悬浮窗口,可以选择是否开启消息提醒功能,可以清除缓存和聊天信息,以及查看软件的版本特性,进行版本更新等。
    2.4 可行性分析软件的可行性分析决定着这个软件是否能够最终完成,做软件的可行性分析不能以偏概全,也不可以对各种细微末节都加以权衡,可行性分析必须为最终决策提供有价值的证据。在此,主要从技术可行性以及经济可行性方面进行分析。
    2.4.1 经济可行性这要进行成本、效益分析.从成本方面看,本应用的实现,计算机设备以及网络硬件已经拥有,Android是一个开放的平台,所用的开发工具Eclipse是免费的,所用到的数据库MYSQL也是免费的,一些用到的SDK比如AndroidSDK以及MobSDK,百度SDK都是免费的,没有额外开发人员,只需要支付一个网络公网服务器的租用费用即可,因此开发成本低廉;从效益方面看,目前版本暂时不会带来经济收益,不过从长远角度看,经过完善后可以作为一款完成的商用产品推广,加上Android系统的广泛,市场的开发空间较大,从这个角度看,该应用可行。
    2.4.2 技术可行性本应用基于Java编程语言开发,采用C/S网络架构,服务器端采用Socket服务器和Web服务器的多个服务器架构,客户端基于Android平台实现,服务器端采用MYSQL免费数据库,开发工具使用Eclipse配AndroidSDK以及Eclipse配JavaEE,以上都具有开放性和免费性,因此网络上存在着大量参考资料以及无数前辈高人,而开发人员又具有一定程序功底,学习能力较强,可以迅速较快掌握关键技术,而且此系统的初始版本并不是以盈利为目的,所以开发周期可以相对较长,由此分析,能够最终完成产品。因此,该应用在技术上可行。
    2.5 本章小结本章详细探究了移动游戏轻社交应用的需求分析和可行性分析,完成了用户需求、软件的功能需求以及内容设计等方面的工作。
    第3章 总体设计总体设计是开发软件时,根据需求分析和可行性论证,对系统进行整体设计,为系统确定整体框架结构的过程。
    本应用为一款移动游戏社交应用,核心内容为游戏,社交,总体设计围绕着核心内容,具体分为:

    核心功能:登录注册,状态圈,游戏中心,消息中心
    次要功能:工具中心,上传下载中心,用户中心,设置中心

    3.1 概要设计本应用是一款完整的网络应用,包括客户端,服务器以及数据库,为了将模块功能细分,将其中的数据库部分又细分为客户端数据库(MYSQL)与服务区端数据库(SQLITE),服务器端的实现也再次细分为Web服务器与Socket服务器。总体结构如图3.1所示。

    3.2 Socket服务器的设计Socket服务器用来管理用户,处理一些私密信息,主要分为四个模块,即监听客户端请求(包括注册,登录等请求),用户状态管理(包括记录用户登入登出状态,踢人,删除用户),消息管理(包括转发用户消息和离线存储以及推送系统的消息),其它模块(包括记录系统日志等功能),其结构如图3.2所示。


    用户状态管理模块,包括记录用户登入登出状态,删除用户,剔出用户等消息管理模块,处理用户发送的消息,转发或者离线存储,并推送系统消息监听客户端请求,监听客户端的请求,包括用户登录,注册,修改密码等较为隐私的功能其它模块,包括记录系统日志等
    3.3 Web服务器的设计Web服务器用来接收客户端的上传数据以及提供数据给客户端下载,还有提供一些查询功能,主要分为五个模块,即上传文件,下载文件,查询数据,更新用户信息,以及用户发表状态,其系统总结构图如图3.3所示。


    用户模块,更新用户信息,发表状态,评论,用户反馈查询模块,用户查询信息上传模块,上传文件,会上传的记录保存,并保存上传后在服务器端的下载路径下载模块,从Web服务器端下载对应的数据其它模块,更新版本
    3.4 客户端的设计根据功能需求分析,本应用的客户端细分为九个模块,即登录注册,消息中心,游戏中心,下载上传中心,状态圈,工具中心,用户中心,设置中心,其系统总结构图如图3.4所示。

    3.4.1 登录注册的设计登录注册模块要能够处理用户的登录,注册基本功能,还需要包括短信验证,密码找回等功能,其功能如图3.4.1所示。

    3.4.2 消息中心的设计消息中心模块可以查看系统消息或者好友发送的消息,可以查看好友状态以及随时向好友发送消息,可以随时与其它用户通信,包括匿名通信,实名通信,还可以随机寻友和按照需求信息匹配好友,以及包括摇一摇寻友和附近的人等功能.其功能如图3.4.2所示。

    3.4.3游戏中心的设计游戏中心模块里面可以查看服务器端所有发布的游戏和用户已下载的游戏,并通过游戏中心可以打开已下载的第三方游戏应用,也可以在游戏中心里随机找寻一些热门游戏,可以选择下载心动的游戏,甚至可以通过相同的游戏爱好匹配好友,其功能如图3.4.3所示。

    3.4.4 上传下载中心的设计上传下载中心,包括了上传功能与下载功能,可以通过下载中心下载服务器端发布的游戏或者其它资源,可以通过上传中心上传用户自己的文件,其功能如图3.4.4所示。

    3.4.5 状态圈设计状态圈里可以查看自己或者朋友发的状态,包括发送状态,管理自己状态,点赞,评论等功能。其功能如图3.4.5所示。

    3.4.6 工具中心的设计工具中心里有着便民工具,包括摇一摇定位,自定义皮肤等功能,其功能如图3.4.6所示。

    3.4.7 用户中心的设计用户中心包括一些用户会经常使用的功能,比如查看个人详细信息,修改用户资料,修改密码,反馈意见等功能,还包括摇一摇签到,升级会员等功能.其功能如图3.4.7所示。

    3.4.8 设置中心的设计设置中心可以对应用的一些基本信息进行设置,比如用户可以选择是否开启应用悬浮窗口,可以选择是否开启消息提醒功能,可以清除文件缓存以及消息历史记录(包括聊天记录),以及查看软件版本信息,进行版本更新等。其功能如图3.4.8所示。

    3.5数据库的设计一般在数据库设计中,最先设计的是概念模型,一般采用实体-联系图,即E-R图来描述概念模型,本应用中的实体联系图的实体主要包括用户,消息,定位信息,签到记录,游戏,用户游戏积分,反馈信息,状态日志,评论,上传信息,下载信息等实体。其中用户和消息是一对多的关系;用户和定位信息之间是一对多关系;用户和签到记录之间是一对多的关系;用户和用户反馈信息之间是一对多的关系;用户和游戏是一对多的关系;用户和用户的游戏积分之间是一对多的关系;游戏和用户游戏积分是一对多的关系;用户和状态日志是一对多的关系;用户和评论是一对多的关系;状态日志和评论是一对多的关系;用户和上传文件信息之间是一对多的关系;用户和下载信息是一对多的关系。实体联系图如图3.5所示。

    设计概念模型之后需要进行功能设计,本应用数据库的功能设计分为客户端端数据库部分和服务器数据库部分。
    3.5.1 服务器端数据库功能设计服务器端使用免费开源的MYSQL数据库,整个数据库分为几个模块,即用户模块(包括用户信息,好友关系,发状态,评论,签到,用户反馈),消息模块(包括用户消息与系统消息),游戏模块(包括游戏列表,游戏用户表,用户游戏积分表,游戏下载信息表),定位模块(包括用户的定位信息),其它模块(包括系统版本信息),其系统总结构如图3.5.1所示。

    1.用户模块设计
    一个应用是围绕着用户来的,所以用户模块很重要,这里用户模块的结构如图3.5.1.1所示。

    2.消息模块设计
    消息模块目前主要是包括一个消息表,作用是当用户不在线时,用来存储系统和别的用户发送的离线消息,上线后再从消息表中获取未读取的消息。
    2.游戏模块设计
    本应用是一个游戏社交游戏,所以有游戏模块,游戏模块的结构如图4.5.1.3所示。

    4.定位模块设计
    定位模块目前主要是包括用户的定位信息,包括一个定位信息表,比如当使用附近的人功能时,会从定位信息表中读取其它用户的定位信息,经过计算后按照一定的条件匹配。
    5.其它模块设计
    目前其它模块包括了一个版本信息表,客户端进行版本更新时判断版本信息表,如果符合升级版本条件,那么就重新下载新版本的内容,更新版本。
    3.5.2 客户端数据库功能设计客户端使用Android自带的轻量级的SharedPreferences来保存一些常用配置,以及使用Android自带的SQLITE数据库来持久化一些数据。

    Shared Preferences,采用XML的轻量级存储方法,用来保存一些基本配置,例如皮肤选择路径,应用的设置信息等。SQLITE,用来持久化数据,主要分为几大模块,即用户信息模块(用来存储好友信息),消息模块(包括持久化用户的聊天记录等功能),上传下载记录模块(用来记录用户的上传下载信息,以及记录断点下载的进度和状态),结构如图3.5.2.2所示。

    3.6 本章小结本章详细说明了本应用的各个功能模块的设计,对整个系统的开发进行了精确的定位。
    第4章 详细设计与实现详细设计是对总体设计的一个细化,详细实现是对每一个模块的功能进行实现的流程。
    4.1 系统主体根据总体设计,本应用包括Android客户端,Web服务器端和Socket服务器端,以及MYSQL数据库和SQLITE数据库.系统主体流程如图4.1所示。

    4.2 Web服务器本应用采用了Java Web服务器,运行环境是Tomcat容器,Web服务器是运行在Tomcat配置所在的端口,客户端通过HTTP协议访问运行于Tomcat容器上的Web程序,每一次连接都是由客户端主动请求的,Web服务器的处理流程如图4.2所示。

    4.3 Socket服务器本应用还采用了Socket服务器,不同于Web服务器,Socket可以管理客户端,每一个客户端都必须先与服务器端建立联系才能进行命令请求,每一个Socket服务器都需要绑定一个监听端口,等待这客户端的连接。
    4.3.1 Socket服务器与客户端的连接建立本应用采用的是基于TCP/IP协议的Socket,建立流程如图4.3.1所示。

    4.3.2 Socket服务器处理流程Socket服务器处理流程如图4.3.2所示。

    4.4 客户端根据总体设计,本应用的客户端可以细分为八大模块.核心功能为前四个模块,后四个模块为一些附加功能。
    4.4.1 登录注册模块该模块主要负责处理用户的注册,登录,以及找回密码功能,处理流程如图4.4.1所示。

    4.4.2 消息中心模块该模块主要处理即时通信,以及社交交友功能,包括添加好友,好友管理,处理好友申请,发送消息,查看系统消息,摇一摇寻友,以及查看附近的人等功能。处理流程如图4.4.2所示。

    4.4.3 游戏中心模块该模块主要负责寻找并下载服务器端的游戏,管理游戏,以及根据游戏社交等功能。处理流程如图4.4.3所示。

    4.4.4 状态圈模块该模块主要是负责管理用户的状态,包括发表状态,删除状态,评论,点赞等功能.处理流程如图4.4.4所示。

    4.4.5 上传下载中心模块该模块主要负责管理上传下载任务以及任务历史,处理流程如图4.4.5所示。

    4.4.6 工具中心模块该模块里面主要是为了丰富应用功能而添加的一些额外的扩充功能,包括摇一摇定位,自定义皮肤和幸运大轮盘抽奖功能,流程如图4.4.6所示。

    4.4.7 用户中心模块
    该模块的功能是围绕用户而来的,包括摇一摇签到,成为VIP,提交反馈,修改隐私密码,以及查看和更新用户基本资料等功能,处理流程如图4.4.7所示。

    4.4.8 设置中心模块该模块负责自定义应用设置功能,包括查看版本信息和更新应用版本,清理缓存和清理历史消息记录,以及一些其它的应用自定义设置功能.处理流程如图4.4.8所示。

    4.5 数据库数据库结构设计分为服务器端MYSQL数据库和客户端SQLITE数据库.
    4.5.1 服务器端数据库服务器端的数据表结构设计。
    1.用户表



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增主键
    Int
    0





    phoneNumber
    手机号
    Varchar
    20





    icgId
    IcgId号
    Varchar
    30





    password
    密码
    Varchar
    30





    access
    权限
    Int
    0





    star
    星级
    Int
    0





    vip
    Vip等级
    Int
    0





    coin
    金币
    Int
    0





    partGameNumber
    参与游戏个数
    Int
    0





    nickName
    昵称
    Varchar
    30





    iconPath
    图像路径
    Text
    0





    sex
    性别
    Int
    0





    qrCodePath
    二维码路径
    Text
    0





    birthYear
    出生年
    Int
    0





    birthMonth
    出生月
    Int
    0





    birthDay
    出生日
    Int
    0





    email
    邮件
    Varchar
    30





    sign
    签名
    Text
    0





    netState
    在线状态
    Int
    0





    provinceId
    省份编码
    Varchar
    10





    cityId
    城市编码
    Varchar
    10





    createTime
    创建时间
    DateTime
    0





    modifyTime
    修改时间
    DateTime
    0





    2.游戏表



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    gameId
    游戏Id自增主键
    Int
    0





    gameName
    游戏名称
    Text
    0





    type
    游戏类型
    Int
    0





    detailInfo
    详细介绍
    Text
    0





    iconPath
    图像路径
    Text
    0





    createTime
    创建时间
    DateTime
    0





    modifyTime
    修改时间
    DateTime
    0





    3.消息表
    其中senderPhone和receiverPhone都是用户表里的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    senderPhone
    消息发送者手机号
    Varchar
    20





    receiverPhone
    消息接收者手机号
    Varchar
    20





    type
    消息类型
    Int
    0





    msg
    消息内容
    Text
    0





    createTime
    创建时间
    DateTime
    0





    4.好友关系表
    其中masterPhone和friendPhone都是用户表里的外键引用,而且这两者的组合是一个唯一约束。unique Key (masterPhone,friendPhone)。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    masterPhone
    所属人手机号
    Varchar
    20





    friendPhone
    好友手机号
    Varchar
    20





    createTime
    创建时间
    DateTime
    0





    5.定位信息表
    其中masterPhone是用户表里的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    masterPhone
    所属人手机号
    Varchar
    20





    longtitude
    经度
    Double
    0





    latitude
    纬度
    Double
    0





    detailAddress
    详细地址
    Text
    0





    createTime
    创建时间
    DateTime
    0





    6.游戏用户表
    这个表是记录了每一个游戏的用户参与情况,其中participantPhone是用户表里的外键引用。masterId是游戏表里的外键引用,而且这两者的组合是一个唯一约束,unique Key (masterId,participantPhone)。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    masterId
    所属游戏Id
    Int
    0





    participantPhone
    参与者手机号
    Varchar
    20





    createTime
    创建时间
    DateTime
    0





    modifyTime
    修改时间
    DateTime
    0





    7.游戏用户积分表
    每创建一个游戏,就会根据该游戏对应的属性创建一个游戏用户积分表,测试版本只创建了一个ClickGame用户积分表。这个表是记录了每一个用户的具体属性,其中participantPhone是用户表里的外键引用,masterId是游戏表里的外键引用,而且这两者的组合是一个唯一约束,unique Key (masterId,participantPhone)。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    masterId
    所属游戏Id
    Int
    0





    participantPhone
    参与者手机号
    Varchar
    20





    createTime
    创建时间
    DateTime
    0





    modifyTime
    修改时间
    DateTime
    0





    nickName
    游戏昵称
    Varchar
    20





    score
    游戏积分
    Int
    0





    normalSpeed
    平均点击速度
    Float
    0





    maxSpeed
    最大点击速度
    Float
    0





    8.用户反馈表
    这个表记录着每一个用户的反馈信息,用户可以匿名。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    masterContact
    反馈人联系方式
    Varchar
    20





    createTime
    创建时间
    DateTime
    0





    masterName
    反馈人昵称
    Varchar
    20





    content
    反馈信息
    Text
    0





    9.用户状态表
    这个表记录着每一个用户发表的状态信息,这里定义每一条状态最多发表6张图片,用户上传包含图片的信息时,服务器端会将图片保存在服务器本地地址,然后将图片地址存入数据库,其中masterPhone是用户表中的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    masterPhone
    所属人手机号
    Varchar
    20





    createTime
    创建时间
    DateTime
    0





    content
    文字内容
    Text
    0





    imgOne
    第一张图片路径
    Text
    0





    imgTwo
    第二张图片路径
    Text
    0





    imgThree
    第三张图片路径
    Text
    0





    imgFour
    第四张图片路径
    Text
    0





    imgFive
    第五张图片路径
    Text
    0





    imgSix
    第六张图片路径
    Text
    0





    10.用户评论表
    这个表记录着每一个用户发表的评论信息,其中commentMasterPhone是用户表中的外键引用,diaryId是状态表中的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    diaryId
    所属状态Id
    Int
    0





    commentMasterPhone
    评论发表人的手机
    Varchar
    20





    commentContent
    评论的内容
    Text
    0





    createTime
    创建时间
    DateTime
    0





    11.用户签到表
    这个表记录着每一个用户的签到信息,其中masterPhone是用户表中的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    masterPhone
    签到人的手机
    Varchar
    20





    content
    评论的内容
    Text
    0





    createTime
    创建时间
    DateTime
    0





    longitude
    签到的经度
    Double
    0





    latitude
    签到的纬度
    Double
    0





    detailAddress
    签到的详细地址
    Text
    0





    12.用户上传信息表
    这个表记录着每一个用户的签到信息,其中masterPhone是用户表中的外键引用。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    masterPhone
    签到人的手机
    Varchar
    20





    filePath
    上传后的文件所在路径
    Text
    0





    createTime
    创建时间
    DateTime
    0





    fileName
    上传后的文件名字
    Varchar
    20





    detail
    详细信息介绍
    Text
    0





    13.版本信息表
    这个表记录着应用的版本信。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增Id
    Int
    0





    versionName
    版本名称
    Varchar
    20





    versionCode
    版本代码
    Varchar
    20





    apkPath
    应用所在路径
    Text
    0





    detail
    详细信息介绍
    Text
    0





    4.5.2 客户端数据库客户端的数据表结构设计,采用Sqlite数据库。
    1.上传下载任务表
    这个表记录所有的上传和下载任务信息。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    _id
    自增Id
    Integer
    0





    task_name
    任务名称
    Varchar
    20





    updownload_url
    上传路径或者下载路径
    Varchar
    60





    file_path
    上传文件或者下载接收文件
    Varchar
    60





    file_size
    文件总大小
    Integer
    0





    complete_size
    完成大小
    Integer
    0





    type
    类型,上传还是下载
    Integer
    0





    finished
    是否完成标识
    Integer
    0





    2.上传下载详细信息表
    上传下载使用多线程断点,这个表记录每一个上传和下载任务的线程详细信息。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    _id
    自增Id
    Integer
    0





    thread_id
    线程Id
    Integer
    0





    start_pos
    开始位置
    Integer
    0





    end_pos
    结束位置
    Integer
    0





    complete_size
    完成大小
    Integer
    0





    complete_size
    完成大小
    Integer
    0





    type
    类型,上传还是下载
    Integer
    0





    updownload_url
    上传或下载路径
    Varchar
    60





    3.用户信息表
    为了节省网络请求数据量,Android客户端会在本地存储一些常联系的用户的信息。(不包括隐私信息)



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    id
    自增主键
    Integer
    0





    phoneNumber
    手机号
    Varchar
    20





    icgId
    IcgId号
    Varchar
    30





    access
    权限
    Integer
    0





    star
    星级
    Integer
    0





    vip
    Vip等级
    Integer
    0





    coin
    金币
    Integer
    0





    partGameNumber
    参与游戏个数
    Integer
    0





    nickName
    昵称
    Varchar
    30





    iconPath
    图像路径
    Text
    0





    sex
    性别
    Integer
    0





    qrCodePath
    二维码路径
    Text
    0





    birthYear
    出生年
    Integer
    0





    birthMonth
    出生月
    Integer
    0





    birthDay
    出生日
    Integer
    0





    email
    邮件
    Varchar
    30





    sign
    签名
    Text
    0





    netState
    在线状态
    Integer
    0





    provinceId
    省份编码
    Varchar
    10





    cityId
    城市编码
    Varchar
    10





    4.离线聊天信息表
    客户端会为每两个用户之间的聊天记录创建一个聊天信息表,方便查询历史记录,使用两个用户的手机号作为一部分表名字,例如”chatInfo手机1手机2”作为表名。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    _id
    自增Id
    Integer
    0





    isCome
    是否接收的消息
    Integer
    0





    state
    发送状态,发送中还是发送完毕
    Integer
    0





    message
    聊天内容
    Text
    0





    date
    消息发送的时间
    Text
    0





    5.离线列表消息表
    客户端存储一些消息在本地,作为消息记录,例如存储系统通知,存储好友申请等消息。



    字段名
    描述
    类型
    长度
    是否唯一
    是否允许为空
    是否主键




    _id
    自增Id
    Integer
    0





    senderPhone
    消息发送人手机号
    Varchar
    20





    receiverPhone
    消息接受人手机号
    Varchar
    20





    message
    消息内容
    Text
    0





    type
    消息类型
    Integer
    0





    IsReaded
    是否已经读取
    Integer
    0





    isHandled
    是否已经处理
    Integer
    0





    date
    消息发送的时间
    Text
    0





    4.6 本章小结本章根据软件的总体设计,详细设计每一个模块的逻辑功能以及运行流程。
    第5章 软件测试软件测试是保证软件质量和可靠性的关键步骤,正所谓没有不出Bug的程序,而软件测试的目的之一也是为了发现错误,成功的测试是发现至今尚未发现的错误。软件测试的另一个目的就是确保测试的软件的功能和设计的效果吻合,这里软件测试的内容主要包括功能测试、整体测试和兼容性测试三项。测试环境如表5.1所示。



    软件环境(软件的版本信息)




    JDK:1.7


    Android SDK:3.0


    编程软件:Eclipse


    硬件环境(硬件设备信息)


    手机:Lenovo K860


    内存:1024 M


    系统:Android 4.0.4



    5.1 功能测试功能测试也称为黑盒测试,是用来测试软件的功能是否完整,各项功能是否与预期相符等,本应用的单独进行每一个模块的功能测试。
    5.1.1 登录注册模块本模块的功能测试如表5.1.1所示。



    测试功能
    目标
    测试方法
    预期结果
    结论




    登录功能
    客户端可以通过GPRS或WIFI登录服务器
    在登录界面输入帐号信息登录
    成功登录服务器并提示客户端操作成功
    正确完成


    注册功能
    客户端可以注册新的用户
    在注册页面根据提示信息输入信息注册
    成功注册新的用户并登录
    正确完成


    找回密码
    用户成功通过短信验证后可以重置密码
    在找回密码界面获取短信验证码,并验证
    短信验证成功后会打开一个重置密码界面
    正确完成



    界面如图5.1.1所示。

    5.1.2 消息中心模块本模块的功能测试如表5.1.2所示。



    测试功能
    目标
    方法
    期望结果
    结论




    发送消息
    可以发送消息给选中好友
    向一个选中好友发送消息
    好友收到消息
    正确完成


    添加好友
    可以查找并添加好友
    通过简单查找或者详细查找,向查找到的人发送好友申请
    目标的用户能收到好友申请
    正确完成


    处理好友申请
    可以接受或者拒绝他人的好友申请
    在消息中心里选择好友申请消息,并处理
    选择接受或者拒绝后都会产生相应的效果
    正确完成


    查看系统消息
    可以接收到并查看系统消息
    服务器端向客户端推送消息
    消息中心可以接收系统的推送消息并查看
    正确完成


    删除好友
    能够将好友从好友列表中移除
    选择好友列表中的好友然后点击删除
    好友成功的被删除
    正确完成


    随机寻友
    可以打开一个随机寻友界面,以卡片形式显示一些好友
    消息中心里面点击随机寻友按钮
    进入随机寻友界面,并以卡片形式显示所有找到的用户
    正确完成


    摇一摇
    摇一摇后随机找寻好友
    使用摇一摇
    摇一摇后能够成功的找到新的用户
    正确完成


    附近的人
    查看附近地点的用户
    查看附近的人
    能够显示正在附近的用户
    正确完成



    界面如图5.1.2所示。

    5.1.3 游戏中心模块本模块的功能测试如表5.1.3所示。



    测试功能
    目标
    方法
    期望结果
    结论




    管理已有游戏
    可以管理已经下载的游戏,包括打开,删除,评价,分享功能
    选择已经下载的游戏进行管理操作
    打开,删除,评价,分享功能都可用
    正确完成


    下载游戏
    可以通过游戏中心下载服务器端游戏
    在游戏中心寻找一款测试游戏并点击下载
    成功下载游戏
    正确完成


    随机找寻游戏
    可以打开一个随机寻找游戏界面,以卡片形式显示游戏
    游戏中心里使用随机寻找游戏功能
    进入随机寻找游戏界面,并以卡片形式显示找到的游戏
    正确完成


    找寻同类用户
    可以找寻到拥有同样游戏的用户
    游戏中心里选择找寻相同爱好用户的功能
    成功找到拥有同样游戏的其他用户
    正确完成



    界面如图5.1.3所示。

    5.1.4 状态圈模块本模块的功能测试如表5.1.4所示。



    测试功能
    目标
    方法
    期望结果
    结论




    发表状态
    能够发表自己的状态
    发表新的状态
    发表状态成功,并能显示
    正确完成


    删除状态
    能够删除自己已发表的状态
    选择自己的已发状态并删除
    成功删除状态
    正确完成


    点赞
    可以给已发表的状态点赞
    选择一条已发状态并点赞
    点赞成功
    正确完成


    评论
    可以评论已发表的状态
    选择一条已发状态并评论
    评论成功
    正确完成



    界面如图5.1.4所示。

    5.1.5 上传下载模块附加模块之一,本模块的功能测试如表5.1.5所示。



    测试功能
    目标
    方法
    期望结果
    结论




    管理正在进行的任务
    能够管理正在进行的任务,包括暂停,下载,重新下载,删除,清除所有任务功能
    选择一条正在进行的任务并操作
    操作成功,产生对应的效果
    正确完成


    管理任务历史
    能够管理任务历史,包括删除,重新下载,清空所有历史功能
    选择一条任务历史并操作
    操作成功,产生对应的效果
    正确完成



    界面如图5.1.5所示。

    5.1.6 工具中心模块附加模块之一,本模块的功能测试如表5.1.6所示。



    测试功能
    目标
    方法
    期望结果
    结论




    摇一摇定位
    摇一摇并能定位到自己的未知信息
    选择摇一摇定位
    成功定位到用户的信息
    正确完成


    自定义皮肤
    可以DIY背景和标题
    选择自定义皮肤功能
    成功更换了背景和标题
    正确完成


    幸运大轮盘
    可以进行轮盘抽奖功能
    选择幸运大轮盘功能
    成功的抽奖,并产生结果
    正确完成



    界面如图5.1.6所示。

    5.1.7 用户中心模块附加模块之一,本模块的功能测试如表5.1.7所示。



    测试功能
    目标
    方法
    期望结果
    结论




    摇一摇签到
    摇一摇并能签到获取积分
    选择摇一摇签到
    成功签到并获取积分
    正确完成


    升级会员
    可以通过积分换取会员或者其它途径升级会员
    选择升级会员
    升级会员成功
    正确完成


    修改密码
    可以修改隐私密码
    选择修改密码
    修改密码成功
    正确完成


    修改个人资料
    可以查看并修改个人的基本资料
    用户中心里点击用户资料的编辑功能
    成功更新个人基本信息并可以显示
    正确完成



    界面如图5.1.7所示。

    5.1.8 设置中心模块附加模块之一,本模块的功能测试如表5.1.8所示。



    测试功能
    目标
    方法
    期望结果
    结论




    更新版本
    能够连接服务器检查并更新最新版本
    选择更新版本
    如果存在最新版本,则下载并重新安装
    正确完成


    自定义应用设置
    可以DIY应用的不同设置
    手动更换多种不同的应用设置组合
    每一种应用设置都能生效
    正确完成


    清理缓存
    可以清除文件缓存
    选择清理缓存
    成功删除所有缓存
    正确完成


    清理消息记录
    可以清除消息历史记录
    选择清理消息记录
    成功删除所有消息记录
    正确完成



    界面如图5.1.8所示。

    5.2 整体测试游戏的定位为游戏与社交,整体测试就是用户使用软件的流程测试,软件运行的主体流程如图5.2.1所示。

    主要操作界面如图5.2.2所示。

    5.3 兼容性测试兼容性测试是为了测试软件在不同型号手机和不同的系统版本上是否能顺利运行,本应用的最低要求运行版本为Android3.0,因此,测试设备的基本要求为系统高于Android 3.0,通过该测试证明软件能够运行在不同版本不同型号的设备上,体现了软件的适应性以及可移植性。本软件在不同设备上的运行结果如表5.2所示。



    手机名称
    Android版本
    兼容性




    Lenovo K860
    Android 4.0.4
    兼容


    MI 4LTE-CU
    Android 4.44
    兼容



    5.4 本章小结本章先对软件进行了功能测试,确保软件的功能都已实现,然后进行整体测试,确保软件整体运行良好,最后进行兼容性测试,证明软件兼容性良好,与预期的基本相符。
    第6章 结论与展望6.1 结论6.1.1 毕业设计完成的任务本软件的开发根据一个软件的生命周期分为多个阶段进行,首先提出了软件,并确立了软件的实现目标以及意义,然后根据软件的详细需求分析,将软件的功能进行模块划分,并进行了软件的可行性分析,然后对软件进行了一个总体设计,将软件划分成各个多个模块,并确定了每一个模块的功能结构,之后根据总体设计对软件进行详细的设计,确定软件每一个模块的具体的实现以及各个模块之间的处理流程,最后进行了软件测试,确认已经达到可预期的目标.最终的结果为,软件的各个模块功能均已实现,测试也已通过,软件可以完成初期的目标:一个移动游戏社交应用,用户可以通过该应用玩游戏,即时通信,交朋友扩大自己的社交圈子。
    6.1.2 收获和总结在完成毕设的这段时间里,受益匪浅。从最开始对Android以及Java技术的生疏以及不懂,到最后能够娴熟使用技术完成自己的目标,之间有彷徨过,悲观过,但最终还是坚持了下来,困难不可怕,只要你能勇敢面对,直视问题,最终你一定能够克服它.而且只有不断的遇到问题,并解决问题,才能快速的提升自己的水平,在这次毕设过程中,我遇到了很多问题,也解决了很多问题,最终,经过自己的不懈努力,我的技术水平得到了飞跃,我成功的完成了以前想都不敢想的目标。我也总结了一些经验,启示:

    不能畏难,人总是害怕面对自己不会的,未知的东西,但是其实只有选择面对未知,并且收获未知,才能够更大的提升自己的水准.我在准备毕业设计时,还没有任何的Android和Java开发经验,但是我选择相信自己,于是经过几个月的自学,我从一个连入门级都没到的新手成功的达到了现在的水准,至少现在我能够轻松的开发很多Android应用了,而且毕设的整个工程的代码量除去注释也在三万行以上,这在我以前是想都不敢想的。一定要先定好规划然后在执行,在做任何事情,一定要先做好规划,千万不能盲目.做软件开打的一定得先做好设计,磨刀不误砍柴工.像我在做毕设的时候,由于没有经验,所以是没有先做好全局设计,所以导致开发过程中屡屡受阻,经常重新设计数据库和各种实体类,甚至还会经常修改每个模块的功能,大大的浪费了精力和时间。要学会请教他人,一个人的力量终究有限,而且思想的碰撞经常容易擦除灵感的火花,所以要善于请教他人,比如我在刚开始做毕设那会特别要强,总是想一个人解决所有问题,结果事倍功半,后来学会去开源论坛上请教一些前辈大牛,才发现自己所思考的问题原来这么局限,所以后来就开始和其它技术人员讨论请教,事半功倍,事实证明,他人和容易发现自己的思想盲点。要勇于探新,一个人不能守旧,要永远的向最前沿看起,守旧意味着后退,就像是闭关锁国,最终只能是自己被淘汰,所以我们应该主动去学习接收新的知识,并且快速掌握它们,只有这样我们才能不被时代所淘汰,永远的站在时代的最前沿。
    6.2 不足之处及未来展望尽管本应用实现了一个移动游戏社交应用的基本功能,但是由于时间仓促,还有很多不足之处和一些需要解决的问题,包括UI界面设计感不够,功能的实现不够彻底,安全性不足等问题,对未来的工作可以进行以下几点展望:

    丰富即时通信内容,增加发送图片和语音的功能扩充社交功能,增加用户群组功能,增加地图功能,增加更多的用户兴趣选项,可以根据兴趣社交 增加游戏性,扩充更多合理的游戏,优化游戏中心的功能,吸引更多用户增加用户来源,增加第三方应用的关联,比如关联QQ,新浪,人人等账号增加安全性,将HTTP协议改为HTTPS协议更为安全,采用更加安全的加密措施增加OAUTH认证,能够提供API供第三方应用使用优化网络,提高服务器稳定性,合理分配网络请求,降低客户端的流量消耗优化UI界面,增加交互感,更容易吸引用户
    参考文献[1] 侯晓攀.基于随景游戏的移动社交应用平台设计与实现[D].北京邮电大学,2010.1-71
    [2] 张卫明,等.Java语言极其应用[M].北京:清华大学出版社.2006
    [3] 陈更力,张青.基于Java Socket网络编程的一种新实现[J].电脑开发与应用, 2006( 6):12-13
    [4] 罗军周等. TCP/IP协议及网络编程技术[M]. 清华大学出版社. 2008
    [5] 金勇华,曲俊生.Java网络高级编程[M].北京:人民邮电出版社,2010
    [6] 刘剑卓.Android手机游戏开发 [M].北京:中国铁道出版社.2012.1-12
    [7] 李刚著.疯狂Android讲义(第2版)[M].北京:电子工业出版社.2014:57~156
    [8] 杨丰胜. Android 应用开发解密[M].机械工业出版.2010
    [9] DouglasD.Huston.Java NetworkProgramming[M]. 清华大学出版社. 2004
    [10] BruceEckel. Thinking in java[M]. 机械工业出版社. 2009
    [11] DonaldE.Knuth. The Art of ComputerProgramming[M]. 人民邮电出版社.1998
    [12] Hyun Jung La.AService-based Approach to Developing Android Mobie Internet Device (MID) Applications[M].New York:2007.1-7
    致 谢时间飞逝,转眼就大四毕业,在毕业论文定稿之际,我在大学的学习生涯也即将结束。回首过去,我青春中最宝贵的时间能够在这样风景如画的校园之中度过,能在众多认真负责的老师的教导下度过,实在是荣幸之极.在这四年里,充实而快乐的求学之路,给我留下了难以忘怀的记忆,在这里,我的思想和学习得到了极大的进步和提升,我从一个懵懂无知的少年成长为了一个会独立思考,拥有一技之长的青年。在此,我要向这四年来陪伴我一起走过,关心我和帮助我的老师、同学以及朋友、亲人们,致以最为真诚的谢意。
    非常感谢老师,本文是在老师的耐心指导下完成的。从论文的确定到初稿再到资料搜集、写作、修改再到最后的定稿,这过程中,老师都一直都在给予我无私的帮助。在毕设完成过程中,老师总是在百忙之中抽出时间帮我们解决疑惑和问题,在遇到的很多细节问题上,老师都会很耐心的给予我帮助,使我受益匪浅。同时,老师也是我专业方面的启蒙老师,正是在老师风趣的课堂上,我开始树立了以后的职业目标以及梦想,也感谢四年来遇到的所有老师,你们不仅教会了我的专业知识,还教会着我如何为人处事,如何融入这个社会。
    另外,感谢众多的开源网站以及论坛上的博主们,你们无私奉献的精神无时无刻不影响着我,正是你们无私的分享自己的技术,才使得我能快速的学习并掌握更多的专业知识,正是你们对技术的热爱与执着,打动着我,让我走进并热爱这个行业。希望将来能一起进步,一起为技术的发展做出贡献。
    最后,感谢母校所有的老师、教职工和同学们,在此,对你们表示最衷心的祝福,愿你们开心快乐,幸福每一天,也祝我所热爱的母校越来越棒。
    1 评论 6 下载 2018-09-26 12:06:20 下载需要8点积分
显示 885 到 889 ,共 4 条
eject