财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf_第1页
财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf_第2页
财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf_第3页
财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf_第4页
财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf_第5页
已阅读5页,还剩97页未读 继续免费阅读

财经问答系统问句解析子系统优秀毕业论文 参考文献 可复制黏贴.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

硕硕士学位论文士学位论文 (工程硕士) 财经问答系统问句解析子系统 questions parsing subsystem of financial q hashmap rule rule:lable=股东权益;累计=股东权益(n 年,增长率); hashmap pattern pattern:lable=业绩预告; date(match_all) lable=prop(_ 日 期 ) index(业绩快报披露日); hashmap unit2class unit2class:null=收盘价;元=收盘价;块= 收盘价; hashmap 哈尔滨工业大学工程硕士学位论文 - 20 - 文件 special_words.txt 中包含了所有在语义解析过程中,需要特殊处理的 词条信息。这些词条信息有的在问句预处理或语义关联词作为标记词(停止、 跨过) ;有的是特定类型的指标,需特殊处理。 其特殊处理类型与其解释如表 3-2 所示: 表 3-2 文件special_words.txt格式 处理该部分信息的类为 define 包中的 specialwords 类, 该类如图 3-8 所示: class define enumeration enumdef:specialwordtype tb_common_skip tb_common_stop fuzzy_skip fuzzy_stop trigger_skip trigger_stop ignore_trans ignore_skip interval_index forecast_index not_copy_params_index specialwords - specinfo_: hashmap + loadinfo(arraylist) 图 3-8 读取 specialwords 文件类图 3.2.3 指标信息文件 指标信息是指对指标的描述信息,如描述指标的类型(数值、时间、字符 特殊处理信息类型 信息格式举例 特殊处理信息的用途概述 tb_common_skip 省=tb_common_skip 语义树绑定通用跨过标志 tb_common_stop 以=tb_common_stop 语义树绑定通用停止标志 fuzzy_skip 和= fuzzy_skip 调用模糊查询跨过标志 fuzzy_stop 具有=fuzzy_stop 调用模糊查询停止标志 trigger_skip 包括= trigger_skip 转换字符串节点的跨过标志 trigger_stop 股= trigger_stop 转换字符串节点的停止标志 ignore_trans = ignore_trans 不需显示给用户的同义词 ignore_skip 这=ignore_skip 不需显示给用户的忽略词 interval_index 收盘价=interval_index 区间行情指标 forecast_index 预测主营业务收入增长率 =forecast_index 预测型指标 not_copy_params_in dex 大股东名称 =not_copy_params_index 不需补全参数的指标 哈尔滨工业大学工程硕士学位论文 - 21 - 串等) ,还有对其参数进行描述的信息。这些信息在指令翻译部分的十分重要。 指标信息文件的文件名分别为 ifind_index.txt 和 ifind_param.xml。 这两个文 件中的信息来自于财经客户端的本地配置文件。 ifind_index.txt 内有指标对应的原始信息,用于翻译语义树。该文件内容由 财经客户端提供。 ifind_param.xml 内有指标参数对应的系统默认值及其他选项值,用于翻译 语义树。这两个文件暂与语义关联部分无关,只负责记录翻译指令是所需要的 指标相关信息,这些信息用于在翻译指令时,将指标附带信息填入约定好格式 的指令中。 这两个文件内存储的信息保证了指令翻译的准确性。若这两个文件中的配 置信息与数据源内的信息有出入,则翻译出的指令则无法获取准确的信息,导 致答案错误。 这两个文件的格式分别如表 3-3 所示: 表 3-3 ifind_param 文件格式 ifind 包中的 indexinfo 类负责按行读取 ifind_index.xml 文件,并按照读取 的信息生成 hashmap,即指标名称与其原始信息的一一对应 关系。至此所有指标的原始配置信息都已存到内存中,以供实时查询。 文件名 文件信息格式 生成信息格式 ifind_index.xml 百万元 hashmap ifind_param.xml hashmap 哈尔滨工业大学工程硕士学位论文 - 22 - ifind 包中的 paramlistinfo 类负责读取 ifind_param.xml, 并按照读取的信息 生成 hashmap,即参数名称及其默认取值信息的一一对 应关系。至此所有指标参数的原始配置信息及取值信息都已存到内存中,以供 实时查询。 该部分类图如图 3-9 所示: class ifind ifindparam + defaultvalue: string = null + listname: string = null + name: string = null + origtype: string = null + title: string = null + unit_param: ifindparam = new ifindparam() readonly + valtype: string = null + ifindparam() + ifindparam(string, string, string, string, string) - mapvaltype(string) : string + tostring() : string ifindparamlist + datatype: string = null - info_: hashmap = null + listname: string = null - title2value_: arraylist = new arraylists. + getlist(string) : ifindparamlist + gettitle(string) : string + gettitle2vals() : arraylist + getvalue(string) : string - ifindparamlist() + loadparamlistinfo(string) : void indexinfo + changes: hashmap = new hashmapstr. + id: string = null - info_: hashmap = null - info_type_change: string = change - info_type_param: string = param + params: arraylist = new arraylisti. + pubtitle: string = null + pubunit: string = null + title: string = null + unitlist: string = null - containparam(arraylist, ifindparam) : boolean - getchangeinfo(string, indexinfo, node, hashmap) : void + getindex(string) : indexinfo + getindexname(string) : string + getindexsize() : int - getotherinfos(string, indexinfo, node, string, arraylist, hashmap) : void + getparambytitle(string) : ifindparam + getpubtitle(string) : string - getsingleinfofromnode(string, indexinfo, node) : void - indexinfo() - indexinfo(string) + loadindexinfo(document) : void 图 3-9 读取指标信息文件类图 3.2.4 其他配置文件 由于交易日期的固定性,每年的交易日都会在年初时确定下来。为了方便 确定某个日期是否为交易日,我们将这些交易日期的信息保存到交易日期文件 中。交易日期文件的文件名为 tradedates.txt。其中包含历史及最新所有交易日 信息。 其格式如表 3-4 所示: 哈尔滨工业大学工程硕士学位论文 - 23 - 表 3-4 tradedates 文件格式 文件格式 对应时间 20121231 2012 年 12 月 31 日 20121228 2012 年 12 月 28 日 20121225 2012 年 12 月 25 日 date 包的 dateutil 类中的方法 loadtradedate(),读取该文件信息后,生成 一个 hashset,即一个字符串的集合。至此所有交易日的日期信息都以 8 位数字的字符串形式,即“20010101”的形式存储到内存中,方便即时查询。 在财经领域,很多指标间的操作都已经被定义为另一个指标。为了解析的 准确性,需要在语义树调整阶段对这种情况进行检查和调整。而调整需要的信 息就是操作转换信息。这些信息保存在操作转换信息文件中。 操作转换信息文件的文件名为 op_2_index.txt。 其中包含了操作与其操作对 象对应的可替换指标信息。 其中一条信息形如“企业价值(剔除货币资金)(ev2) divide 息税折旧摊销 前利润 ebitda=企业倍数(ev2/ebitda)” ,会被 builde 包内的 operator2index 类读 取解析为 hashmap,以供后续处理时使用。 3.3 前期准备模块设计方案 前期准备是对问句进行可解析化转换后,调用分词服务。提取出词典内对 应词条的信息,并生成语义节点,最后生成 query 对象的过程。 此模块是对问句的各个词条进行分块和语义标注的过程。可以把每个语义 节点对应为一个语义块,并且这些语义块已经被赋予了准确的身份与意义。这 些信息都是语义关联必须的信息。 3.3.1 query 对象 query 对象为问句解析子系统内部,储存所有解析信息的对象。将所有解 析过程中的信息都封装为一个对象, 这是为了在解析过程中, 方便信息的传递。 除了配置文件读取模块外的其他模块都是对 query 对象内部的一个或多个 变量进行处理。 其内部结构如类图 3-10 所示: 哈尔滨工业大学工程硕士学位论文 - 24 - class qparser parseresult + ifindclientrlt_: string = null + searchurl_: string = null + uidata_: string = null + windrlt_: string = null query + disable_cache: string = disable_cache readonly - logger_: org.slf4j.logger = org.slf4j.logge. + nodes: arraylist = new arraylists. - parselog_: parselog - parserlt_: parseresult = null - qid_: string + query_src: string = query_src readonly - queryparam_: hashmap = new hashmap0;ofwhat=涨跌幅:0;$ logicnode #并且/*cate=pretreat;seg=;value=onto_logic:logictype=and;$ datenode #现在/*cate=pretreat;seg=;value=onto_date:;$ operatornode #翻倍/*cate=pretreat;seg=;value=onto_operator:operatortype =rate;isbetween=false;standard=200%;onone=true;$ sortnode #最少/*cate=pretreat;seg=;value=onto_sort:valuetype=numbe r;descending=false;k=1;istopk=true;$ 哈尔滨工业大学工程硕士学位论文 - 26 - 表 3-6(续表) 语义节点类型 对应分词词典格式 avgnode # 平 均 /*cate=pretreat;seg=;value=onto_avg:groupbyinfo= 行 业,所属申万行业;$ qwordnode #什么时候/*cate=pretreat;seg=;value=onto_qword:type=when ;$ propnode #行业级别/*cate=pretreat;seg=;value=onto_prop:;$ classnode #b 股合计/*cate=pretreat;seg=;value=onto_class:;$ strnode #齐 翔 腾 达 /*cate=pretreat;seg=;value=onto_value:prop=_ 股 票简称|大股东名称;$ triggernode #生产/*cate=pretreat;seg=;value=onto_trigger:prop=主营产 品名称;direction=both; skiplist=为|有;ofwhat=所属申万行业|经 营范围|所属证监会行业|主营产品名称|所属同花顺行业;$ 各类型语义节点及其对应标注信息如表 3-7 所示: 表 3-7 各类型语义节点及其对应标注信息表 语义节点类型 应标注信息 specialnode 标注现在不能处理的操作词条的类型 changenode 标注表示趋势增减及其附带信息 logicnode 标注逻辑词条及其逻辑类型 datenode 标注时间 operatornode 标注操作符词条及其操作类型 sortnode 标注排序词条及其排序信息 avgnode 标注平均词条及其排序信息 qwordnode 标注疑问词词条及其疑问类型 classnode 标注指标词条 propnode 标注参数词条 strnode 标注字符串指标值的信息 triggernode 标注引导词的词条及其附带信息 unknownnode 不能识别类型的词条 3.4 语义关联模块设计方案 为了将语义块,即本系统中所说的语义节点之间的关系,用中根形式的树 状结构进行标示,需要将各个语义节点间根据本体关系用一定规则和逻辑进行 哈尔滨工业大学工程硕士学位论文 - 27 - 联系,也就是后文所说的语义关联。 本体关系的介入,使得语义关系较为确定,利于歧义的排除。并且这样处 理之后,该语义树成为了问句解析结果的形式化表示。 这样的树状结构,由于输出后表达直观,即利于人工对问句解析结果进行 检查,及回归测试对测试结果的比对;更重要的是中根形式的结构也利于后续 指令翻译。 语义关联模块, 即语义树的生成可大致分为五个部分: 数字及时间的解析、 语义预处理、语义树绑定、语义树调整、语义树拆分。以下就每个部分的实现 方案进行详细介绍。 3.4.1 数字及时间的解析 数字及时间的解析是为了语义树绑定做信息上的准备。 由于时间和数字在自然语言的表达方式中有很多相似,所以两者的解析密 不可分。所以数字解析时,不但需解析数字,还需将时间识别出来,以供后续 时间解析处理。 数字解析主要利用正则式对数字表达形式中的信息进行提前。由于数字的 表达方式是有限的, 并在某种程度上较为规律。 所以用正则式解析可满足需求。 并且正则式的添加较为灵活。在遇到无法解析的数字时,可根据该数字表达形 式的普遍性决定是否添加新的解析正则式。 数字解析的任务由 number 包承担,数字解析部分类图如图 3-12 所示: class number numparser + addfx(query) : void + changebylogic(query) : void + changechinesenumtoarabic(query) : void + changerangebyoperator(query) : void + changeunit(query) : void + getdatefromnum(query) : void + getnumrange(query) : void + getnumrangeforspecialtype(query) : void + getwholenum(query) : void + isbetween(query) : void numutil + getarabic(string) : string + getnumunit(string) : propunit 图 3-12 数字解析类图 其中,numparser 负责解析 numnode 功能的实现,numutil 负责中文数字 转换为阿拉伯数字的功能实现,及其他辅助功能的实现。同数字解析一样,时 间解析也是利用正则式。理由与数字解析类似。 时间解析的任务由 date 包承担,时间解析部分类图如图 3-13 所示: 哈尔滨工业大学工程硕士学位论文 - 28 - class date datecompute + getdateinfo(query) : void + getdateinfofromstr(string) : daterange dateparser + adddate(query) : void + comparewithlength(query) : void + geteffectiverange(query) : void + sequence(query) : void + tagdate(query) : void dateutil + getsplitbyrange(int, int, daterange) : arraylist + istradedate(string) : boolean + loadtradedate(arraylist) : void 图 3-13 时间解析类 其中, dateparser 提供解析时间的接口, datecomput 实现时间解析的功能。 dateutil 负责时间段按时间单位拆分、判断某日期是否为交易日等其他辅助功 能的实现。 3.4.2 语义预处理 财经领域的问句有时会隐含、缺省一些信息,而这些信息通常可由问句的 其他已知成分推理而来。为了问句解析的完整性和正确性,我们需要在语义树 绑定之前,对问句缺省的成分,和未识别的部分进行再次处理。这就是为什么 要有语义预处理模块。 语义预处理模块分为四个部分:根据趋势语义节点(changenode)的自身 信息对问句进行预处理、根据趋势语义节点(triggernode)的自身信息对问句 进行预处理、根据语义节点间的连带关系对问句进行预处理、根据语义节点间 的位置模式对问句进行预处理、 根据对未识别词条的模糊查询进行问句预处理。 以下就每个部分的实现方案进行详细介绍。 3.4.2.1 根据 changenode 的问句预处理 “增长” 、 “大幅增长” 、 “下跌” 、 “暴跌”等形容趋势的词,我们称之为趋 势词。 其经标注后为本子系统中所称的 changenode。这些词隐含了默认的比较 值,如“收盘价上涨的股票” ,其意义为“涨跌幅0 的股票” ;又如“收盘价下 跌 5%的股票” ,其意义为“涨跌幅0;def_val=0;ofwhat=涨跌幅:0;$” 。 其中描 述了词条“涨幅”的趋势“sign=+” ,是增长趋势;默认指标“区间涨跌幅” ; 默认取值“def_val=0”等信息。 3.4.2.2 根据 triggernode 的问句预处理 triggernode 的对应词条为“生产” 、 “行业”等表述特定信息的触发词。 如“生产钢化玻璃的公司” ,这里隐含的指标是“主营产品名称” ,该指标 的值为“钢化玻璃” 。但词典中并未识别“钢化玻璃” ,需由引导词“生产”推 导出“钢化玻璃”是指标“主营产品名称”的值。 3.4.2.3 根据 rule 规则的问句预处理 rule 信息则与以上补全机制不一样,它是按照指标与句中出现的关键词作 为引导,将指标转换为隐含的指标。该机制的存在是因为在财经领域内,很多 指标的趋势变化已经有另外的指标对其形容。为了问句解析的准确性,需对其 进行处理。 rule 信息是应对由某个指标遇到特定关键词需要转换成另外一个指标而 产生的。 如“净利润增长 20%” ,这句话的指标并不是“净利润” ,而是“净利润同 比增长率” 。指标“净利润”对应的一条 rule 信息为“rule:lable=净利润;增长= 净利润(同比增长率);” 。即当“净利润”左右有“增长”时,该指标应该转换为 指标“净利润(同比增长率)” 。 并且一个转换关键词只可转换一个指标。 如例句“净利润增长 20%,股价为 4 的股票” 。此句的指标分别为“净利 润”和“股价” ,但转换关键词只有一个,并且这两个指标都有这个关键词对应 的转换指标。故需按照从左至右的先后顺序进行处理。 3.4.2.4 根据 pattern 规则的问句预处理 在某些情况下,问句的隐含信息还可以由句式进行推理。这些特殊情况需 要对某些固定的句式进行语义信息的增加或对某些语义节点进行处理。这就是 为什么 pattern 信息补全问句的机制比 rule 信息更加依赖于句式。 根据 pattern 信息进行问句成分补全, 是按照关键词附近其他语义节点的对 应位置来进行处理的。 如问句“2009 年上市” ,这句的的隐含指标是“首发上市日期” 。句中的关 键词为“上市” ,其对应的一条 pattern 信息为“pattern:lable=上市;date(type) lable=prop(_日期) class(首发上市日期);” 。即当该关键词左侧出现 datenode 的 哈尔滨工业大学工程硕士学位论文 - 30 - 时候,需要推出指标“首发上市日期” 。 pattern 信息有极强的针对性。同样的关键词,附近出现不同类型的语义节 点,隐含的指标不尽相同。 如问句“2009 年增发 2 万股的股票”和问句“2009 年增发的股票” 。其对 应的pattern信息分别为 “pattern:lable=增发;date(type) lable num(gu)=prop(_ 日期) class(增发上市日) class(增发数量) prop(_数值);”和“pattern:lable=增 发;date(type) lable=prop(_日期) class(增发上市日);” 。 3.4.2.5 根据模糊查询的问句预处理 当经过以上一系列预处理之后,句中仍然有未确定身份的词条。这些未识 别的词条多数是可忽略的,如“股票” 、 “公司”等。但还有一部分,是为识别 的产品名称、人名,甚至是未识别的指标名称。这些就需要进行模糊查询,以 确定其身份,避免对问句解析造成负面影响。 如“水泥、石膏” ,只识别了“水泥”未识别“石膏” 。但又未在可忽略词 条中找到“石膏” ,故可调用模糊查询服务,对该词条的身份进行模糊查询。并 将查询结果充填回问句中。 3.4.2.6 语义预处理类图及方法说明 语义预处理由 builde 包的 pretreebuilder 类承担。 该模块类图如图 3-14 所示: class build pretreebuilder - addnodes2list(arraylist, arraylist) : void - mergerstrnodelistbylogic(arraylist, logictype) : void - mergerstrnodes() : void - mergerstrnodesfromcurrent(int, arraylist) : void + prebuild() : void + pretreebuilder(query) - removeexcesstrigger() : void - removeexcesstriggerbytriggerprop(propnode, direction, int, arraylist) : int - transrestchangetoclass() : void transinfo - pattern_: hashmap - regex_: hashmap - rule_: hashmap - unit2class_: hashmap + loadinfo(arraylist ) : void 图 3-14 时间解析类 哈尔滨工业大学工程硕士学位论文 - 31 - 其中主要方法如表 3-8 所示: 表 3-8 各类型语义节点及其对应标注信息表 方法 主要作用 transbychange() 根据 changenode 对问句进行预处理 tagstrbytriggerorfuzzyprop() 根据 triggernode 对问句进行预处理 transclassbyrules() 根据 rule 规则对问句进行预处理 transclassbypattern() 根据 pattern 匹配信息对问句进行预处理 wholequeryfuzzysearch() 若问句中未识别出任何信息, 调用模糊查询接 口,查找对应可用指标 3.4.3 语义树绑定 此处说的语义树绑定,是指将问句中的各个部分关联起来,形成一颗中根 的语义树。 为了避免歧义, 需自底向上进行绑定。 故, 首先由值节点 (datenode、 numnode、strnode、sortnode、avgnode)向指标参数节点(propnode)进行 关联,而后是指标参数向指标实例节点(instnode)进行关联。最后处理的是 指标间的关系,如操作(operator) 、逻辑(logic)等。在绑定的过程中,还要 根据本体关系补全问句中缺省的成分。 3.4.3.1 值节点的语义树绑定 值节点是指语义上类似数字、时间的排序节点和平均节点(sortnode、 avgnode) 、 数字节点 (numnode) 、 时间节点 (datenode) 、 字符串节点 (strnode) 。 这里说排序节点和平均节点类似数字和时间节点,是指这语义关联上,这两类 节点与数字和时间节点一样,都是修饰属性的。如“pe 最大”和“pe10” , 其中描述的都是指标“pe” ,但该指标的参数“_数值”的值分别是排序“最大” 和数字“10” 。字符串节点(strnode)的携带信息 ofwhat 中记录了该字符串 节点可以是哪些属性节点(propnode)的值。若问句中没有出现可以作为字符 串节点父节点的语义节点,则可以按照这两类语义节点的携带信息将问句补充 完整。值节点需与属性节点关联,是利用本体关系中对指标参数的描述。如上 文中读取本体关系文件中的示例,指标“每股经营性现金流量 n 年平均值”有 属性“*报告期年数” 。本体关系描述该指标为无单位的时间型属性。故,该属 性可以与先找到该参数的时间节点相关联。 3.4.3.2 属性的语义树绑定 在经过值节点与属性节点(及指标参数,propnode)的绑定,下一步为将 属性节点与指标节点进行绑定。 哈尔滨工业大学工程硕士学位论文 - 32 - 3.4.3.3 语义树绑定中的成分补全 绑定中根据本体关系补全问句成分,其实是在语义树绑定之前对这些特定 类型的语义节点进行检查。特别是字符串和属性语义节点,都是以指标属性或 指标属性值出现的。参数节点(propnode)的携带信息 ofwhat 记录了该参数 节点可以与哪些指标节点(classnode)相关联,即这个属性是哪些指标所有。 若问句中没有出现可以作为 propnode 父节点的语义节点,则可以按照这两类 语义节点的携带信息将问句补充完整。需要进行本体关系补全的有属性节点 (propnode) 、字符串节点(strnode) 。绑定中的成分补全是在绑定过程中进行 的,不独立与绑定过程以外。需要强调的是,所有的值节点和属性节点都在最 后生成的语义树中是不能作为根节点存在的。 3.4.3.3 指标间的语义树绑定 实意语义节点是指除逻辑节点(logicnode)及操作节点(operatornode) 类型以外的所有语义节点。故,实意语义节点的绑定是将这两种节点作为被绑 定节点或停止绑定标志, 其他节点进行语义树绑定的过程。 这部分也是由 qparse 包的 treebuilder 类进行功能实现的。 实意语义节点的绑定是先从左侧最近的节 点开始,若不可绑定则到右侧最近节点,检查是否可以绑定,以此类推。实意 语义节点绑定完成后,语义树的根节点类型只能有三种:实例节点(instnode) 、 逻辑节点(logicnode)及操作节点(operatornode) 。 3.4.3.3 语义树绑定类图及方法说明 整个语义关联部分都由 builde 包中的 treebuilder 负责,该类的类图如图 3-15 所示: class build treebuilder - query_: query + bindbyofwhat() : void + binddate() : void + bindlogicbetweenroots() : void + bindnumasdate() : void + bindnumtooperator() : void + bindnumtoprop() : void + bindoperatorforifind() : void + bindsortoravgtooperator() : void + bindsortoravgtoprop() : void + complementallroots() : void + completeboolindex() : void + inittree() : void + makerootfromunit() : void + removeboundnode() : void + removelogicnodeofsamelogictype() : void 图 3-15 时间解析类 哈尔滨工业大学工程硕士学位论文 - 33 - 其主要方法说明如表 3-9 所示: 方法名称 主要作用 inittree() 根据语义节点生成与语义树节点。 bindsortoravgtooperator() 尝试将 sornode 或 avgnode 绑定到 operatornode 节点上。 bindsortoravgtoprop() 尝试将 sornode 或 avgnode 绑定到 propnode 节 点上。 bindnumtooperator() 尝试将 numnode 绑定到 operatornode 节点上。 bindnumtoprop() 尝试将 numnode 绑定到 propnode 节点上。 binddate() 尝试将 datenode 绑定到 propnode 节点上。 bindbyofwhat() 尝试找到可以与 strnode 或 propnode 绑定的节 点,若无,由此两种节点的 ofwhat 信息中提取出默认 的可绑定的节点。 bindoperatorforifind() 尝试将 operatornode 附近的 instnode 绑定到该 operatornode 节点上。 bindlogicbetweenroots() 尝试将 logicnode 附近的 instnode、 operatornode 或其他 logicnode 绑定该 logicnode 节点上。 complementallroots() 在 logicnode 的子节点间进行参数互补。 表 3-9 语义树绑定部分方法示意 3.4.4 语义树调整 某些财经指标需要根据时间进行调整,还有某些操作其实已经有特定指标 对其形容,这些都是需要语义调整的情况。针对类似的情况,需对语义树进行 内部内容调整。又或者某些操作已经有对应指标进行描述,需要将该操作转化 为指标;还有一些类似的情况,需要根据语义树绑定的结果进行调整。这就是 为什么需要对语义树进行调整。 语义树调整是在语义树绑定完成后,对语义树的指标节点或操作节点进行 内部内容的调整。 如 “收盘价5 的股票” 、“昨天收盘价5 的股票” 、“上周收盘价5 的股票” 、 “上个月收盘价5 的股票”等,这几句中的“收盘价”在绑定后都是指标“收 盘价” 。 但事实上,以上每句中的“收盘价”都指的是不同的指标。其具体指标对 应如表 3-10 所示: 哈尔滨工业大学工程硕士学位论文 - 34 - 表 3-10 收盘价不同时间对应转换指标表 例句 指标 收盘价5 的股票 收盘价 昨天收盘价5 的股票 区间收盘价 上周收盘价5 的股票 周收盘价 上个月收盘价5 的股票 月收盘价 去年收盘价5 的股票 年收盘价 语义树调整主要由 builde 包的 treeadjust 类负责实现。该部分的主要方法 说明如表 3-11 所示: 表 3-11 语义树调整方法表 方法名称 主要作用 adjustinst() 调整 instnode adjustop() 调整 operatornode 本身,及其操作对象(instnode) adjustlogic() 调整 logicnode 的子节点 实现所需要的配置信息由 define 包的 specialwords 类负责提供。该类提供 了有哪些指标需要特殊处理,并根据指标特殊处理类型的不同,还提供了其他 如默认时间参数等信息。 该部分的类图如图 3-16 所示: class build treeadjuster - query_: query + adjustinst(arraylist, int, treenode) : void + adjustlogic(arraylist, int, treenode) : void + adjustoperator(arraylist, int, treenode) : void + doadjust(arraylist, int, treenode) : void define:specialwords - specinfo_: hashmap + loadinfo(arraylist) 图 3-16 语义树调整类图 3.4.5 语义树拆分 在财经领域内的问句,常常将两个甚至多个条件表示成一个条件。为了利 哈尔滨工业大学工程硕士学位论文 - 35 - 于后续命令翻译,需将有的表示成一个条件的多个条件的指标,拆分为多个指 标。 即语义树拆分。 如 “收盘价大于 4 小于 5 的股票” , 又如 “连续三年 roe10 的公司” 。这两句的条件拆解如表 3-12 所示: 表 3-12 各类型语义节点及其对应标注信息表 例句 拆解出的条件 条件间逻辑 收盘价大于 4 小于 5 的股票 (1)收盘价大于 4 (2)收盘价小于 5 and 连续三年 roe10 的公司 (1)大前年 roe10 (2)前年 roe10 (3)去年 roe10 and 近三年有年涨幅100%的 公司 (1)大前年年涨幅100% (2)前年年涨幅100% (3)去年年涨幅100% or 该部分的类图如图 3-17 所示: class build indexsplitinfo + index_: treenode = null + logic_: logictype = logictype.and + repvals_: hashmap = null - addnewparamtorepinfolist(propnode, arraylist, arraylist) : void + addrepval(propnode, semanticnode) : void + addrepvals(propnode, arraylist) : void - checkforindexneedtoavgorsort(treenode, hashmap) : boolean + indexsplitinfo(treenode) - makerepinfo(hashmap) : arraylist + makereplacenode() : treenode indexdefdateinfo + index_: treenode + logic_: logictype + repvals_: hashmap + makereplacenode() : treenode posttreebuilder - query_: query + postbuildinsttn(arraylist, int, treenode) : void + postbuildlogictn(arraylist, int, treenode) : void + postbuildoperatortn(arraylist, int, treenode) : void + postbuildtreenode(arraylist, int, treenode) : void 图 3-17 语义树拆分类图 为了处理类似问句的条件拆分,方便后续指令翻译部分的处理,在此部分 拆分所有需拆分的条件。 该部分的 posttreebuilder 类主要方法说明如表 3-13 所示: 哈尔滨工业大学工程硕士学位论文 - 36 - 表 3-13 语义树拆分方法表 方法名称 主要作用 splitinst() 拆分 instnode splitop() 拆分 operatornode splitlogic() 拆分 logicnode 的子节点 另两个类,indexdefdateinfo 类提供了拆分指标的默认时间属性及时间单 位信息,indexsplitinfo 类为拆分指标信息的临时储存对象。 3.5 指令翻译模块设计方案 指令翻译是将语义树翻译为查询指令和操作指令的过程。生成的所有指令 均交予 coordinator 子系统进行处理,本子系统不直接接触数据源。语义树翻译 部分的功能由 compile 包负责实现。 现阶段问句解析子系统应用于两个系统,其一是我所在的搜索部门开发的 财经问答系统,其二是与财经机构版部门合作开发快捷选股。两者的翻译不尽 相同。条件列表的生成由 ifindcompile 类负责,针对快捷选股的指令生成功能 由 compile 包中的 ifindcltcompiler 类完成,针对财经问答系统的指令生成功 能由 compile 包中的 ifindsrvcompiler 类完成。 该部分类图如图 3-18 所示: class compile ifindwebcompiler + compilefromweb() : arraylist + ifindwebcompiler(query) ifindcompiler + conds_: arraylist + docompile() : void ifindcltcompiler + compile() : void 图 3-18 指令翻译模块类图 ifindcompiler 类中的方法 docompile()将语义树翻译成先根形式的条件列 表。由于先跟形式的条件列表若不加限制会有歧义。故,在条件(condition) 内部约束了该条件可以对其后几个条件进行约束。这样,条件列表就消除了歧 义。 哈尔滨工业大学工程硕士学位论文 - 37 - 3.6 本章小结 本章描述了本子系统的整体设计方案,并按模块不同分别描述了每个模块 的设计方案。配置文件读取模块小节分别描述了各个配置文件的格式及内部信 息, 描述了配置文件读取的设计方案; 前期准备模块小节描述了该模块的功能, 及设计方案;语义关联模块小节描述了语义关联各部分的功能及设计方案;指 令翻译小节模块描述了针对不同应用和不同数据源指令翻译的不同,及该部分 的设计方案。 哈尔滨工业大学工程硕士学位论文 - 38 - 第 4 章 系统实现 4.1 配置文件读取模块实现 现阶段,系统中的配置文件类型有两种:txt、xml。为了统一读取过程, 这两种格式的文件分别会先读取为如表 4-1 所示的对应格式: 表 4-1 各类型语义节点及其对应标注信息表 文件类型 读取格式 txt arraylist xml nodeslist 随后再根据文件内容的不同分别解析。 4.1.1 本体关系文件 解析本体文件的流程如图 4-1 所示: 开始 结束 nodeslist是否为空 节点是否有效 i=0 取位置为i的节点 (node

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论