分类

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

资源列表

  • 基于JavaFX的中文集句系统设计与实现

    摘 要本文在古诗词的内容上会有简单的描述,然后对于古诗集句软件进行详尽分析,确定功能需求以及非功能需求,对于软件运作流程给以流程图的展示。
    在需求分析基础上,进行软件的架构设计。进一步明确使用场景与功能点的关系。在查询模块主要任务是保证查询准确高效,而在集句生成部分,主要利用现有的可行手段,例如开源的中文分词工具对于待对偶诗句进行词性分析,在此基础上,给出相对较优的对偶句。最后,对于使用的开源工具运行机理进行介绍,并对系统,尤其是对偶生成算法的改进方向提出建议。
    系统最突出的是将词句匹配以及对偶句诗句生成融合,将客户端以及服务器启动程序结合,增强了程序的易用性以及使用场景的多样性。
    关键字:中文古诗词;诗词匹配;对偶句生成;中文分词使用
    ABSTRACTThis paper will make asimple description of the ancient poetry. Then, there is an analysis of thisancient poetry software system in detail. After the function requirements andnon-function requirements are curtained, there will take the flow chart about softwareoperation process.
    The software architecturewill based on the demand analysis before. Then, the paper will clarify therelationship between scenes and function points. On the query module, the taskis to ensure the query is accurate and efficient. And on the pair generationmodule, use existing open source project named HanLP, a segmentation tool, togenerate sentence pairs with readability according to the word’s property.
    At last, the paper willintroduce some algorithms used in the project HanLP, and show the direction ofsystem future improvement. System putthe client and server into one packet and put the function of pair generatingand poetry matching into the other packet which makes the system more reliabilityand easy-using.
    Keyword: Chinese poetry; poetry match; Generatepairs; the usage of segmentation
    第1章 绪论1.1 中文集句系统开发背景中文诗句作为传承中国古典文化的钥匙,以其凝练的表述,丰富的含义,优美的意境,在传承数千年中华文明的长河中熠熠生辉。优美的古诗文是全国各地语文教材的重要内容。我们每个人在接受语文教育的同时,都会接触到这精粹的文化。理解诗文内容是锻炼一个人思维的绝佳方式,对诗人的理解,对语境的体会体现了一个人的知识体系的完善程度,根据诗人所处境遇,相似的诗句可能的内涵截然不同。我们只有充分的阅读大量的诗文,才会有一定的能力,模仿创作。
    在计算机领域,在弱人工智能领域的机器翻译经过几十年的发展,在中文分词技术上,已经有令人可喜的成果。对于一篇人类的普通文章可以有较高理解程度,并将其转换为其他语言。这一技术基于的是对于语言、语法的理解与建模。
    作诗不同于翻译,已经属于强人工智能,模仿人类的作诗行为,是一个崭新的富有挑战的课题。
    模仿人的创作是一件很难的事情,尤其是高度凝练的诗句文字,需要使用合适的方式建模模拟这个过程。
    国内外的开源工具、开源方法层出不穷,为本软件的技术提供了重要的帮助。自然语言处理方面,HanLP自然语言处理有着良好的解决效率,并且开放了源代码,这让本地实现古诗句的匹配、生成更加具有可读性 (hankcs)。
    在数据集方面,网络中已经可以获取大量前人创作的诗文的电子数据,方便进行电子化的处理。
    在计算机方面,家用计算机的CPU已经可以胜任一些较为复杂的计算,性能的提高为实现对偶生成创造了可能,并且提高了匹配的速度。
    1.2 国内研究情况在自然语言的研究上,以百度翻译代表的国内中文处理与Google翻译代表的世界级互联网技术公司的文字处理利用RNN(RecurrentNeural Network)以及LSTM(LongShort-Term Memory)将中文自然语言处理通过大数据量文本推向了一个新的高度。机器人九歌与诗人陈昂联袂出演《机智过人》,现场作藏头诗引爆全场,其中背后的清华大学的自然语言处理与社会人文计算实验室与搜狗合作提供技术,代表了国内高校研究的最新水平。
    1.3 遇到的主要问题中文学习中,遇到平仄、对偶模糊查询一般需要使用搜索引擎,并且人工挑选符合需要的结果,然后通过信息进行二次查询,获得诗文、作者。本软件的精确查询与模糊查询可以进行诗文查询与保存,而且数据集成在程序内部,可以离线操作。软件集成服务器模式,根据启动命令不同,可以提供http访问服务,通过设定的request直接获得需要的结果。
    需求设计方面,要思考诗句查询可能出现的情况,制定详尽的需求分析表。一个好的需求分析直接决定了一个软件系统的上限,需求设计必须精确而有宏观眼光。
    设计方面,考虑到UI部分的简洁实用性,也要对程序的查询架构做好设计,避免占用过多资源。简洁的UI,令人愉快的交互,以及可能轻松愉悦的背景音乐都会让程序的使用体验变得更加富有人文情怀。
    在实现方面,首先,定义了较为全面的常用诗句查询规则,对于一般要求的诗句可以较清晰的描述。其次,在词性判断与对偶方面,采用开源的HanLP自然语言处理包中提供的算法,实现更加准确的词性匹配结果。最后,合理运用数据集,通过统计学的知识,让结果符合概率规则,让诗句的可读性更高。
    1.4 论文组织结构第一章绪论,介绍软件开发的背景,国内外研究现状以及软件解决的问题。第二章需求分析,对软件需求展开分析。第三章架构设计,根据软件需求,设计合理的软件架构,选择合适的软件,设计软件的技术架构与功能架构。第四章详细设计,查询过程建模,查询语句设计,对偶生成方法设计,网络通信设计,并简单介绍使用的中文分词方法。第五章实现与测试,使用单元测试检测各方法的执行效果,使用白盒测试整个软件查询流程。第六章结语,对软件进行总结,并提出改进方法以及措施。
    第2章 中文集句系统需求分析2.1 中文集句系统综述2.1.1 中文集句系统项目背景查询古诗词不便,模糊查询与精确查询需要连接网络并且反复查询,需要一款可以按照一定模式进行精确查找的软件,对于古诗的学习,查询有较好的效果。中文分词软件的准确性不断增加,开源项目增多而且成果显著。利用现有的手段以及个人计算机,可以尝试解决古诗文查询以及匹配生成的问题。
    2.1.2 中文集句系统项目介绍中文集句系统是为了更方便快捷的查询特定类型古诗词而开发的工具,通过查询语句对于古诗约束而针对性的查询出相关结果,并导出结果。对于古诗词的初学者,尤其是平仄韵律学习者,以及古诗词爱好者和有诗词查询需求的人,有较大的帮助作用。并且通过适当的启动命令可以担当小型查询服务器的任务,便于以后的功能拓展与业务拓展。在使用系统的时候,需要仔细阅读相关的程序说明,合理使用界面提供的功能。
    2.1.3 中文集句系统整体解决方案系统采用模块化系统组织,由用户交互界面模块、逻辑处理模块以及数据加载模块组成。其中,逻辑处理模块增加了处理网络请求的分模块。整个软件免安装,可以直接使用jar包启动,数据集内嵌程序中,不必考虑网络情况对于软件系统的影响。网络部分采用HTTP的Post与Get获取数据与返回结果,客户端demo代码也集成在jar包中。这种解决方案,虽然在计算能力与查询速度上带来的架构提升不大,但是十分适合在轻量级的电脑上运行。程序的内从占用与CPU使用不高,可以保证软件对于硬件的要求,同时可以为移植到移动端打下基础。
    下面是程序的结构图:

    2.2 中文集句系统工作目标以及解决的问题本系统目标:可以完整执行用户关于诗句的完整查询、结果预览、结果保存、对偶诗句生成、对偶诗句匹配等功能,形成可安装使用的完整程序。
    本系统解决的问题:

    诗句的具体约束查询,准确而快速
    对偶句生成有意义的诗句

    其他问题,JavaFX的UI界面使用,多线程操作,XML数据内存化技术,匹配优化等。
    2.3 中文集句系统需求描述2.3.1 中文集句系统功能性需求1.系统涉及的诗句查询匹配
    本系统匹配的诗句有几大约束部分。其中,主要使用的约束为:诗人约束、通配符、叠字约束、平仄约束、任选字符约束、声调约束(平仄约束)、拼音约束、或约束等。对于以上的约束,使用系统查询需要自定义一种表达方式来区分不同约束,各种约束见图2-2:

    根据查询的要求不同,将查询分为了两个大类。
    第一类,精确到逐字要求且字数有限制
    查询样例1,用户希望查询李白或者杜甫五言诗句中提到“紫”字,且该字出现在诗句的第1个字。对应的精确查询语句为:
    李白|杜甫&紫****第二类,查询的诗句中的字数不确定
    查询样例2,查询王维诗中提到“鸡黍”的诗句,查询关键字诗句为:
    王维&鸡黍通过规则对于诗句的描述,可以快速定位到相关诗句,而充分使用上述字符可以满足使用者对于诗句查询的要求。
    2.3.2 中文集句系统非功能性需求
    程序可以在Windows与Linux系统通用,该程序需要面对的使用者并不限制其操作系统的多样性。便于部署,提供网络接口方便拓展其他界面的功能,可以提供多样化的服务。查询的速度不可以超过90s,对于封闭数据集合,典型的7言诗句,所有的诗句全部吻合的时间为最高时间。在对偶生成期间,速度根据字数差异,典型为生成7言小于100s。对于异常数据有容错性,对于无属性的生僻字不能导致查询的中断。用户交互,确保全功能可以正常使用。生成的文件有一定可读性,需加入一定排版。
    第3章 中文集句系统架构设计3.1中文集句系统设计目标和原则中文集句系统的设计目标是满足需求分析的需求,并设计出可拓展的系统。
    中文集句系统的设计原则主要体现在模块化思想、多服务模式和系统可拓展三个方面。
    模块化思想,每个模块之间分清功能以及确定接口设计,模块内部实现全部逻辑,不能相互干涉使用模块内部方法。
    多服务模式,所有的业务逻辑封装在jar包中,根据启动命令不同,启动不同的服务模式。
    系统拓展方面,开启网络服务模式,只需要进行HTTP通信,就可以使用Client模式的绝大部分功能。所以,可以拓展到WEB页面的服务以及手机端。
    3.2 中文集句系统的技术架构设计3.2.1 中文集句系统技术架构采用JavaFX[4]进行界面UI设计交互,Java JDK1.8.0进行主程序编写,XML进行数据的组织以及标准化。使用jetty作为Web服务器的依赖包,提供Server服务。使用log4j作为系统日志生成组件。
    JavaFX,将界面展示与逻辑处理分开,摆脱了界面代码与逻辑代码混杂的Java界面设计模式,而且支持CSS等,让界面设计更加简洁而专一。
    XML文档有着强大的表述能力,规范的读写控制,作为轻量级的数据存储单位有着比数据库更加快速的优点。
    Jetty框架,提供轻量级的JavaWeb框架,比TomCat更加轻量级,且支持的jar包少,通过Maven引用简单快捷。
    Log4j是Apache开发的日志输出组件,对于监控运行的服务器端Java程序的运行状况有着十分明显的作用。
    具体详细结构见图3-1:

    3.3中文集句系统功能架构3.3.1 中文集句系统功能组成
    主要功能分为三个:
    1.诗句匹配
    对与诗句是运用规则进行精确匹配;使用关键字进行模糊匹配,匹配中运用部分精确匹配规则。精确匹配,是已知诗句个数,进行匹配时,首先排除数据集中不满足诗句长度的诗句,从而达到提高效率的目的。模糊匹配,是对应一首诗中不知道诗句长度,而需要查询所有诗句才能判断是否匹配成功,但是结果丰富,对于特定场景有很强的效果。
    2.对偶匹配
    对于输入的一句诗句(包括自己创作的),对于数据库中的诗句进行对偶匹配,返回符合对偶条件的诗句。对偶匹配的规则有很多,根据对于诗词格律概要[2]的研读,对偶对于平仄、词性有一定要求,在众多的对偶规则中,本文选取基本对偶规则进行对偶判断。
    3.对偶生成
    对于输入的诗句,通过一定算法返回合适的对偶诗句。对偶输入不仅要输入待匹配诗句,还需要输入生成个数,便于程序有限词的生成结果,程序本身不能评价生成诗句的好坏,所以需要人工对于生成结构进行整理分析。
    此外,服务器模式,实现HTTP通信使用上述三个功能并返回结果。对于网络客户端的代码,可以参考程序内的DEMO程序,在网页或者手机端可是同时调用接口,实现功能拓展。
    3.3.2 中文集句系统具体功能流程功能流程图见3-3,3-4:

    3-2匹配流程适用于精确匹配与关键字匹配,以及对偶匹配。匹配设计与第四章详细介绍。

    对偶句生成的分词,以及获得对偶词将由第四章详细展开。对偶句的关键逻辑在于对偶词的生成,以及中文分词的准确程度。
    第4章 中文集句系统详细设计经过需求分析和架构设计,逐步分析了中文集句系统涉及的需求和架构流程。本章在第三章的基础上,分析系统的模型结构和使用的算法以及诗句匹配的详细过程。详细设计分为静态设计、动态设计以及数据组织管理。
    4.1 中文集句系统静态程序设计4.1.1 中文集句系统的数据类基础文字类wordClass.java,负责存储诗的最基本元素单词。

    一个单词,属性有word字形、pinYin读音、pingZe平仄、yunbu在平水韵中所在对应韵部、kind平仄以及在全诗词中出现的次数。因为有三种主要功能所需要的wordClass需要承担不同的责任,所以我适应多态,不同的构造函数生成的word可以满足不同需要同时减少所有参数输入的问题,这部分将在具体情况下展示。
    与wordClass相似,诗句使用tangClass进行存储。

    tangClass中,author为作者,dynasty为朝代,context为诗文的String对象,包括换行与标点符号,title为题目,pairs为对偶生成结果存放位置,pairsWegiht为生成结果权重值(第一代对偶生成算法使用),关于对偶生成策略,在之后详细介绍。
    枚举类operation.java作用于服务器模式,http请求中的请求转化为业务请求。

    数据加载部分,由六种数据源组成,分别是诗句集合、平水韵表、作者集合、字典集、字分类集合以及诗句集字统计后形成的表。

    诗句集合,诗词查询的核心,诗句全部集中于该集合。平水韵表,根据诗词格律概要[2]中的描述,现存的最早诗韵是《广韵》,其前身为《唐韵》,而《唐韵》的前身为《切韵》,《广韵》共206韵,唐初许敬宗等奏议合并中临近韵。宋淳祐年间,江北平水人刘渊著《壬子新刊礼部韵略》,合并206韵至107韵。清代改称“平水韵”为“佩文诗韵”,合并为106韵,唐诗所用韵律实际使用平水韵。本程序主要解决唐诗及以后的研究。所以平水韵十分适合作为程序使用的韵律表。作者集合,是诗词集合的子集,主要作用是在查询过程中加快对于有诗人限制的匹配工作字典集,是拼音、字形的基本依据。收录了常用的汉字,并不含生僻字。字分类集合,这个集合感谢我的导师高晓程老师,他在繁忙的教学间隔中,根据自己的查询、以及自己的判断,整理了一个简易的字分类集合。本集合也是第一对偶生成算法的基础。基本思想是,用一个32位的数字表示汉字的属性,每一位表示一种属性,例如名词、动词、介词等。基本上分了26类,使用的时候,用两个汉字的对应数字相与如果相同属性位置均为1,则认为两个字的词性是匹配的。从数字角度上考虑,若两数字完全不匹配,则结果为0,数字越大,两汉字越匹配。这种生成对偶字的方法并不考虑词对于对偶的影响。同时,在对偶匹配中,也是用到了这个数据集。诗句集字统计表,是根据诗句集,将所有出现的汉字分类,并统计其出现次数的表格,因为第二种匹配算法使用到汉字出现概率,所以需要这项数据,这项数据对于固定集合也是固定的,所以固定成表加快运行速度。
    由于这六个数据集有较大的相似性,结构很相似,所以我以及字典集为例:wordSource.java。

    Logger对象为log4j包需要打印日志定位Class。ArrayList\<wordClass\>为数据集转换的java内存对象,也是程序搜索时取得数据对象。构造方法wordSourc(),将XML文件转化为ArrayList\<wordClass\>对象,getWordClassArrayList()返回生成的结果集。
    其他的数据集合类如:tangSource.java,kindSource.java均是如此构造可以将该类看为接口类来理解。
    4.1.2 中文集句系统的网络服务类网络部分,主要使用的类netServer.java。

    netServer负责启动服务器线程,hnadler处理每一个http请求,对于合法请求,经过调用主方法类,获得结果后返回。
    httpRequest结构。



    Header
    可输入项




    OPERATION
    isSearch,possibleSearch,pairMatch中任意一项


    INPUT
    实际查询语句,例如“李白|杜甫&桃花潭***”


    URL
    启动Server服务器的主机ip:port



    而客户端可以通过构造event对象实现对于客户端的response值的读取,代码如下:
    CloseableHttpResponse response = httpclient.execute(request); //解析response InputStream bis = response.getEntity().getContent(); ObjectInputStream ois = new ObjectInputStream(bis); event e = (event) ois.readObject(); logger.info(e.toString()); int status = response.getStatusLine().getStatusCode(); logger.info("返回 "+status); System.out.println(status); httpclient.close();
    event是一个构造的网络传输对象,并且继承了Serializable接口。
    public class event implements Serializable{ private static final long serialVersionUID = 3584042093326873203L; public ArrayList<tangClass> getResult() { return result; } public void setResult(ArrayList<tangClass> result) { this.result = result; } public String getInputString() { return inputString; } public void setInputString(String inputString) { this.inputString = inputString; } public operation getOp() { return op; } public void setOp(operation op) { this.op = op; } private ArrayList<tangClass> result; private String inputString = ""; public operation op; public event(operation op,String input){ this.setOp(op); this.setInputString(inputString); } public String toString(){ String out = ""; for (int i = 0; i < result.size(); i++) { out = out + "\n" + result.get(i).toString(); } return out; }}
    4.1.3 中文集句系统主方法类以及详细功能主方法类analyze.java。

    该工具类实现了查询的全部功能,主要入口函数为:Match(String),PMatch(String),pairMatch(String),getPair(String),对应精确匹配、关键字匹配、对偶匹配以及对偶生成。
    1.Match(String)
    首先判断输入合法,使用getAuthor()对有诗人限制的提取,并查询诗人集合,无结果直接返回,有结果进入下一步。
    调用isMatch(String,String),左侧为待匹配字符,右侧为诗句的Context属性。isMatch中,对于诗句Context中的每一句中的每一个汉字,都使用judge(String,String,String)判断是否与输入的匹配字符串吻合。judge中,第一个参数为匹配规则字符,第二个为来源于诗句Context中的待匹配汉字,第三个参数为上一个匹配的汉字。例如,juage的输入为””,”白”,“”。那么根据匹配字符规则,对应任意汉字,那么返回true。输入为“a”,“黑”,“白”。那么根据规则,希望查询叠字,但是本字为黑,上一个汉字为白,所以返回false。
    judge为最基本的规则判断方法,处理了基本所有的规则符号。具体代码参考附录中的analyze代码描述。
    2.PMatch(String)
    关键字查找的思路与精确查找一直一致,关键是两个单字之间空有复数个汉字时,使用第一种按序列匹配不能解决问题。
    首先也是对输入检查,调用possibleMatch(String,String),这个方法与isMatch()对应,在这个方法中,首先对于输入的查询规则进行建模,找到能影响规则的字符位置,这些字符有:汉字,[],调用getKeyIntArray(String),获得关键字数组。对于每一次的诗句循环,建立一个初始化全0的二维int数组isFound[][],存放key值与对应的其他字符的匹配情况。当key值字符在其他位置找到对应字时,在isFound的key值所在数组位置a,匹配到汉字的位置b标记为isFound[a][b] = 1。最后,遍历一句话的isFound数组,如果有一处为1,那么就可以判断这句话匹配成功,返回这首诗。这就完成了关键字搜索部分的关键代码段。
    3.pairMatch(String)
    这个对偶匹配方法使用的就是字分类集合,对输入的每一个字与诗句集中的相同大小的诗句进行一次对偶计算。由于分类集中汉字个数2177,远小于诗词集的8116。所以,对偶的匹配效果并不理想。这也是制约对偶诗句生成的主要问题。
    4.getPair(String)
    主要思路是首先获取输入字符串的中文分词,然后对于每一个输入的中文分词,生成对应的对偶词。对于诗词集合中的文字统计表,我们已经在上文中介绍并且实例化到了程序中。生成随机数R,对于诗词集的每一个字出现的频度A,总字数为M。我们在wordClass有记录count属性。所以,我们可以得到依据诗词汉字出现频率来随机生成的一个较为可信的随机汉字而不汉字,当

    且,

    认为该序列的汉字为对应生成的可信汉字。
    我们得到单个汉字之后,按照相同方法获得下一个汉字,直到达到分词结果的字数。然后对生成的汉字使用分词工具,判断词性,若与输入分词的对应词组词性相同,就直接填入结果中。
    例如:输入语句为“月涌大荒流”
    首先中文分词,分为[月/q,涌/v,大/a,荒/ng,流/v]

    然后对应生成“天如清寝尽”。
    4.2 中文集句系统动态程序设计系统动态设计是通过流程图、时序图展示的。中文集句软件主要是对于输入的查询、匹配。下面是对于系统的部分功能流程描述。

    在结果界面,可以选择保存文件,也可以点击单个诗句来进行保存操作,程序开始界面还有部分非必要功能,在这里不再赘述。
    4.3 中文集句系统数据模块部分设计数据模块的思想是将待查询数据直接载入内存,加快程序判断速度。在程序中,使用ArrayList作为基本类型wordClass与tangClass的组织对象,虽然六种数据源的数据不尽相同,但是最终都可以归纳到上述两个基本类的对象的属性之中。区别仅在于,数据加载程序需要根据不同的XML文件进行调整。
    以下是不同文件的实际内容截取:
    1.fullshici.xml
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><唐诗三百首 xmlns="http://tempuri.org/tangshi.xsd"> <唐诗> <题目>少年子</题目> <作者>李白</作者> <正文>青云年少子,挟弹章台左。鞍马四边开,突如流星过。金丸落飞鸟,夜入琼楼卧。夷齐是何人,独守西山饿。</正文> <注解 /> </唐诗></唐诗三百首>
    2.pingzezidian.xml
    <?xml version="1.0" encoding="UTF-8"?><dataroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" generated="2017-03-10T10:08:22"><pingzezidian><字符>一</字符><读音>yi2 yi4 yi1</读音><平仄>2</平仄></pingzezidian></dataroot>
    3.authors.xml
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><NewDataSet><authors> <name>李清照</name> </authors> <authors> <name>李世民</name> </authors></NewDataSet>
    4.zifenlei.xml
    <?xml version="1.0" encoding="UTF-8"?><dataroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="zifenlei.xsd" generated="2017-03-10T10:05:19"><zifenlei><zi>打</zi><fenlei>2</fenlei></zifenlei></dataroot>
    5.pingze.xml
    <?xml version="1.0" encoding="UTF-8" standalone="no"?><root><字符>东<上平去入>0</上平去入><韵部>1</韵部></字符></root>
    6.wordCountList.xml
    <?xml version="1.0" encoding="UTF-8" standalone="no"?><root><字符>川<出现次数>2332</出现次数></字符></root>
    在主分析类中,构造函数中自动加载上述六种数据源。下边是wordClass与tangClass的详细属性。
    wordClass



    成员
    类型
    说明




    word
    String
    汉字字符


    pinYin
    String[]
    拼音最后一位是读音,支持多音字


    pingZe
    int
    有0,1,2,3三种对应平,上去入(仄)


    yunbu
    int
    平水韵的韵部


    kind
    int
    对应32位的词性分类,每一位代表一个属性


    count
    int
    出现在诗句集中的次数



    tangClass



    成员
    类型
    说明




    author
    String
    作者


    dynasty
    String
    朝代


    context
    String
    诗文,包括标点、换行符等


    title
    String
    题目


    pairs
    String
    对偶匹配成功的诗句


    pairsWeight
    int
    匹配度,成功配对的诗句所有汉字权重累加



    4.4 中文集句系统UI设计由于使用Java作为开发语言,界面的开发是一个相对困难的问题。Java Swing是Java自带的界面开发框架,但是版本老旧,代码逻辑与界面代码混杂,不便于开发、维护工作。JavaFX是Oracle内置于Java7版本以及Java7的图形开发框架。经过简单的学习,就可以设计出外观简洁、代码简洁的UI部分,并且逻辑块与界面代码不会相互干扰,增加可读性。JavaFX可以通过网上的中文JavaFX网站[5]学习,上手方便快捷。
    4.4.1 JavaFX架构说明JavaFX是一个Orcale公司为了改进Java的图形界面而开发设计内置于Java8中的图形和多媒体处理工具包的集合,JavaFx可以让开发人员来设计、创建客户端的界面程序,并且和Java一样跨平台[6]。
    一般的JavaFX分为三个部分,fxml描述UI文件、JavaFX Application、JavaFX Controller。
    Fxml
    Fxml描述界面设计的文件,作为附加资源被Application启动时载入。下面是一个Fxml文件的部分内容。
    <?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?><?import javafx.scene.layout.*?><?import javafx.scene.text.Font?><BorderPane fx:id="bigBorderPane" xmlns="http://javafx.com/javafx/8.0.101" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.Davi.poems.gui.Controller"><top></top></BorderPane>
    JavaFX Application
    Application是一个抽象类,规定了start()方法,用于创建最初窗口,一个实际使用的界面继承Application,创建Controller对象并且加载fxml文件。自定义方法welcome,加载Controller以及fxml文件。
    Public void welcome(){ try { Controller controller = replaceSceneContent("/welcome.fxml"); controller.setApp(this); } catch (Exception e) { e.printStackTrace(); }}");
    JavaFX Controller
    Controller是真正的逻辑处理部分。之中,fxml文件描述的组件的fx:id在Controller中使用关键字@FXML 引用。每一个方法必须在fxml中填写才可以生效。Controller中的一个方法。
    @FXML public void playOrStopBGM(){…}
    Fxml文件中的内容对应。
    <MenuItem mnemonicParsing="false" onAction="#playOrStopBGM" text="关闭&开启音乐" />
    4.4.2 中文集句系统UI设计根据需求分析部分,主要的查询界面有3个,分别负责精确&关键字查询、对偶生成、对偶匹配。
    所以采取的对应设计为一个主类Main.java继承Application。在之中设计连同欢迎界面在内的4个fxml文件。每一次切换Controller的场景上下文来实现切换页面的操作。这样可以将处理逻辑集中在一个Controller中,便于实现以及维护。
    第5章 中文集句系统实现与测试5.1 中文集句系统实现5.1.1 [软件界面功能介绍中文集句系统欢迎界面实现如下图5-1所示:

    点击开始集句之旅进入第一个查询界面,也可以点击文件,可选择三种不同的功能。附带诗句为本人拙作。
    5.1.2 中文集句系统的精确&关键字查询界面精确&关键字查询界面图5-2:

    输入框下方简单介绍了查询的匹配规则,并给出简单的示例。
    将文本输入文本输入框,点击精确查找,在右侧结果集返回结果图5-3:

    此时,点击右侧结果集图5-4:

    这是诗句的详细内容,并且附加了保存文本选项,可以选择保存目录并保存图5-5:

    还可以点击菜单栏编辑选项,保存结果,这是用于批量保存文件的方法。保存当前的结果集内容。
    5.1.3 中文集句系统的对偶匹配界面对偶匹配,点击文件-对偶匹配图5-6:

    对偶匹配的方法与精确匹配类似,可以对诗人进行限制,但是一般为了找到合适的对偶句,不做限制,进行查询5-7:

    查询速度较慢,因为使用的词性字典并不权威,所以结果不做置信的保证。
    5.1.4 中文集句系统的对偶生成界面对偶生成,点击文件-对偶生成,图5-8:

    软件集成4种中文分词算法,所以对偶生成的结果有不同,算法的介绍将会在5.2说明。
    输入待生成的对偶句上句,图5-9:

    HanLP的NormalSegment是作为默认调用的分析方法,结果如上图。
    其他方法直接截图,仅有使用分词算法不同。

    5.2 中文集句系统中文分词模块实现本软件使用的标准分词算法、NLP(自然语言处理)分词算法、N-最短路径分词算法以及Dijkstra最短路径算法分词将在本部分做介绍并分析算法异同。有关内容可以参考[1],网站对于HanLP的使用方法以及设计。
    5.2.1 标准分词算法生成词图,分词系统需要字典数据。词图,指句子中所有可能组成的词语的图。若有两个汉字A,B。其中,A是B的前驱,B是A的后继。那么A,B两个汉字间有一条词通路径(A,B)。一个词可以有N前驱或者后继。由A,B这样的字以及他们的前驱与后继构成的图,称为词图[7]。

    其中,建立点A,B的联系,找到后继前驱的算法有两种。
    1.使用 DynamicArray
    直观上,建立一个二维的表,从一个词最左侧汉字序列作为行,最右侧汉字序列作为列,就可以表达n个汉字之间的关系。但是会出现很多无效格,占用内存。DynamicArray的每个节点都包含词语的行编号(row)与行编号(col)也就是词的起止位置。
    上图中,列为n的词可以与行为n的词进行组合。例如,“实在”来源于(5,7)也就是从第五字符后到第七字符,而“实在”的col为7,那么与它一起计算平滑值的词就在row为7的“理”。连接词形成边使用上面的规则。在查询和便利的时候,需要逐个比对col与row,复杂度为O(n)。
    2.使用quick offset
    使用offset将相同的词写到同一行,建立一个一维数组,而数组内的每一个元素是一个单链表。
    1.始##始2.他3.说4.的/的确5.确/确实6.实/实在7.在/在理8.理末##末当查找下一个词的时候,以“实在”为例,实在位于6号位置,而实在的词语长度是2,所以下一个词的位置是2 + 6 = 8,8号位置。所以当查询和插入的时间均为O(1)。
    在生成词图后,就要进行词性标注工作。词性标注工作涉及面广,技术难度复杂,所以下文将引用成型文献进行解释。
    词性标注(Part-of-Speech tagging 或POS tagging),又称词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。在汉语中,词性标注比较简单,因为汉语词汇词性多变的情况比较少见,大多词语只有一个词性,或者出现频次最高的词性远远高于第二位的词性。据说,只需选取最高频词性,即可实现80%准确率的中文词性标注程序[8]。
    HanLP中使用了一阶隐马模型[9],在这个隐马尔可夫模型中,隐状态是词性,显状态是单词。HanLP训练语料采用了2014人民日报切分语料。
    汉语词的词性频数词典,分别统计所有单词的不同词性的出现频数,记录在词典的词语属性中,得到汉语词的词性频数词典(局部)如下:
    爱 v 3622 vn 598爱因斯坦 nrf 20爱国 a 178~统计每个标签的转移频率制作转移矩阵。
    利用求出的转移矩阵和核心词典词频数据可以计算出HMM(隐马尔可夫模型)中的初始概率、转移概率、发射概率,进而完成求解,关于维特比算法和实现请参考通用维特比算法的Java实现[11]。
    关于词性标注部分,请参考2014年人民日报切分语料。
    通过使用HMM模型,以及训练集的初步训练,得到了HanLP的标准分词算法,也是中文集句系统使用的基本算法之一。
    5.2.2 NLP分词算法NLP(自然语言处理)技术,目前取得了丰硕的成果,并且广泛应用于基于文档的信息检索、信息抽取与机器翻译等领域。目前的NLP在于数据检索上的应用可以分为两个层次,即词语层和上词语层。在词语层这个方面,NLP应用于自动分词识别内容词与功能词、识别复合短语与专有名词以及未收录名词。具体的应用为原形化或词干提取算法、机器可读字典开发、词语索引以及消除词语歧义和异意。而在上词语层,NLP应用到了概念表示、句法分析以及语义分析。
    NLP分词算法主要用到的是句法分析[13]。在自然语言中,语法规则是必需的存在,用于规范语言让语言有规律可循,一个句子中可能会出现主语、谓语、宾语。自然语言处理中的句法分析就显得比较重要。句法分析主要解决两个问题,第一是句法在计算机的存储和描述,第二是句法分析算法。所以,解决第一个问题,使用句法树来进行存储。
    假设,使用S作为句子,N,V,P代表名词、动词与介词,p代表短语(Np,Vp,Pp分别代表名词短语、动词短语、介词短语)。那么一句话就可以使用上述的描述作为计算机内的句法存储结构。
    例句:Jinan is located in Shandong Province S:Jinan is located in Shandong ProvinceN:Jinan Shandong ProvinceV:is locatedP:in(S (Np (N Jinan)) (Vp (V is) (Vp (V located) (Pp (P in) (Np (N Shandong)(N Province))))))在解决存储问题后,解决第二个问题是句法分析算法。
    采用CFG(Context-Free Grammar),上下文无关语法算法。为了简单的得到一颗语法树,定义语法如下:
    1)N表示一组非叶子节点的标注,例如{S、Np、Vp、N...}2)Σ表示一组叶子结点的标注,例如{Jinan、located...}3)R表示一组规则,每条规则可以表示为X->Y1Y2...Yn,X∈N,Yi∈(N∪Σ)4)S表示语法树开始的标注N = {S,Np,Vp,Pp,V,N,P,Vi,Vt,NN,IN}S = SΣ= {Jinan,is,located,in,Shandong,province }R={s->NP,VP;VP->Vi,Vt,Vp,Np,Pp;Np->Np,NN,Pp;Pp->IN,NP}由于句法分析的多重意义的性性质,所以在一个句子中可能会获得多个语法树,但是正确的语法树往往仅是一个,所以采用的一种常见的解决方法就是PCFG(Probabilistic Context-Free Grammar),概率分布的上下文无关语法。
    为了让语法树更加清晰,需要统计语法规则,对句子的语法规则增加置信程度,倾向于更有可信度的语法树,R规则内部,每一个句法规则都增加置信程度,例如:
    S->Np,Vp 1.0Vp->Vt 0.4Vp->Vi 0.4Vp->Vp 0.2Np->NN 0.3Np->Np,Pp 0.7Pp->P,Np 1.0而对于生成的语法树,对于每一个组成的规则的置信概率的乘积作为语法树置信程度。而同时出现多颗语法树时,有理由相信出现的可信度最大的语法树就是最有可能的的语法树结果。
    随后,利用足够大训练样本对于模型进行训练,PCFG中的参数经过训练调整到较符合训练集的程度。
    1)统计出语料库中所有的N与Σ;2)利用语料库中的所有规则作为集合R;3)针对每个规则A -> B,从语料库中估算置信程度p(x) = p(A -> B) / p(A);因为多语法树在解析上存在问题,所以在CFG的定义上,定义二叉语法的语法格式。要求每条规则只能是X -> Y1 Y2或者X -> Y的格式。实际上二叉语法格式保证产生的语法树总是二叉树语法树的格式,同时普通语法树可以转化成二叉语法格式。
    当训练完毕,拥有PCFG的模型完整参数,且语法转换为二叉树语法结构时,输入S=X1,X2,…,Xn计算句子对应语法树。
    由此基本的NLP的语句分析算法设计完毕,但是算法存在一些缺点:

    词法信息依赖外部的信息提供,训练集的丰富程度决定最终结果
    连续介词的处理在训练集中难以训练
    训练集对于使用环境的限制与要求

    5.2.3 N最短路径算法N最短路需要记录从哪一个点到哪一个点,花费是多少,采用的数据结构是PreNode节点。
    一个PreNode节点可能出现的内容有

    上一个N最短节点的节点名
    N最短路径的权重
    记录第N最短的index值

    N最短路径的基本思想是使用Dijkstra算法,以1-最短路径为例,求到下一个节点的最短路,沿最短路径前进至某个节点时,检查到下一个节点是否有其他路可以警告过,如果有的话,从发现的新的路径中选择一条路径,同时将所有最短路径加入PreNode而不是仅仅加入一条路径。而N最短就是第N短路径,维护N种PreNode,内容是第N短路径的上一个点的信息。
    所以,在拥有词语训练集的情况下,我们会拥有一个某词语到某词语的权重(概率分布),当输入一个字符串的时候,我们首先生成词图,并且去掉不存在的词语,然后将剩余词放入N最短路径算法模型中。
    例如:
    S = “商品和服务”可以分解为:“#开始”“商”,“商品”,“品”,“和”,“和服”,“服”,“服务”,“#结束”几个单词(“品和”未查询成功),且从0开始依次编号到8可能出现的情况0-1 “#开始”to“商”0-2 “#开始”to“商品”1-3 “商”to“品”2-4 “商品”to“和”3-4(不通)“品”to“和”2-5 “商品”to“和服”3-5 “品”to“和服”4-6 “和”to“服务”根据词语的训练集,我们可以获得每个字到下一字的出现次数(或者概率),所以根据N最短路径的算法,只需要在每一个边上加上权值(概率)就可以求出对应的分词情况。
    5.2.4 Dijkstra最短路径算法Dijkstra是一个十分经典的单源最短路径求解算法,在《算法导论》中作为经典算法进行讲解,本文作为回顾,简单介绍一下Dijkstra的核心思想。
    Dijkstra解决的是一个有向的带权图(非负)的最短路径求解的问题。对于分词的问题来说,只要通过训练集获得词语相关权重,查询输入字句的最短路径和5.2.3 N最短路径算法中N = 1的情况一致。
    Dijkstra算法涉及到松弛技术。对于每一个到原点S的顶点V,都维护一个d[v],含义是到原点S的估计最短距离,对于一个权值w(u,v)的边来讲,d[u]与d[v]的关系为:
    1. d[v] >= d[u] + w(u,v)2. d[v] < d[u] + w(u,v)对于第一种情况,说明v点的最短路径不通过(u,v);而第二种情况,需要松弛边w(u,v),给d[v]赋予新的权重。
    Dijkstra算法反复选取从顶点开始的所有与当前最短路径节点最近的节点(通过松弛当前节点的邻接节点选出最小的节点之一),最后得到一条最优解。
    在算法进行过过程中,只能得到一个关于当前输入语句的解,这是与1-最短路径的主要区别之一,但Dijkstra算法因为随机选择而使得计算量变小,计算速度加快,这是算法优点之一。
    5.3 中文集句系统的测试5.3.1 测试的方法论与主要技术软件测试,作为保证软件工程质量的关键性步骤,对于软件的水平起到了举足轻重的作用。测试的作用有两个,其一,是对质量做出判断;其二是发现存在的问题。根据软件工程的方法论,本系统的开发已经经历了需求分析、概要设计、详细设计、代码实现。接下来,本部分对系统采用3种不同的测试技术,用来测试软件的质量水平。
    测试主要使用方法有,功能测试、结构测试。
    功能测试又称黑盒测试,核心内容是给定输入获得正确输出,即程序正确。
    结构测试又称白盒测试,核心是已知程序结构,在输入数据的基础上,可以准确判断程序的运行情况以及定位出现的问题。
    5.3.2主要是功能测试的内容,给定输入值,获得结果,并验证结果正确性。对于没有答案的对偶生成部分,我们采用人工评分的方法,打出三组分数,取均值获得生成对偶句的分数,从而判断功能完善程度。
    5.3.2 测试项目与内容1.测试精确查询
    精确查询共支持8中字符以及汉字的操作,对于其中的字符可以分为两类。
    第一类是限制作者部分的字符,有‘&’与‘|’。
    第二类是对于诗句的限制字符,有‘*’,“[]”,“()”,“P”,“Z”,“a”。
    所以,测试用例应需要准备的数量为112。

    (“()”需要配合‘*’使用所以不测试全括号情况)
    但是,读取作者限制部分功能点代码位于一个方法,而诗句限制字符存在另一个方法。所以,实际准备样例测试主要使用情况,112中全部测试用例有很大一部分不符合实际使用情况,故不采用。例如:“PPPPP”,这样一个5言诗句全是平声字,不符合诗韵格律,虽然作为测试用例来讲没有任何问题,但是无效输入只会让搜索结果为0,不能检验方法功能正确性。所以”PZPPZ”这种输入更具有代表性,不仅符合格律而且可能有一批返回结果可供查验。



    测试用例1




    输入:杜甫&****汉


    输出集:20首









    测试用例2




    输入:李白\
    王维&***风*


    结果集:96首









    测试用例3




    输入:[水火]******


    结果集:899首









    测试用例4




    输入:*(hong)***(ping)*


    结果集:6首









    测试用例5




    输入:ppzzpzz


    结果集:386首









    测试用例6




    输入:白居易&**a**


    结果集:11首






    至此,精确匹配的主要使用场景测试完毕,分别测试了带诗人、带多诗人、多字任选、平仄限制、拼音限制以及叠字查询。
    2.测试关键字查询
    关键字查询,主要是测试在不提供词数的情况下,能否匹配多个不同长度的词语。



    测试用例7




    输入:百**苦


    结果集:4首









    测试用例8




    输入:[千百]*[雪盖]


    结果集:70首









    测试用例9




    输入:娉婷


    结果集:119首









    测试用例10




    输入:pzpp红


    结果集:354首









    测试用例11




    输入:王大伟&*****


    结果集:错误






    3.测试对偶匹配



    测试用例12




    输入:春眠不觉晓


    结果集:69









    测试用例13




    输入:不如御风行万里


    结果集:0首






    4.测试对偶生成



    测试用例14




    输入:不如御风行万里


    使用分词方法:标准分词


    结果集:指定5首





    生成诗句有一定可读性,但是具体诗意不明显。






    测试用例15




    输入:月涌大荒流


    使用分词方法:标准分词


    结果集:指定5首





    五言诗句明显可以有诗意,较七言表现更加。






    测试用例16




    输入:不如御风行万里


    使用分词方法:标准分词


    结果集:指定5首





    标准分词对仗并不工整。






    测试用例17




    输入:不如御风行万里


    使用分词方法:NLP分词


    结果集:指定5首





    NLP分词的对仗有明显进步。






    测试用例18




    输入:不如御风行万里


    使用分词方法:NShorPath分词


    结果集:指定5首





    发挥与标准分词类似,对仗并不工整。






    测试用例19




    输入:不如御风行万里


    使用分词方法:DijkstraShortPath分词


    结果集:指定5首





    表现与标准分词和NShortPath分词效果类似。



    综合表现,在输入句“不如御风行万里”,限制5首时,NLP分词表现最佳。



    测试用例20




    输入:春眠不觉晓


    使用分词方法:标准分词


    结果集:指定5首





    其中,柳绿未经瞻一句接近对仗诗句,表现尚佳。






    测试用例21




    输入:春眠不觉晓


    使用分词方法:NLP分词


    结果集:指定5首





    NLP分词表现好,5句对仗均有表现力。






    测试用例22




    输入:春眠不觉晓


    使用分词方法:NShortPath分词


    结果集:指定5首





    字形更为复杂,而含义却并不明确,表现不如前两种分词方法。






    测试用例23




    输入:春眠不觉晓


    使用分词方法:DijkstraShortPath分词


    结果集:指定5首





    表现效果良好,接近标准分词结果。



    结论,在输入诗句“春眠不觉晓”,指定生成5句时,NLP发挥依旧稳定,DijkstraShortPath与标准分词的结果也表现良好,只有NShortPath分词的对仗诗句表现最差。
    在生成诗句的时间方面,每一单句诗句的生成时间从最短的8ms到1799ms均有分布,但是平均在100ms左右,下附部分时间数据日志。
    2017-05-12 08:01:07,883INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 23ms2017-05-12 08:01:07,907INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 24ms2017-05-12 08:01:07,924INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 17ms2017-05-12 08:01:07,936INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 12ms2017-05-12 08:01:07,944INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 8ms2017-05-12 08:05:03,709INFO[com.Davi.poems.tools.analyze]-NLPSegment生成对偶句所用时间 Time 564ms2017-05-12 08:05:05,508INFO[com.Davi.poems.tools.analyze]-NLPSegment生成对偶句所用时间 Time 1799ms2017-05-12 08:05:06,162INFO[com.Davi.poems.tools.analyze]-NLPSegment生成对偶句所用时间 Time 654ms2017-05-12 08:05:06,349INFO[com.Davi.poems.tools.analyze]-NLPSegment生成对偶句所用时间 Time 187ms2017-05-12 08:05:06,460INFO[com.Davi.poems.tools.analyze]-NLPSegment生成对偶句所用时间 Time 111ms2017-05-12 08:06:14,461INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 43ms2017-05-12 08:06:14,496INFO[com.Davi.poems.tools.analyze]-normalSegment生成对偶句所用时间 Time 34ms2017-05-12 08:20:22,986INFO[com.Davi.poems.tools.analyze]-NshrotSegment生成对偶句所用时间 Time 163ms2017-05-12 08:20:23,114INFO[com.Davi.poems.tools.analyze]-NshrotSegment生成对偶句所用时间 Time 127ms2017-05-12 08:22:06,456INFO[com.Davi.poems.tools.analyze]-DjistraShrotSegment生成对偶句所用时间 Time 125ms2017-05-12 08:22:06,558INFO[com.Davi.poems.tools.analyze]-DjistraShrotSegment生成对偶句所用时间 Time 102ms2017-05-12 08:22:06,740INFO[com.Davi.poems.tools.analyze]-DjistraShrotSegment生成对偶句所用时间 Time 182ms2017-05-12 08:22:06,886INFO[com.Davi.poems.tools.analyze]-DjistraShrotSegment生成对偶句所用时间 Time 145ms2017-05-12 08:22:06,912INFO[com.Davi.poems.tools.analyze]-DjistraShrotSegment生成对偶句所用时间 Time 26ms此外,随着字数的增加以及诗句数量的增加,对偶生成的所需时间也迅速增加,且每一次的生成时间也不相同。生成时间与句子的对仗工整程度并没有直接关联。
    5.非功能需求的实现测试
    服务器模式启动:

    返回值:
    2017-05-12 09:14:03,120INFO[com.Davi.poems.net.myHttpClient]-这首诗的题目是赠汪伦(白游泾县桃花潭,村人汪伦常酝美酒以待白)这首诗的作者是李白这首诗的内容是: 李白乘舟将欲行,忽闻岸上踏歌声。桃花潭水深千尺,不及汪伦送我情。对偶句是:null权重是0这首诗的题目是山中问答这首诗的作者是李白这首诗的内容是: 问余何意栖碧山,笑而不答心自闲。桃花流水窅然去,别有天地非人间。对偶句是:null权重是0这首诗的题目是东鲁门泛舟二首这首诗的作者是李白这首诗的内容是: 日落沙明天倒开,波摇石动水萦回。轻舟泛月寻溪转,疑是山阴雪后来。水作青龙盘石堤,桃花夹岸鲁门西。若教月下乘舟去,何啻风流到剡溪。对偶句是:null权重是0这首诗的题目是曲江对酒这首诗的作者是杜甫这首诗的内容是: 苑外江头坐不归,水精春殿转霏微。桃花细逐杨花落,黄鸟时兼白鸟飞。纵饮久判人共弃,懒朝真与世相违。吏情更觉沧洲远,老大悲伤未拂衣。对偶句是:null权重是0这首诗的题目是江畔独步寻花七绝句这首诗的作者是杜甫这首诗的内容是: 江上被花恼不彻,无处告诉只颠狂。走觅南邻爱酒伴,经旬出饮独空床。稠花乱蕊畏江滨,行步欹危实怕春。诗酒尚堪驱使在,未须料理白头人。江深竹静两三家,多事红花映白花。报答春光知有处,应须美酒送生涯。东望少城花满烟,百花高楼更可怜。谁能载酒开金盏,唤取佳人舞绣筵。黄师塔前江水东,春光懒困倚微风。桃花一簇开无主,可爱深红爱浅红。黄四娘家花满蹊,千朵万朵压枝低。留连戏蝶时时舞,自在娇莺恰恰啼。不是爱花即肯死,只恐花尽老相催。繁枝容易纷纷落,嫩叶商量细细开。对偶句是:null权重是0这首诗的题目是昼梦这首诗的作者是杜甫这首诗的内容是: 二月饶睡昏昏然,不独夜短昼分眠。桃花气暖眼自醉,春渚日落梦相牵。故乡门巷荆棘底,中原君臣豺虎边。安得务农息战斗,普天无吏横索钱。对偶句是:null权重是02017-05-12 09:14:03,121INFO[com.Davi.poems.net.myHttpClient]-返回 200服务器端日志:
    2017-05-12 09:14:02,673INFO[com.Davi.poems.net.handler]-李白|杜甫&桃花*****2017-05-12 09:14:02,778INFO[com.Davi.poems.net.handler]-result size: 66.测试背景音乐
    可以完整播放,在查询时可以持续播放。
    7.程序查询时状态
    程序查询时有卡顿,期间不能进行其他操作,无法关停音乐。
    5.3.3 测试的结论首先,软件已经完成了需求说明中的大部分方法,但是在对偶生成的诗句的工整程度上,并没有达到原诗句等级。而诗句查询方面,可以较完整的实现功能,而且查询流畅度尚佳,但是查询时系统进入无法反应状态,必须等待结果出现之后界面才会刷新。对偶句匹配因为数据原因,无法达到对于所有汉字的精确对偶匹配从结果来看结尾可惜,但改进字典库是其中一个较为关键的方向。而在对偶生成部分,结合绪论中关于研究现状的表述,在机器自动生成诗句的方向下,仅仅是根据已有的训练集在加上简单的对偶模型并不能达到完美对仗的水平。而且,在服从概率分布的随机生成汉字的算法帮助下,最好的表现情况出现在NLP分词对仗较为工整,但也接近该算法模型的极限。对偶生成的改进方向,应该从现有框架中跳出,使用新的技术才可以有革命性的进步,更加近似于人的作诗风格。根据目前的研究成果,RNN(卷积神经网络)较为适合这种对于语言层面的学习,但限于本人水平有限、没有训练集群以及神经网络研究经验,不能再本片论文中继续增加RNN模型对于对偶生成的改进。
    第6章 结论中文集句系统,是以搜索、处理诗句之中的汉字为核心理念,提供诗句搜索,诗句匹配,关键字匹配、对偶句匹配、对偶句生成等功能的软件系统。经过较完善的软件工程模型—瀑布模型的流程监督,有完整的需求分析、概要设计、详细设计、软件实现、软件测试的流程。整体系统分为3个模块,用户交互的UI模块、数据查询的逻辑作用模块以及数据载入模块,使用Java作为程序开发语言,运用JavaFX解决用户交互界面设计,采用XML作为源数据的组织形式,有客户端模式以及服务器模式两种状态,分别提供界面的功能展示以及HTTP的网络请求返回功能。在检索部分,自定义了诗句的规则描述符号,使用符号组合进行诗句查询,在对偶生成方面,运用成熟的中文分词开源包,对诗句中的中文进行分词从而获取词性信息,再加上字典上的平仄从而生成对偶词,并且在生成的字词的概率参考了数据库中诗文的汉字出现概率,提高了结果的可读性。
    程序开发参考了指导教师高晓程老师的原型Demo程序,根据本科阶段的开发经验,使用Maven管理Java的依赖,使用Git管理程序版本,使用log4j打印程序日志,部分的功能模块,如音乐播放以及服务器模式采用了线程技术,努力的使程序的运行更加流畅且效率提高。
    本系统在帮助中文诗句爱好学习诗句、联系平仄等方面有积极的帮助作用,在闲暇时查询古诗不失为放松心情、排解压力的不二选择。软件系统在诗句的搜索、数据集的拓展、字典的完善以及对偶句生成算法上依然具有广阔的进步空间,是未来改进的主要方向。
    第7章 参考文献[1] hankcs HanLP自然语言处理包开源http://www.hankcs.com/nlp/hanlp.html 2015.03
    [2] 王力诗词格律概要 北京:北京出版社,1979
    [3] Li Zhongguo, Maosong Sun. Punctuation as implicit annotationsfor chinese word segmentation[J]. Computational Linguistics, 2009 35(4):505-512.
    [4] Orcale JavaSE 8 Document about JavaFX http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm#JFXST784 2013.09
    [5] XMan JavaFX中文、OSGI、Eclipse开源资料 http://www.javafxchina.net/blog/docs 2017
    [6] Oracle JavaFX Document http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm#BABEDDGH 2013.09
    [7] hankcs 词图的生成 http://www.hankcs.com/nlp/segment/the-word-graph-is-generated.html 2014.05
    [8] hankcs 词性标注 http://www.hankcs.com/nlp/part-of-speech-tagging.html#h2-8 2014.11
    [9] 刘河生 高小榕 杨福生. 隐马尔可夫模型的原理与实现[J]. 国际生物医学工程杂志,2002 25(6):253-259.
    [10] Bilmes J A. What HMMsCan Do[M]. Oxford University Press, 2006.
    [11] hankcs 通用维比特的Java实现 http://www.hankcs.com/nlp/general-java-implementation-of-the-viterbi-algorithm.html 2014.09
    [12] 刘向威 NLP技术在中文信息检索中的应用研究[D] 天津大学, 2005.
    [13] Allenxl NLP自然语法解析 http://blog.csdn.net/lanxu_yy/article/details/37700841 2014.07
    [14] hankcs N最短路径的Java应用与实现 http://www.hankcs.com/nlp/segment/n-shortest-path-to-the-java-implementation-and-application-segmentation.html ThomasH.Cormen Charles E.Leiserson Ronald L.Rivest Clifford Stein. 算法导论 北京:机械工业出版社
    第8章 致谢至此,本篇论文即将结束。在漫长的本科学习阶段,感谢我的导师,不仅在操作系统课程中为我答疑解惑,更是在最后的毕业设计为我提供了这个有趣而富有挑战性的课题,感谢我的导员在我的学习生活中无私的帮助,感谢我的任课教师,不仅教会了我的专业知识,更教会了我学习的方法。学海无涯,虽然大学的学习即将结束,但是在计算机领域,时时刻刻都在创新,在诞生新的方式方法,毕业是新的学习开始。在毕业设计的制作方面,我遇到过瓶颈,曾经彻夜DEBUG,测试程序方法的错误与漏洞,曾为了课设而废寝忘食,最终在规定的时间内完成了任务。最后的结果无论如何,我认为已经对得起自己几个月来的努力,成果无论是巨大还是微小,都为自己本科生涯画上了一个句号。在以后的工作学习中,要戒骄戒躁,将本次的经验作为财富,努力的前进。
    最后,感谢在我本科学习生活的过程中给予我指导帮助的老师、同学们。还要感谢坚持到最后的自己,谢谢。
    1 评论 1 下载 2018-09-27 01:14:29 下载需要15点积分
  • 基于Android的智能手机安全卫士的设计与实现

    摘 要随着智能机的诞生,手机终端的上网功能越来越普及,人们也逐渐离不开智能机和3G业务。但是,与此同时网络安全事件也随之走向手机终端,各种网银骗局、软件骗局、中毒事件等等都开始日益影响手机用户的正常生活,手机终端的安全问题与电脑客户端发生的安全问题相比是有过之而无不及的,从而手机安全问题成为了业界人士和手机用户者最为担心的问题。因此,开发一款手机平台的安全卫士应用尤为必要。
    本系统是一款基于Android平台的手机安全卫士。主要的功能模块有手机防盗、通讯卫士、软件管理、进程管理、隐私保护、手机杀毒、系统优化、归属地显示功能模块。
    关键词:程序锁;手机防盗;Android
    ABSTRACTWith the advent of intelligent machines, Internet-enabledhandsets is becoming increasingly popular, Intelligent machines and 3G servicesplay important role in our daily life. However, network security event alsowill come out, such as,various online banking scam, software scam, poisoning,etc.they are beginning to increasingly affect the normal life of mobile phoneusers. the disadvantage of computersecurity issues occurring outweigh PC security problems,therefore, mobilesecurity issue became most the worried problem for the industry and mobilephone users. Hence, developing Security guards of a mobile phone application isparticularly necessary.
    This system is a Mobile Security Guards based on Android platform. The main functionmodules are mobile security, communications guards, software management,process management, privacy protection, mobile antivirus, system optimizationand attribution display .Key Words: Program Lock; Phone Theft; Android
    第1章 引言1.1 研究背景及意义随着智能手机和网络的完美结合,使得智能机的功能越来越强大,浏览网页、网络购物、视频对话都普及到各个手机终端,然而手机平台越广泛,存在的危险就越大,越来越多的安全问题出现在手机的日常运用中[1]。当我们以为只有通过网络才会使手机中毒的时候,没想到智能手机那方便快捷的数据传送方式:WIFI、蓝牙、内存卡等也使我们的手机暴露在病毒感染的危险之中。通讯设备本身所具备的便利的支付收费、支付方式都为不法份子提供了可乘之机。
    当人们已经习惯把手机当做一个移动存储设备,作为一个方便携带的移动终端时,风险并不仅来源于手机病毒,也来源于3G网络的的开放性。当手机不慎丢失或者是在手机数据传送的过程中用户数据很容易会被窃听、复制或者篡改。这不仅会面临经济损失,还会遇到甚至更为严重的隐私泄露危险。
    手机作为个人通信工具,每天跟随用户,保存了很多个人隐私。并且近年来收费电话,垃圾短信,电话和短信诈骗等层出不穷[2]。如果能从这些方面着眼,解决用户的实际问题,才是目前真正要做的。而这一类的软安全软件目前市场上也有很多,比如,一些来电显示软件,就可以很准确的告知用户来电的归属地,一定程度上杜绝了电话欺诈;另外一些软件可以由用户自定义号码黑名单,主动的屏蔽掉骚扰电话和短信。
    1.2 安全软件的现状随着移动互联网的不断发展,不少互联网厂商都看中了手机安全这块蛋糕,并已占开积极布局。国内电脑安全软件厂商360早在09年就开始推出360手机安全卫士。目前,包括金山、腾讯等互联网公司也都先后推出了各自的手机安全软件。
    学术探讨国际著名市场调查机构Juniper Research经过调查后预测,到2011年,全球手机安全市场价值将为50亿美元,不仅仅包括杀毒软件,也包括智能手机的安全接入与安全加固[3]。防病毒、防垃圾、防间谍软件是市场的大头,约占40%左右,安全接入与安全加固软件约占26%[4]。
    手机安全软件的最大作用是保护用户的手机安全,但是目前市面上的安全软件都附带了很多的东西,并不是用户真正想使用的,白白占用了很多内存。而且某些功能上给用户带来的体验也不是很好,例如金山手机卫士的程序锁功能,每次用户进入应用程序都要求输入密码,如果用户正在使用某软件的时候突然有人打电话过来,当通话结束后,用户还得再次输入密码,这样的设计使用户很苦恼。
    1.3 本文主要工作本次毕业设计所实现的手机安全卫士是基于Android系统开发的,通过研究目前Android手机用户所面临的安全问题,开发出一款手机安全与管理软件。该软件的主要能包括手机防盗,在用户手机丢失后通过绑定的安全手机号码找回手机;通讯卫士,避免用户被不必要的短信或电话骚扰;程序锁,对某些特定的应用程序加锁,当手机解锁屏幕后第一次使用应用程序需输入密码;软件管理,用户可以运行、卸载或者分享自己喜欢的应用程序给好友;进程管理,通过桌面组件快捷方式管理运行中的进程,是手机保持最佳的运行状态。整个系统主要是通过Eclipse编程实现,其中编写了大量的Android自定义组件来美化系统界面。通过用例的方式说明整个系统的设计与实现和功能描述等。
    1.4 本文的组织结构
    第1章:引言,主要包括应用的研究背景、本文主要工作和论文组织结构。
    第2章:Android相关技术介绍及分析,主要包括Android开发环境的搭建,Android项目目录结构、Activity、BroadcastReceiver、Service介绍。
    第3章:手机安全卫士分析与设计,主要是通过用例表的方式分析与设计手机防盗功能、通讯卫士功能、软件管理功能、进程管理功能、系统优化功能。
    第4章:手机安全卫士详细设计与实现,主要包括应用程序自动升级、应用程序主界面、通讯卫士、手机防盗、软件管理、进程管理、系统优化、病毒查杀、高级工具中的手机号码归属地查询和常用号码查询的实现。
    第5章:结论与展望,即对本文的总结,并提出可扩展的功能模块说明。

    第2章 Android的相关技术介绍及分析2.1 搭建Android开发环境在Android应用程序开发过程中使用的工具软件都是可以在网上免费下载的,本手机安全卫士采用的的集成开发环境为安卓官方网站提供的ADT。此外,与开发普通Java程序类似的是在Ubuntu系统下我们需要将SDK的目录添加到系统的环境变量[5]。具体的地址和安装步骤如下:
    2.1.1 搭建Ubuntu系统下Java开发环境1.到官网下载jdk文件,跳转到下载目录
    cd /home/bingo/下载
    2.解压到安装目录
    tar -zxvf jdk-7u45-linux-i586.tar.gz -C /home/bingo/install
    3.配置环境变量,在/etc/profile.d目录下新建一个叫java.sh的文件
    sudo vi /etc/profile.d/java.sh
    4.在java.sh中加入以下内容
    export JAVA_HOME=/home/bingo/install/jdk1.7.0_45export CLASSPATH=.:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar:$CLASSPATHexport PATH=JAVA_HOME/bin:JAVA_HOME/jre/bin:$PATH
    5.执行以下命令使上面的配置立即生效
    source /etc/profile
    6.输入以下命令,如果显示java的版本信息说明java环境配置成功
    java -version
    2.1.2 搭建Ubuntu系统下Android开发环境1.到官网下载sdk,跳转到下载目录
    cd /home/bingo/下载
    2.解压到安装目录,如果不存在则创建该文件夹。如果没安装解压zip格式的软件,在Ubuntu软件中心中安装7zip和rar
    mkdir /home/bingo/install
    3.配置环境变量,在/etc/profile.d目录下新建一个叫android.sh的文件
    sudo vi/etc/profile.d/android.sh
    4.在android.sh中加入以下内容
    exportANDROID_SDK_ROOT=/home/bingo/install/adt-bundle-linux-x86-20131030/sdkexportPATH=ANDROID_SDK_ROOT/tools:ANDROID_SDK_ROOT/platform-tools:$PATH
    5.执行以下命令使上面的配置立即生效
    source /etc/profile
    6.输入以下命令,如果显示adb的版本信息说明android环境配置成功
    adb version
    2.2 Android项目目录结构
    src文件夹:存放java代码的地方,通过集成开发环境单独指定源代码目录也是可以的。
    gen文件夹:这里面最关键的是R.java文件,这个文件是集成开发环境帮我们自动生成的,不能手动去更改它,否则系统会报错[7]。里面通过很多内部的静态类来指向res目录中的资源文件,如果开发中发现这个文件,那么很有可能是因为res目录总的文件内部错误或者是文件重复。
    assets文件夹:存放应用中需要用到的文件,例如存放初始化系统用到的数据库文件、音频资源文件等[8]。
    res文件夹:主要用来存放系统中的资源文件,例如布局文件、国际化的字符串文件、图像资源文件等。
    AndroidManifest.xml文件:该文件主要包含了应用程序的基本信息[9]。如果要使用Android系统中的四大组件的话则需要在文件中进行配置,还有就是系统测试和应用也需要用到系统的一些特性,因此,这些也是需要在该文件中进行配置。
    default.properties文件:在应用正式发布时为了防止别人反编译自己的代码,要在该文件中进行配置。同时也记录了应用程序开发过程中的在集成开发环境中所需要的版本信息。

    2.3 Activity2.3.1 Activity生命周期方法
    onCreate方法:当Activity第一次被创建的时候,Android系统将会会执行该生命周期方法,或者是用户在没有退出该应用程序的情况下切换到了其他应用程序,而恰好此时系统资源不够用了,这时系统就会回收该Activity,但是并未销毁该Activity。用户突然又切换到当前应用程序,此时系统就会重新执行该生命周期方法[10]。事实上,在实际开发中我们通常在这个方法中初始化界面组件和恢复当前Activity状态。
    onStart方法:每一次activity从用户不可见到用户可见的时候系统都会执行该生命周期方法,在某些对信息时时性要求高的应用程序中,需要在该方法中更新该界面的数据,例如青蛙卫士中的系统设置界面,为了避免用户使用Android系统自带的设置界面把服务停掉后回到青蛙卫士的系统界面是看到脏数据,每次显示该界面的时候都要重新获取当前正在运行的服务。
    onRestart方法:当activity对用户不可见并且没有被系统销毁的情况下,如果该activity再一次对用户可见,那么系统就会执行该生命周期方法。
    onResume方法:当activity获取焦点时,系统会执行该生命周期方法。
    onPause方法:当activity失去焦点时,系统会执行该生命周期方法,失去焦点并不是指该activity对用户不可见,而是被对话框或者其他透明的activity遮罩,用户是可以看见该activity的,只是不能点击而已,该方法与onResume方法相对应。
    onStop方法:当activity对用户不可见时,系统将会执行该生命周期方法,该方法与onStart方法是相对应的。
    onDestory:当activity被系统销毁时,系统会执行该生命周期方法。在实际开发中,通常在该方法内部做一些扫尾动作。例如解绑通过代码方式在该activity中绑定服务、取消在该activity中注册的内容观察者等。

    2.3.2 与其他应用程序交互在我们实际开发的应用程序中,很少有应用程序是单独存在的,或多或少都会使用到第三方应用程序提供的数据,例如实习期间做的一个远程会议软件,需要网服务端上传照片,为了节省开发时间就是直接使用系统自带的相机拍照。这里就已这个例子来介绍Android系统中各应用程序之间的交互。在我们自己应用程序的activity中,把要拍摄照片的全路径名存放在intent中,并且在intent中加入照相的动作和类型,(系统会筛选出手机中所已安装的照相机供用户选择),将该intent对象作为参数传递给startActivityForResult方法。程序中也调用系统自带的相册从相册中选择图片上传,但是相册和相机返回的数据是不同的,所有还需要传递一个请求码给startActivityForResult方法来区分当前操作类型,以便在onActivityResult方法中根据请求码的不同来出来不同的数据[11]。
    2.4 BroadcastReceiver2.4.1 广播接收者的分类
    普通广播:这种广播并不是同步传输的,并且可以被任意广播接收者收听。这种广播的好处是效率非常高。缺点是任意收听该广播的广播接收者都改变不了该广播中所传递的数据,同时也不能阻止别的广播接收者收听该广播。
    有序广播:该广播是依照广播接收者的优先级次序,在收听了该广播的广播接收者中根据该数据依次传递。例如有三个广播接收者X,Y,Z,优先级是X> Y >Z。那这个广播首先传递给X,其次再传给Y,最后传递给Z。每个广播接收者都可接结束广播的传递,比如Y结束了广播的传递,Z就不能收到广播消息。另外,X收到广播消息后可以对消息内容进行更改,当广播传递到Y那里的时候,广播接收者Y从广播中取到的数据就是广播接收者X放进去的数据。例如,在Android系统中接收短信广播就是有序广播。

    2.4.2 注册广播接收者的两种方式广播接收者注册方式的不同会影响其存活的时间,用清单文件配置的方式注册的广播接收者可以在其应用程序没有运行的时候继续收听广播[12],例如系统自带的电池电量不足的广播接收者,不需要专程打开某个应用程序来监听它。
    还有就是通过代码的方式注册广播接收者,这种方式注册的广播接收者只有在其应用程序运行的时候才能收听广播,在实际开发中的应用场景是时时监听广播事件来更新界面上显示的数据,当界面关闭后该广播接收者就没有存活的意思,所以就不用配置在清单文件中。
    2.5 Service2.5.1 什么是服务Android中的服务和windows中的服务类似,两者都是运行在后台用户看不见的,其存在的级别会比activity高一些,同样的也是需要在清单文件中进行配置,在主进程中运行。正因为是运行在主进程里的,所以不能直接在服务中执行需要运行很久的操作,应该单独开一个子线程来做这些长时间运行的操作,例如在后台播放音乐,在导航软件中时时获取最新的位置信息等。
    2.5.2 本地服务本地服务,顾名思义就是在某一个应用程序内容运行的服务。在服务外部通过执行startService方法来开起服务和通过执行stopService方法来停止服务。在服务的内部可以通过执行stopSelf或者stopSelfResult来停止服务。值得注意的是,同一时刻同一个服务只会有一个实例存在。
    2.5.3 远程服务远程服务,主要是应用在Android系统中各个应用之间的通信当中,通过接口并且暴露借口给其他应用程序,供其他应用程序调用。其客户端连接到服务点是通过该连接来执行服务里的方法。在执行bindService()方法连接服务时,如果是在activity中绑定的服务,则需要在activity的onDestory()方法中执行unbindService()方法来取消绑定的服务[13]。要说明的是,其中多个客户端是可以绑定同一个服务的,但一个服务只会被开起一次。
    第3章 手机安全卫士分析与设计3.1 手机防盗功能需求分析与设计
    落地有声:由于我的眼镜是透明的,经常一觉睡醒找不到眼镜,每次这个时候都想能通过手机控制眼镜发出声音以便更快的找到眼镜。落地有声就是由这个想法演变来的,如果用户的爱机刚被盗不久,那么手机还在用户附近的,如果此时设定的安全号码手机可以用,只需要用安全手机发送一条警报指令给丢失的手机,那么丢失的手机就会播放报警音乐,以便用户在第一时间找回丢失的爱机。
    换卡先知:Android手机换SIM卡都需要重启手机,每次手机重启的时候判断当前SIM卡的串号是否和被保护的SIM卡的串号是否相同,如果不相同,则手机将在后台自动发送短信给安全手机,这样就在小偷不知道的情况下第一时间得知小偷的手机号码,大大提升找回手机的可能性。
    远程开启防盗:当用户爱机没有开起防盗功能的时候,使用任意的手机发送应用和密码和远程开启防盗功能命令时可以开起防盗功能,并设置当前手机号码安全手机号码,从而为找回手机打下基础。
    通信拦截:获取丢失的爱机的外拨电话、来电号码、外发短信和收到的短信,并转发给安全手机。这样就可以爱机丢失的第一时间和盗窃者取得联系,也获取了盗窃者朋友的手机号码,进一步增加找回手机的可能性,也大大影响了丢失爱机的正常使用,使盗窃者觉得丢失的爱机拿来也无用,还给手机主人好些。
    保护隐私:当用户的爱机丢失时,通过短信发送特定的指令,可将丢失手机通讯录里面的所有联系人、通话记录以及短信内容全部删除,及时保护用户的相关隐私信息。
    充电防盗:在某些特殊的场合,用户的爱机急需充电,而用户又不在手机周围,这时开启手机充电防盗就能很好地监控手机的状况,一旦有其他人蓄意拔出正在充电的手机,手机就会立即发出警报音,并同时发送短信通知安全手机。

    设置安全号码用例说明表(表3.1)、设置报警指令用例说明表(表3.2)、远程开启防盗指令用例说明表(表3.3):
    设置安全号码用例说明表



    用例名称
    设置安全号码用例




    参与者
    用户


    目标
    设置手机丢失后找回手机的安全手机号码


    前置条件
    进入应用程序主界面


    基本事件流
    1.进入设置手机防盗界面 2.点击安全号码设置条目 3.在弹出的安全号码对话框中输入安全号码 4.点击确定按钮完成安全号码的设置



    设置报警指令用例说明表



    用例名称
    设置报警指令用例




    参与者
    用户


    目标
    设置让手机发出报警音的指令


    前置条件
    进入应用程序主界面


    基本事件流
    1. 进入设置手机防盗界面 2.点击设置报警指令条目 3.在弹出的报警指令对话框中输入报警指令 4.点击确定按钮保存报警指令



    设置远程开启防盗指令用例说明表



    用例名称
    设置远程开起防盗指令用例




    参与者
    用户


    目标
    设置远程开起手机防盗功能指令


    前置条件
    进入应用程序主界面


    基本事件流
    1.进入设置手机防盗界面 2.点击设置远程开启防盗指令条目 3.在弹出的远程开启防盗指令对话框中输入远程开起防盗指令 4.点击确定按钮保存远程开起防盗指令



    3.2 通讯卫士功能需求分析与设计
    电话拦截:将指定的号码加入电话拦截列表中,那么下次在该号码来电的时候不会通知用户,直接在后台挂断电话,防止用户被别人打骚扰电话。短信拦截:将指定的号码加入到短信拦截列表中,那么下次在该号码发送短信来的时候删除这条短信,避免用户被垃圾信息骚扰。全部拦截:将指定的号码加入到全部截列表中,那么下次该号码发送来的短信和拨打的电话都会被阻止调,避免用户被骚扰。
    添加黑名单用例说明表(表3.5)



    用例名称
    添加黑名单用例




    参与者
    用户


    目标
    添加黑名单号码到黑名单列表中


    前置条件
    进入应用程序主界面


    基本事件流
    1.进入通讯卫士界面 2.点击添加按钮 3.在弹出对话框中输入黑名单号码 4.在弹出对话框中选择拦截模式 5.点击确定按钮完成黑名单号码的添加



    3.3 软件管理功能需求分析与设计按用户程序和系统程序分类管理手机中的应用程序,可以查看、执行、卸载和分享用户程序。而系统程序只能被查看和执行。
    3.4 进程管理功能需求分析与设计目前市面上的某些Android手机性能并不是很好,多开几个应用程序就会很卡,而正在运行的程序中有些并不是用户所需要的,通过系统服务获得系统中正在运行的应用总数和手机中剩下的内存信息以及运行中进程详细信息展示给用户,然后提供后台进程停止选项,根据用户的选择终止特定的应用程序。并且提供一个桌面组件给用户,使其能在桌面上点一个按钮就能清理正在运行的应用程序。
    进程管理用例说明表(表3.6)



    用例名称
    进程管理功能用用例




    参与者
    用户


    目标
    根据用户的操作结束特定的进程


    前置条件
    进入应用程序主界面


    基本事件流
    1.进入进程管理界面 2.选择需要停止的应用程序 3.单击停止按钮结束所选进程



    3.5 程序锁功能需求分析与设计在日常生活中,好友之间可能会互相借手机打电话或者是玩游戏,但是用户不想让好友看自己手机里的某些私密应用程序,如果给手机的锁屏加上密码,那么每次解锁屏幕的时候都得输入密码,自己用着也会麻烦,而且手机解锁屏幕后给玩游戏的话好友可以操作手机上的任意一个应用程序。
    程序锁功能就是为了解决以上问题,用户不必给屏幕加密码锁,只需要给特定的应用加上应用锁就可以了,只有解屏后第一次进入加锁的应用程序才会要求输入程序锁密码,在应用解锁后只要没有锁屏的情况下,即使用户退出应用程序界面再次进入时不需要输入密码,此时如果好友再让你借手机给他玩,那么用户只需要把屏幕关闭后给他,除了用户的加锁程序,其他程序好友都可以玩。
    设置程序锁状态用例说明表(表3.7)、添加需要保护的应用用例说明表(表3.8)、移除已加锁应用用例说明表(表3.9)。
    设置程序锁状态用例说明表



    用例名称
    设置程序锁状态用例




    参与者
    用户


    目标
    按照用户指定的方式设置程序锁状态


    前置条件
    进入应用程序主界面


    基本事件流
    1. 进入设置中心界面 2. 点击程序锁条目,选择程序锁条目设置程序锁的状态



    添加需要保护的应用用例说明表



    用例名称
    添加需要保护的应用用例




    参与者
    用户


    目标
    添加应用程序到已加锁应用列表中


    前置条件
    进入应用程序主界面


    基本事件流
    1. 进入程序锁界面 2. 点击未加锁列表中的应用条目



    移除已加锁应用用例说明表



    用例名称
    移除已经加锁的应用用例




    参与者
    用户


    目标
    从已加锁应用列表中移除应用程序


    前置条件
    进入应用程序主界面


    基本事件流
    1. 进入程序锁界面 2. 点击已加锁标签 3. 点击已加锁列表中的应用条目



    3.6 手机杀毒功能需求分析与设计手机安全厂商和各大应用市场收集了市面上常见的病毒软件,本功能需要收集他们所提供的病毒软件的包名,将其存储到本地数据库中,在执行病毒扫描的时候将手机中所有已安装的用户程序包名与病毒数据库中的包名进行对比,如果相同则询问用户是否卸载该应用程序。
    3.7 系统优化功能需求分析与设计清理应用程序缓存在手机中的缓存数据,但是这需要具备root权限,所以本应用的实现方式打开系统自带的查看应用程序详细信息界面,在该界面中清理缓存数据。
    3.8 自动升级功能需求分析与设计升级方式用例说明表(表3.10)、自动升级用例说明表(表3.11)。
    升级方式用例说明表



    用例名称
    应用升级方式用例




    参与者
    用户


    目标
    按照用户指定的方式设置应用升级方式


    前置条件
    进入应用程序主界面


    基本事件流
    1. 进入设置中心界面 2. 点击自动更新条目,选择升级方式



    自动升级用例说明表



    用例名称
    安全卫士自动升级用例




    参与者
    用户


    目标
    在wifi打开的情况下,按照用户指定的升级方式升级应用程序


    前置条件
    进入安全卫士欢迎界面


    基本事件流
    1.用户允许手机安全卫士应用程序 2.程序自动判断应用程序当前版本和服务器最新版本,并显示 3.在弹出的对话框中选择立即更新



    第4章 手机安全卫士详细设计与实现4.1 欢迎界面实现该界面的主要功能是显示软件升级信息和初始化应用程序,如果服务器的最新版本和当前版本相同则显示应用的当前版本信息,否则显示提示升级信息对话框,用户根据需要自行决定是否升级。
    欢迎界面提示用户升级应用的实现如图4.1所示:

    欢迎界面正在升级应用程序的实现如图4.2所示:

    4.1.1 检查升级功能实现判断当前用户是否设置了自动更新应用程序,手机有没有链接wifi,如果有设置自动更新并且已链接wifi,则从服务器获取最新版本信息和本地版本对比,如果本地版本号低于服务器版本号,则弹出升级对话框供用户选择是否立即升级。
    4.1.2 升级对话框显示功能实现升级对话框采用自定义的对话框,创建一个自定义对话框类继承于Dialog类,其关键是编写自定义布局文件和重写构造方法,实现该对话框能在应用的其他功能模块中能重用。
    首先通过抽取样式文件,达到样式代码的重用,然后通过重写构造方法,根据不同的应用场景传递不同的参数,达到自定义对话框的重用。
    4.2 应用程序主界面实现应用程序主页是展示程序的各个功能模块,从而使用户能够快速进入到自己想使用的功能。该界面的另一个很重要的功能就是修改程序锁密码,在该界面连续三次点击菜单按钮弹出修改密码对话框。
    其中,应用程序主界面密码认证的实现如图4.3所示:

    应用程序主界面功能列表的实现如图4.4所示:

    4.3 程序锁实现通过帧布局实现Android界面的复杂布局,在页面的底部放置两个按钮控制FrameLayout里的两个ListView的显示与否,模拟出TabHost的效果。由于已加锁应用和未加锁应用列表极其相似,所以这里只需在编写一个ListView适配器,在适配器中通过一个flag标记区分当前适配器是未加锁适配器还是已加锁适配器。为了提升程序锁的运行效率,不每次都从数据库中获取最新已加锁应用程序列表,而是用两个集合来分表保存已加锁应用程序和临时不需要保护的应用程序,在每一次收到锁屏事件的时候清空临时不需要保护的集合,在解锁某一个应用程序的时候将该应用程序加入到临时停止保护的集合中。需要注意的是,这里需要通过代码的方式注册监听锁屏事件的广播和解屏事件的广播。
    已加锁应用界面的实现如图4.5所示:

    未加锁应用界面的实现如图4.6所示:

    程序锁密码认证界面的实现如图4.7所示:

    4.4 手机防盗实现手机防盗界面主要是编写ListView及其适配器,根据用户点击不同的条目弹出不同类型的自定义对话框,有些对话框功能不同,但是内容的格式完全相同,这就需要重写自定义度画框的构造方法,根据传入参数的不同显示不同内容和类型的自定义对话框。
    手机防盗功能列表界面的实现如图4.8所示:

    手机防盗界面设置安全手机号码界面的实现如图4.9所示:

    4.5 手机杀毒实现在Android系统中,每一个应用程序都有一个签名信息。通过反编译360手机安全卫士,获取离线病毒数据库,该数据库中存放了世面上已经存在的病毒应用的签名的MD5信息。当用户进入手机杀毒界面时,通过系统API提供的包管理器获取系统中已安装应用的签名MD5信息,并与离线数据库中的信息对比,如果该签名信息在病毒数据库中存在,则弹出对话框提示用户卸载包含病毒信息应用的应用程序。
    正在扫描病毒界面的实现如图4.10所示:

    发现病毒应用提示用户卸载界面的实现如图4.11所示:

    4.6 系统优化实现通过系统API提供的包管理器获取每个应用程序所占的存储空间,并通过ListView展示给用户,由于Google工程师为了提升Android系统的安全性,没有Root权限不能删除其他应用的数据信息,本应用的实现方式是当用户点击某个应用条目时,通过显式意图跳转到系统自带应用数据信息清理界面清理缓存数据。
    系统优化界面的实现如图4.12所示:

    4.7 通讯卫士实现通讯卫士界面主要也是便表列表和适配器,在注册监听电话到来和短信到来事件的广播接收者时,需要将其优先级设置到最大值,以确保本应用最先收到这两个广播事件,在第一时间挂断电话以及删除最近一条通话记录和短信记录,避免用户看到脏数据。
    黑名单管理界面的实现如图4.13所示:

    添加黑名单界面的实现如图4.14所示:

    4.8 软件管理实现通过系统API提供的包管理器,获取手机中已安装的应用程序并通过ListView展示给用户,当用户点击某个应用条目后,通过弹出PupupWindow显示功能对话框。当用户点击运行按钮时,通过显式意图运行某个应用程序。当用户点击卸载按钮时,通过隐式意图调用系统软件管理器卸载软件。当用户点击分享按钮时,通过调用系统短信发送器发送要分享的应用的基本信息以及在GooglePlay上的下载地址给好友。
    软件管理界面的实现如图4.15所示:

    4.9 高级工具实现高级工具主要提供手机号码归属地查询和常用号码查询功能。通过反编译QQ通讯录,获取手机号码归属地数据库,将用户输入的手机号码与该数据库中的数据进行匹配获取手机号码归属地并显示给用户。通过互联网获取常用手机号码,并录入到自定义数据库中,用户查看常用号码时将该数据库中的数据显示给用户,当用户点击通用号码条目时,通过隐式意图跳转拨号界面。
    号码归属地查询界面的实现如图4.16所示:

    常用号码查询界面的实现如图4.17所示:

    4.10 系统设置实现系统设置界面的难点是通过自定义组合控件的方式实现自定义view,从而使每一个设置条目只需要引用一个组件,实现代码的复用。为了防止用户打开android系统自带的设置界面关掉安全卫士中的某些服务出现脏数据,每次显示该界面的时候必须在onStart方法内重新获取最新数据。
    系统设置界面的实现如图4.18所示:

    来电归属地运行效果界面的实现如图4.19所示:

    第5章 结论与展望5.1 结论半年前,对毕业后有着强烈意愿从事Android开发工作的我,选择了基于Android平台的手机安全卫士的设计与实现这个课题作为我的毕业课题,在长达三个月的Android实习工作中学习到了从事Android开发工作必备的一些技能,例如屏幕适配、兼容多版本系统等,了解了移动应用程序开发的基本流程,同时在老师的细心指导下完成了我的毕业设计作品《青蛙卫士》。
    由于Android是基于Linux系统的,所以我尝试着去学习Linux操作系统,在这半年里我学会了Ubuntu系统中开发人员必备一些技能,例如掌握Ubuntu系统下开发Android应用程序的能力,学会使用Ubuntu系统中的常用办公软件等。在编写青蛙卫士的过程中巩固了Android的基础知识,通过看别人的技术博客掌握了Android中常见动画效果、编写自定义组件、编写自定义组合控件以及加深了对Framework层API的印象,从以前看教学视频学习编程过度到看技术博客学习编程,为以后的职业生涯打下了坚实的基础。
    5.2 进一步工作的方向目前为止,青蛙卫士的功能基本上都实现了,但是在一些功能中仍存在不完善之处,例如手机防盗模块没有实现每次手机重启完毕后调用系统前置摄像头拍照以便手机丢失后获取小偷的长相、没有加入第三方平台用户登录、没有编写后台管理系统上传和恢复用户数据等。作为一个手机安全卫士,功能还需在日后的工作中进一步地考查调研并完善。
    参考文献[1] 彭海文. 移动通信进入后G时代­—移动互联网之战一触即发[J]. 新潮电子,2008(1):26-28.
    [2] 陈昱,江兰帆. 基于Google Android平台的移动开发研究[J]. 福建电脑,2008(11):156-157.
    [3] 白文江. 基于Android平台的移动应用开发研究[J]. 太原大学学报,2011(3):117-120.
    [4] 刘一静,孙莹,蔺洋.基于手机病毒攻击方式的研究[J] .信息安全与通讯保密,2007(12):57-60.
    [5] 王浩. Ubuntu下搭建Android开发环境[EB/OL]. http://www.cnblogs.com/bingoogol/p/ubuntu-environment-android.html,2013-11-16/2014-05-11.
    [6] 田森,李大和. 用Android开发手机应用[J]. 程序员,2008(1):56-61.
    [7] Wal Frank. UnlockingAndroid[M]. London:Mann,2009:221-223.
    [8] 李惠. 基于Android平台的个人知识管理平台的研究和设计[D]. 浙江:浙江师范大学,2011:21-22.
    [9] 李晓. 基于Android平台的手持终端应用开发与设计[D]. 湖北:湖北大学,2010:12-13.
    [10] Reto Meier. ProfessionalAndroid Application Development[M]. Wiley:Macmillan, 2009:317-318.
    [11] 姚昱旻,刘卫国. Android的架构与应用开发研究[J]. 计算机系统应用,2008(1):21-22.
    [12] 李杨,冯刚等. 基于Android的多媒体应用开发与研究[J]. 计算机与现代化,2011(4):149-152.
    [13] 王家林,王家俊,王家虎.Android项目实战—手机安全卫士开发案例解析[M]. 北京:电子工业出版社,2013:40-302.
    致 谢在老师的悉心指导下,顺利地完成了该系统的各项工作。在这系统完成之际,我要特别感谢我的导师,正是他的敦敦教诲、严格要求、耐性讲解和悉心指导给予了我莫大的帮助。他刚正的立身原则、严谨的治学态度、渊博的学识、诲人不倦、持之以恒、锐意进取的精神品质深深地铭记在我的心中,伴随我今后的发展。本论文从选题到设计、开发、调试直到最后论文撰,都倾注了老师的心血和汗水,正是老师的英明带领,才有了这次毕业设计的顺利完成,这也是我开发道路上的第一笔财富,再一次对老师的教诲之恩表示衷心的感谢。同时,也要感谢我在实习期间的同事,在系统设计与实现的过程,他们亦给予了我帮助与支持。
    1 评论 98 下载 2018-09-26 20:51:46 下载需要15点积分
  • 基于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 评论 27 下载 2018-09-26 17:05:32 下载需要14点积分
  • 基于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 评论 6 下载 2018-09-26 12:43:25 下载需要13点积分
  • 基于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 评论 27 下载 2018-09-26 12:06:20 下载需要14点积分
显示 1140 到 1145 ,共 5 条
eject