目录

1、介绍

2、基于模式匹配的方位词识别

2.1 方位词用法词典

2.2 方位词识别模式库

3、基于依存关系的射体和界标识别

3.2 基于依存关系的界标识别

3.3 基于依存关系的射体识别

3.4 射体和界标的描述文件生成

4、 基于Java3D的场景自动生成

4.1 相关技术介绍

4.2 模型库的建立

4.3 描述文件对应的场景信息生成


1、介绍

自然语言描述的空间实体自动摆放的研究过程中有很多需要解决的问题,这是因为自然语言的多样性还有其二义性,计算机由于没有人类的本身具有的先验知识因此使得计算机无法理解自然语言。自然语言的多样性导致不同的语境下同一个词语表达的含义不同,一个句子调整一下句型含义就会完全变化,这就要求我们结合上下文为计算机提供一个可以用于推理的知识库。虽然我们极力做到系统的输入是不受限的自然语言,但是由于自然语言中存在的各种比喻、拟人等修辞手法导致计算机不能完全理解这些输入,因此我们对系统的输入做出了简化处理以应对计算机不能理解的情况。

本文针对自然语言描述的空间实体自动摆放中的关键问题进行了研究,以计算机语言学和计算机图形学位相关理论依据,实现自然语言到三维场景的自动生成。系统由语言处理模块、方位词识别模块、射体和界标识别模块、场景展示模块四部分组成。系统流程如下:输入一段文本内容,由语言处理模块对这段文字进行自然语言处理,输出带有词性标注和分词的文本;方位词识别模块接收上一模块的文本内容将方位词识别出来;射体和界标识别模块将与上一模块识别出来的方位词相关联的射体和界标识别出来,同时生成一个描述文件,描述文件中记录了射体和界标的相关属性;场景展示模块接收上一模块的描述文件,从模型库中提取出射体和界标对应的模型文件进行摆放。

语言处理模块:我们对输入的自然语言进行分词、词性标注以及语法析,得到带有依存关系的句子。在处理过程中,文字经过不同组件的处理并没有丢失信息。在语言处理模块,由于分词等自然语言处理都是计算机自动完成,但是会存在分词错误或者出现其它我们不期望的结果,因此我们对这些情况进行了手动修改,以保证后续工作的正常进行。然后将处理过的文本传递给下一个模块。

方位词识别模块:方位词知识库的构建分为三大部分:方位词词典、方位词模式库、方位词语料库。基于模式匹配的方位词识别需要在方位词词典的基础上搭建方位词模式库,通过在方位词语料库上实验,修改了方位词模式库中的部分模式并调整了各模式的顺序,提高了方位词识别的准确率。方位词识别在场景摆放中起到了至关重要的作用,我们将方位词的用法进行了细致的分类,方位词的有些用法并不能用场景来展示,因此在方位词识别这里就将这些不能进行场景展示的情况统一分到一类里面,排除了很多无法进行场景展示的情况,为今后的射体和界标的识别提供了便。

射体和界标识别模块:从射体和界标的语义特性出发阐述了他们的词性等特征,根据句子的依存结构提取出我们感兴趣的关系谓词二元组。通过分析射体和界标在句子中的位置以及它们充当的不同的词性阐述了各自的识别方法。射体的识别分为简单射体识别和复杂射体识别,简单射体是指句子中至多出现一个射体;复杂射体是指在同一句话中有一个以上的射体。界标的识别也分为简单界标和复杂界标识别,简单界标是指句子中至多出现一个界标;复杂界标是指在同一句话中有一个以上的界标。在这一模块要提取关于射体和界标的颜色、尺寸等信息,将这些信息全部到 Des.xml 文件中,以备后面的场景摆放使用。

场景展示模块:这一模块主要接受来自上一模块的关于场景摆放的各种信息,将这些信息进行整合处理构造出场景图。在这一模块我们要加入背景信息、实体的大小信息等。还要对物体的摆放路径进行规划并且检测场景中的物体是否有重叠现象。同时对于自然语言的隐含信息我们也在这一模块中运用规则来进行优化摆放。

处理过程如图 1-1 所示:

2、基于模式匹配的方位词识别

具体工作:(1)根据现有词典《现代汉语八百词》、《现代汉语虚词词典》抽取出方位的用法并将其分类总结填写进方位词词典,包括方位词的义项以及用法和例句。 (2)根据方位词用法词典中罗列的方位词义项以及用法编写方位词识别模式库。 (3)在语料库上进行方位词的人工标注,分析方位词的自动识别结果,将其与人工标注结果相比较,进一步修改并完善模式库中的模式。通过分析真实语料补充方位词词典。

2.1 方位词用法词典

单纯方位词有14个:上、下、前、后、东、西、南、北、内、左、右、里、外、中。由于除单纯方位词外还有许多合成方位词,其数量非常庞大,统计耗时,因此在实验中仅将单纯方位词作为研究对象进行了分析,对于“上面”、“上边”、“下面”等虽然也是合成方位词,但是由于其出现的概率很大,因此我们也将其一并进行分析。通过查阅《现代汉语八百词》、《现代汉语词典》、《现代汉语虚词词典》等,我们整理了方位词的用法和例句,并将这些方位词编写入我们的方位词用法词典中,在方位词用法词典中,我们为每个方位词的义项均描述了其用法还在后面添加了例句,以便于以后构建方位词模式库。例如方位词“下”,在《现代汉语八百词》中可以查阅到方位词“下”,其中将“下”分为 10 种不同的用法以及一种释义“位置低”,整理“下”的用法,写入方位词用法词典,见表 2-1:

目前,方位词词典收录了14个单纯方位词,用法共计152个。

2.2 方位词识别模式库

方位词识别模式库是根据方位词用法词典,将判断方位词用法的条件进行提炼,用正则表达式BNF对这些判断条件进行描述,从而可以根据这些有序的正则表达式对方位词自动识别。(名词与介词搭配方位词使用)

目前关于方位词的特征集如表2-2

(1)方位词模式库的构建

通常的方位词短语搭配:名词、介词、动词,通过不同的句法编写正则表达式。

方位词+名词的用法描述: 方位词后面搭配名词用来表示所处、次序或者时间,例如“上”->“上游”、“上半年”、“上一次”。

^R→n

通过对“方位词+名词”的例句考察发现可以进一步分为三类模式,如下:

表示所处:R[N]^R→肢|风|游|半截^N→层

表示时间:R^R→q|t|n

表示次序:R^R→回|次|遍|批|遭

名词+方位词的用法描述:方位词前面搭配名词用来表示位置、范围等。例如“上”->“山上”、“书上”、“十岁上”等。

^L→n

通过对“名词+方位词”的例句的考察发现可以进一步将其分成四类模式,如下: 
表示物体的顶部或表面:L^L→n 
表示范围:L^L→书|报|世界|课堂|村|历史|岗位|*会 
表示方面:[M]L^M→往|在|从|p^L→研究|事实|问题|思想|口头|任务 
表示“~的时候”:L^L→岁

动词或小句+方位词的用法描述:方位词前面搭配动词或者一个小句指某方面,前面的介词常用“在、从”。例如“上”有“他在学习山大有进步”。其对应的用法模式描述为: 
M|L^M→在|从*(n|r)*(v|a)^L→v|vn 
名词用 n 表示,代词用 r 表示,动词用 v 表示,形容词用 a 表示。主语是名词 n 或代词 r,谓语是动词 v 或形容词 a,主语后面可以跟其他词语也可以直接是谓语。

介词+方位词的用法描述 :方位词前搭配“朝、向、往、从”等介词用如名词。例如“上”,有“向
上拉”、“朝上看”、“往上涨”等。其对应的用法模式描述为: 
L^L→在|朝|向|往|由|自|p 
在这一模式中,列出的都是常用的搭配介词,但是并没有覆盖所有的介词,因此最后添加了介词词性 P。

(2)方位词模式库存在的问题及解决方案

调整各模式之间的顺序: 
在方位词用法词典中,每个方位词不是只有一个用法,所以会有一组模式用来识别方位词的不同用法。在对方位词的识别中,如果按照顺序进行匹配,则前面的模式默认情况下比后面的模式优先级高,因此我们需要调整模式的顺序,  将判断条件最多且不覆盖其他模式的放在最前面。这部分工作需要结合方位词语料库,在语料库的基础上逐条进行修改。 
例如“上”,其模式描述如下: 
$上 
@<f_shang4_1a>→R^R→有|不|无 
@<f_shang4_1b>→L^L→在|朝|向|往|由|自|p 
@<f_shang4_1c>→R[N]^R→肢|风|游|半截^N→层 
@<f_shang4_1d>→R^R→q|t|n 
@<f_shang4_1e>→R^R→回|次|遍|趟|批|遭 
@<f_shang5_1a>→L^L→书|报|世界|课堂|村|历史|会议|颁证会|音乐会|岗
位 
@<f_shang5_1b>→L^L→n 
@<f_shang5_1c>→[M]L^M→往|在|从|p^L→研究|事实|问题|思想|口头|任
务  
@<f_shang5_1e>→L^L→v|vn 
对于编码为<f_shang5_1c>的用法描述,该用法对应的例句“在事实上”,按照原有的模式顺序,会将例句中的“上”标注为<f_shang5_1b>,为了能够正确识别,可以将<f_shang5_1c>的用法调整到<f_shang5_1b>的前面。 
调整后的“上”的一组模式的排序为: 
$上 
@<f_shang5_1a>→L^L→书|报|世界|课堂|*史|*会 
@<f_shang5_1c>→[M]L^M→往|在|从|p^L→研究|事实|问题|思想|口头|任
务 
@<f_shang5_1f>L^L→基础|程度|物质|根本 
@<f_shang5_1b>→L^L→n 
@<f_shang4_1a>→R^R→有|不|无 
@<f_shang4_1b>→L^L→在|朝|向|往|由|自|从|p 
@<f_shang4_1c>→R[N]^R→肢|风|游|半截^N→层 
@<f_shang4_1e>→R^R→回|次|遍|趟|批|遭|届 
@<f_shang4_1d>→R^R→q|t|n 
@<f_shang5_1d>→L^L→岁 
@<f_shang5_1e>→L^L→v|vn 
对方位词语料库中的手工标注和自动标注的结果对比,初步调整了方位词模式库中的模式顺序,并没有对单个模式进行修改,这部分工作将会在后面介绍,初步的顺序调整为方位词的自动识别的正确率提供了有力的保障。

2.3 方位词识别实现过程

(1)语料收集和处理

采用计算机自动处理以及人工干预相结合的策略,分词和词性标注使用ICTCLAS。

(2)方位词自动识别

基于模式匹配的方位词自动识别,例如句子“在/p  和平共处/l  五/m  项/q  原则/n  的/u  基础/n  上/f  努力/ad  发展  同/p  世界/n  各国/r  的/u  友好/a  关系/n”。按照分词结果将句子划分,然后储存到二维数组中,词和词性一一对应存放。二维数组如表 2-3 所示。

根据方位词模式库中模式的描述,判断该方位词属于哪种模式,并且把该模式的编码标注在该方位词之前。流程如图2-2

例如,方位词“下”的一组模式描述如下: 
$下 
@<f_xia4_1a>→R^R→有|不|无 
@<f_xia4_2a>→L^L→在|朝|向|往|由|自|p 
@<f_xia4_1b>→L^L→n 
@<f_xia4_2b>→R^R→里 
@<f_xia4_3b>→L^L→节|年 
@<f_xia4_4b>→L^L→地|手|眼|私|乡 
@<f_xia4_1c>→R[N]^R→腹|游|半段|层^N→层 
@<f_xia4_2c>→R^R→q|t|n 
@<f_xia4_3c>→R^R→一个|一批 
@<f_xia4_4c>→R^R→等|级|策|品 
@<f_xia4_1d>→[M]L^M→往|在|从|p^L→条件|帮助|带动 
下面是方位词“下”在语料库中自动识别的结果: 
在/p  非常/d  困难/a  的/u  条件/n  {  f_xia4_1d,下  }下/f  他们/r  还是/d 
出色/a  地/u  完成  了/u  任务/n 
本文采用准确率衡量方位词自动识别结果:

其中,C2是正确识别的句子的个数,C1是全部标注的句子的个数。

完善方位词模式库:例如:方位词最常用的用法是搭配在名词后,组成方位词短语用来表示处所或时间,对该用法的描述为“名词+~”的形式,其对应的模式描述为: 
@<f_shang5_1b>→L^L→n 
通过对大量例句的考察,发现此处的名词并不局限于词语为 n 的名词,实际上还包括词性为 j(缩略语)、r(代词)、s(处所词)、t(时间词)等几类词,因此将模式修改为: 
@<f_shang5_1b>→L^L→n|j|r|s|t 
同时进一步调整了方位词模式中各模式的顺序,以期达到准确率最高。

修改语料库中待标注句子中的分词错误或词性标注错误:例如: 
桌子/n  上面/f  有  一/m  支/q  笔/n 
在识别时,由于我们只考虑单纯方位词,因此此时“上面/f”就不会被识别,所以我们人工将“上面/f”调整为“上/f”。

3、基于依存关系的射体和界标识别

3.1 依存关系结构

依存关系表示句子中各个词之间的关系,分析句子的依存关系,我们可以得到某个词的依赖对象,还可以知道有哪些词依赖该对象。例如分析句子的定中关系我们可以得到空间实体的某些颜色、大小属性,为后面渲染场景提供参数。如句子“桌子上放着一本红色的书”,这句话的依存关系如图 3-1所示,箭头尾指子节点,箭头指父节点,父节点是子节点的依存对象:

(1)基于规则的射体识别

由于界标与射体存在明显的名词属性,因此我们使用基于规则的方法识别射体与界标,首先分析射体的五大类特征,然后用形式化的语言描述出来,然后对其进行排序设定优先序列。射体的五大类特征如下: 
(1)词性特征:射体在句子中的词性。 
(2)动词特征:射体与所在句子的动词的距离。 
(3)“把被”特征:射体与所在句子中“把”或“被”的距离。 
(4)语义特征:利用 HowNet 得到射体的上位义原集合。 
(5)方位词特征:射体与所在句子中的方位词的距离。 
对系统实验的评价指标:我们采用准确率(precision)、召回率(recall)和 F 值来评价系统性能。具体定义为:

可以看出来,识别准确率并不高,造成召回率低的现象。

(2)基于规则的界标识别

基于规则的界标的识别中我们依然分析了界标的五大类特征,并将这些特征进行了描述,并且定义了识别的优先顺序。界标的五大类特征如下: 
(1)词性特征:界标在句子中的词性。 
(2)动词特征:界标与所在句子的动词的距离。 
(3)“把被”特征:界标与所在句子中“把”或“被”的距离。 
(4)语义特征:利用 HowNet 得到界标的上位义原集合。 
(5)方位词特征:界标与所在句子中的方位词的距离。

从结果看出,识别结果不理想。为了提高射体和界标的识别准确率,我们提出了基于依存关系的射体和界标识别(分为简单/复杂的射体和界标识别算法)。

3.2 基于依存关系的界标识别

界标为射体的摆放提供了方位参考,界标的摆放决定了射体相对界标的位移。在名词后搭配方位词时,方位词是作为定语来修饰名词中心语的,依存关系ATT表示的就是定语和名词中心语的关系。简单界标识别指的是一句话中至多有一个界标:一种是界标是方位词的直接依存对象;另一种是界标是方位词的间接依存对象。复杂界标识别指的是一句话中有多个界标:一种是界标在前后小句中相同;另一种是界标在前后小句中发生了变化,这其中还分为界标是否是前句中的射体。

(1)简单界标识别

考察依存关系 ATT 中方位词的直接依存对象是界标的情况。 例“房顶上落着一只小鸟”这句话的依存关系如图 3-2 所示:

例“他站在房子前”这句话的依存关系如图 3-3 所示:

考察依存关系 ATT 中方位词的直接依存对象不是界标的情况。 例“大象的背上有一只蚂蚁”这句话的依存关系如图 3-4 所示:


在上图可以看到依存关系 ATT(上—>背)、(背—>大象),此时方位词“上”的直接依存对象并不是界标,但是“背”的直接依存对象是界标。我们在第4点详细介绍了数据库 dic 的构建,在数据库 dic 中我们有名词表,在名词表中我们查找“背”,从它的义原得知“背”是部件并且没有对应的模型文件,因此不能作为界标。查询“大象”得到义原“beast|走兽”确定大象是界标。 
简单界标识别算法如下: 
①  确定方位词的依存关系 ATT。 
②  在方位词依存关系 ATT 中得到方位词的直接依存对象 X1。 
③  在数据库 dic 的表中查找 X1 的模型文件,如果有转(4),没有转(5) 
④  确定 X1 为界标。结束。
⑤  得到 X1 的依存关系 ATT,从依存关系 ATT 的到 X1 的直接依存对象X2,更新 X1 的值为 X2。转(3)。

(2)复杂界标的识别

界标在前后小句中不变 :例“玛丽坐在椅子上,椅子前面趴着一只猫”这句话的依存关系如图 3-5
所示:

在上图中,前半句“玛丽坐在椅子上”,通过之前介绍的界标识别方法可以得到界标“椅子”,后半句“椅子前面趴着一只猫”的界标也是“椅子”。通过分析看出这句话中前后部分的界标没有发生变化,在这种情况下只要将射体识别出来,然后根据方位词的不同进行摆放即可。 
界标在前后小句中发生变化 :例“玛丽坐在椅子上,桌子上有个杯子”这句话的依存关系如图 3-6 所
示:

在上图中,前半句“玛丽坐在椅子上”,通过之前介绍的界标识别方法可以得到界标“椅子”,后半句“桌子上有个杯子”的界标是“桌子”。通过分析看出这句话中前后部分的界标发生变化,“椅子”和“桌子”的位置关系在这句话中并没有体现,因此我们统一将这种情况按照在 X 轴上平移的方法进行摆放。 
界标在前后小句中发生变化,前句的射体充当后句的界标 :例“房子前面有棵树,树下有一只猫”  这句话的依存关系如图 3-7 所示:

 在上图中,前半句“房子前面有棵树”,通过之前介绍的界标识别方法可以得到界标“房子”,用下一节介绍的方法可以得到射体为“树”,后半句“树下有一只猫”的界标是“树”。通过分析看出这句话中前后部分的界标发生变化,并且前句的射体充当后句的界标。在这种情况下,虽然“树”在前后句充当的身份发生了变化,但是它们都是指的一个“树”,因此我们在载入模型时,需要判断是否已经被载入,不然会发生在场景摆放中重复出现的情况。 
复杂界标的识别算法如下: 
①  首先将复杂句子按照标点符号分解为简单小句集合 Sent{sent1、sent2、sent3……}。 
②  依次采用简单界标识别方法识别句子集合 Sent{sent1 、 sent2 、sent3……},得到界标集合 LM{LM1、LM2、LM3……}。 
③  如果 LM1、LM2、LM3……均是同一个实体 X,则输出界标 X,结束。其它情况转(4)。 
④  采用数组链表 SLM1 存放相同界标的索引。输出数组 SLM 和界标集合 LM。结束 。
例如句子“桌子上一只猫,椅子下面有一块石头,一只狗也在桌子上”。
我们得到界标集合 LM{桌子、椅子、桌子},则 SLM1 的值{2、1、2}。

(3)识别结果

我们采用了哈工大社会计算与信息检索研究中心提供的中文语言处理系统对语料库进行依存句法分析。识别结果显示比基于规则的方法效果好,但是在有些句子存在中方位没有依存关系 ATT 或者界标省略的情况,在这种情况下我们无法正确的识别界标。因此我们将基于规则的方法与基于依存关系的方法结合,在上述情况发生时采用基于规则的方法,弥补了基于依存关系的方法的不足。实验结果如表 3-6 所示,识别效果明显提升:

3.3 基于依存关系的射体识别

在语义上的射体有以下特点:一、射体一般为体积较小物体充当且结构较简单;二、射体的位置不固定在时间上也没有持久性;三、射体往往会随界标的位置变动而发生变化;四、表示射体的词语通常是名词或者代词。简单射体:一个句子中最多只有一个射体,复杂射体:一个句子里有多个射体,或者多个射体在一句话的不同分句中。

(1)简单射体

射体是主语的情况:例“小明站在桥上对我挥手”这句话的依存关系如图3-9

在上图中我们可以根据上一小节介绍的界标识别方法得到界标是“桥”。这句话的核心语是“HED  站”,根据依存关系 SBV 可以看到“站”的直接依存对象是“小明”,而“小明”就是射体。 
射体是宾语的情况:例“房子前面有两棵柳树”这句话的依存关系如图 3-10 所示:

在上图中我们可以根据上一小节介绍的界标识别方法得到界标是“房子”。这句话的核心语是“HED  有”,根据依存关系 VOB 可以看到“有”的直接依存对象是“柳树”,而“柳树”就是射体。 
简单射体识别算法如下: 
①  根据句子的依存关系的到句子的核心语 HED。 
②  根据 HED 的依存关系 SBV 得到核心语的直接依存对象 X,查找数据
库 dic 中该词对应的模型文件,如果有则输出射体 X,结束。否则转(3)。 
③  根据 HED 的依存关系 VOB 得到核心语的直接依存对象 X,查找数据
库 dic 中该词对应的模型文件,如果有则输出射体 X,结束。

(2)复杂射体识别

多个射体在一个小句中的情况:例“桌子上有橡皮和铅笔”这句话的依存关系如图3-11

在上图中我们可以根据上一小节介绍的界标识别方法得到界标是“桌子”。这句话的核心语是“HED  有”,根据它的依存关系 VOB 可以看到“有”的直接依存对象是“橡皮”,而“橡皮”的依存关系 COO 指的是并列关系,在依存关系 COO 中“橡皮”的直接依存对象是“铅笔”,因此在这句话中,射体指的是“铅笔”和“橡皮”。此时我们将这种对应多个射体的界标称为容器界标,容器界标指的就是一类可以充当多个射体的界标并且这些射体处于该界标的同一个平面上。上例中桌子就是容器界标,当桌子的位置发生变化时,铅笔盒橡皮的位置也随之发生变化,但是它们之间的相对位置并没有发生变化。 
多个射体在不同小句中的情况:例“桌子上有橡皮,橡皮左边放着铅笔”这句话的依存关系如图 3-12 所示:

在上图中我们可以根据上一小节介绍的界标识别方法得到界标是“桌子”。这句话的核心语是“HED  有”,根据它的依存关系 VOB 可以看到“有”的直接依存对象是“橡皮”,而“有”的依存关系 COO 指的是并列关系,在依存关系 COO 中“有”的直接依存对象是“放”,在依存关系 VOB 中“放”的直接依存对象是“铅笔”。因此在这句话中,射体指的是“铅笔”和“橡皮”。 
复杂射体识别算法如下: 
①  如果一句话除最后的句号外没有标点符号“,”,我们在处理这类句子时首先根据之前的简单射体识别算法得到射体 X1。否则,转(3)。 
②  根据 X1 的依存结构 COO 得到其直接依存对象 X2,查找数据库中 X2对应的模型文件,如果有输出 X2。结束。 
③  根据“,”将句子分成小句集合 Sent{sent1、sent2、sent3……}。 
④  根据之前的简单射体识别算法依次处理句子集合 Sent{sent1、sent2、sent3……}得到射体集合 TR{TR1、TR2、TR3……}。 
⑤  我们之前在界标识别时得到界标集合 LM{LM1、LM2、LM3……},根据界标集合和射体集合,我们创建数组链 SLM2 表用来表示界标是前句射体的情况。结束。 
例如句子“桌子上有只猫,猫左边一只狗,猫右边一个鱼缸”。得到 SLM1为{0,2,2},SLM2 为{0,0,0}。

(3)结果

可以看到基于依存关系的射体识别结果同样比基于规则的方法效果好,由于射体的识别比界标要复杂,对于只有一个主谓结构的简单句可以达到很高的识别效果,但是在复杂句中,由于射体通常会提到一次后在后文省略并且与方位词的距离也不可预测,这种情况导致识别效果不好,因此我们考虑添加更多规则来提高识别效果。

3.4 射体和界标的描述文件生成

场景摆放不仅需要知道射体和界标是什么还要知道射体和界标的大小及摆放位置和它们的相关属性,比如射体和界标的颜色等属性。因此我们将射体和界标的相关信息组织到一个描述文件 Des 中,描述文件是 xml 格式的文件。我们选择 xml 作为文件格式是因为 xml 这种格式的文件有很好的可扩展性并且 xml 文件具有通用性,使用标签来记录各种数据非常方便。 在之前的介绍中我们根据句子的依存结构提取了一些关系谓词二元组,现在我们将这些关系谓词二元组的信息进行整理写入描述文件 Des 中,具体操作如下: 
(1)  对于二元组 Adj_Nou,进行如下操作: 
①  我们在数据库中的形容词表中查询词语是否有 RGB 这一项,如果有就生成颜色的属性 COLOR;同样的,如果有 SIZE 这一项,我们就生成尺寸的属性 SIZE。 
②  由于 Adj_Nou 关系中所对应的是实体对象,因此我们生成空间物体 ENTITY。 
(2)  对于二元组 Sub_Pre,生成空间物体 ENTITY。 
(3)  对于二元组 Num,生成空间物体 ENTITY 和数量的属性 NUM。 
(4)  对于二元组 F_Obj,我们在描述文件中生成他们的位置关系。我们主
要关注一下几个方位词: 
①  上:表示一个物体在另一个物体的正 Y 轴方向,我们将其表示为LOC(+Y,Obj1,Obj2) 
②  下:表示一个物体在另一个物体的负 Y 轴方向,我们将其表示为LOC(-Y,Obj1,Obj2) 
③  左:表示一个物体在另一个物体的正 X 轴方向,我们将其表示为LOC(+X,Obj1,Obj2) 
④  右:表示一个物体在另一个物体的负 X 轴方向,我们将其表示为LOC(-X,Obj1,Obj2)
⑤  前:表示一个物体在另一个物体的正 Z 轴方向,我们将其表示为LOC(+Z,Obj1,Obj2) 
⑥  后:表示一个物体在另一个物体的负 Z 轴方向,我们将其表示为LOC(-Z,Obj1,Obj2) 
在关系 LOC 中,Obj1 表示射体,Obj2 表示界标。 
例“那只小花猫的背上有一只白色的蝴蝶”其依存结构如图 3-13 所示:

它的关系谓词二元组如下: 
二元组 Adj_Nou(花,猫)、二元组 Adj_Nou(白色,蝴蝶)。 
二元组 Sub_Pre(上,有) 
二元组 F_Obj(上,猫) 
按照我们在上文中对关系谓词二元组的处理,处理步骤如下: 
(1) 对于 Adj_Nou(花,猫)和 Adj_Nou(白色,蝴蝶)。“花”作为形容的上位词是颜色,因此生成颜色属性“花”。“白色”的作为形容词的上位词是颜色,因此生成颜色属性“白”。 
(2) 同时生成实体“猫”和“蝴蝶”。 
(3) 对于 Sub_Pre(猫,有),因为之前生成了实体“猫”,因此在“猫”的动作属性下生成“有”。 
(4) 对于 F_Obj(上,猫)生成 LOC(+Y,蝴蝶,猫)。 
生成的描述文件如图 3-14 所示:

4、 基于Java3D的场景自动生成

处理过程:(1)根据描述文件中的射体和界标信息,查找数据库。在数据库中获取射体和界标对应的模型库中的模型的名字。同时获取射体和界标的相关属性。(2)从模型库中获取射体和界标对应的模型。(3)通过方位词信息和谓词关系二元组计算射体、界标的摆放位置。(4)组织场景包括:加入背景信息、路径规划、处理隐含信息和优化摆放。

4.1 相关技术介绍

(1)java3D

Java  3D 是为 Java 显示三维图形的附加部分。以 Java  3D 写成的程序可以在若干不同类型的计算机或经由互联网运行。Java  3D 类库提供了比大多数其他图形库都更为简单的接口,但也足以生成很好的游戏和动画。Java 3D建立在现有的技术,如 DirectX 和 OpenGL 之上,因此程序运行速度快。除此之外,Java 3D 还可以与 3D 模型化包,如 TrueSpace 和 VRML 模型创建的
对象实现协作。 
Java3d 场景图是树形结构,其中的节点有三种,它们分别是:根节点virtual Universe、节点 Locale、节点 BranchGroup、节点 TransformGroup、叶子节点等。它们的关系如图所示:

在上图中,我们可以观察到根节点和中间节点以及叶子节点之间的关系,现在简单介绍这些节点的功能。 
(1) 根节点 Virtual Universe,每一个场景图的根节点有且仅有一个。 
(2) Locale 节点,在 Virtual  Universe 节点的下面,每个 java 场景图中Locale 节点的数目大于等于一个,虽然可以有多个 Locale 节点,但是处于显示状态的 Locale 节点有且只有一个,类似人类逛旅游景点,虽然有很多观赏地,但是我们在某一时刻是只在一个地方进行观光的,如果场景图中存在多个 Locale,那么 Java3D 会提供相应的接口使我们在多个 Locale 节点间相互
转换。 
(3) BranchGroup 节点,存放的是三维物体的位置信息,因为三维物体一旦形成就要摆放到场景中去,此时坐标等信息就由 BranchGroup 来存放。在同一个 Locale 节点下可以有多个 BranchGroup 节点。 
(4) TransformGroup  节点:用来设定三维形体 Spape3D 的各种位置变换、旋转等信息。 
(5) Spape3D  节点:是三维形体节点,这个节点产生的实体就是最后展示在场景中的各个形体,比如一些几何形体包括长方体、三棱团等。 
(6) 叶子节点:存放的是三维形体的外观信息 Appearance 和一些几何信息 Geometry,这些信息决定了这个三维形体在场景中的大小、颜色等显示效果。 
(7) View  Platform 位于场景图的另一个分枝上,与前面的节点所不同的是它不对三维形体做出转换,而是定义观察者在场景中的位置等信息,这决定我们从什么角度看到三维形体。

(2)Obj模型

OBJ文件是一种标准的3D模型文件格式,适用于多种3D软件,如Maya、3dsMax等。我们将从网上下载的模型导入Maya中对其大小、方位等调整以满足现实世界的要求,使场景图更符合现实世界。如下是一个打开obj文件的效果图

(3)数据库构建

我们选择知网Hownet的词库作为查询上位词的数据库。我们将词库导入到数据库 dic 中。在数据库 dic 中,我们将词汇按照知网中的概念层次进一步进行细分,将形容词 ADJ、方位词 f、量词 NUM 各放入一张表,其余的名词按照人、走兽、牲畜、禽、树、建筑物等进一步划分到 14 个表中。这样数据库 dic 就由 17张表组成。
名词类的每一个子类都对应一张表格,表格名是每个子类的名称,表格字段是一样的,包括 ID、名词、类型、义原、ObjFile。

4.2 模型库的建立

我们采用的模型文件是obj格式的,其中一些取自网络,另一部分是自己制作,因此需要进行归一化。

(1)模型调整

在 Java3D 的三维世界中,坐标系是笛卡尔坐标系,+X 方向是水平向右,+Y 方向是本地重力的上,+Z 是指向观察者的方向。Java3D 的三维世界的默认单位是米,但是这个米和现实世界的长度单位没有可比性,仅仅是一个Java3D 单位。在应用中,为了保证空间摆放的协调统一,我们指定一个统一的参考标准。 
模型调整主要针对两个方面,一个是调整模型的朝向,另一个是调整模型的大小。对于有前后面的模型,我们规定他的正面是+Z 方向;对于模型大小跟现实世界相比过大或过小的我们对这个模型进行放缩操作。这些调整均需要在 Maya 中进行,我们将模型导入到 Maya 中去,然后观察模型的朝向和大小,按照之前的调整规则对模型就行修改,例如图 4-5 中,展示的模型调整方向前后的变化,图 4-6 展示了模型调整大小前后的变化。

将模型摆放到世界坐标时,我们选择原点作为参照点,模型的归一化处理就是所有的模型的中心坐标必须位于原点并且置于 XZ 坐标平面上。

(2)空间信息标注

为了在空间中正确的摆放各个物体,我们必须知道空间实体具体的上下左右前后的位置信息,因为摆放在空间中的物体都是相对的,我们必须确定空间实体的相对位置才能避免摆放过程中出现覆盖或者距离过大的现象。我们在 Maya 中打开模型文件,使用软件中多边形将模型的六个面包围,统计模型在正负 X 轴、正负 Y 轴和正负 Z 轴的方向的维度,然后将这些信息整理到模型对应的文本文件中去,当进行摆放时,我们只要知道模型的六个面的信息就可以实现在六个方向的摆放。我们将模型的空间信息标注信息和模型放在一个文件夹下,获取模型的同时获取模型的空间标注信息。 下图 4-7 展示的在 maya 中我们将模型“猫”的六个面进行标识:

4.3 描述文件对应的场景信息生成

前面我们介绍了方位词识别、射体和界标识别并将它们的信息储存到场景描述文件 Des 中,接下来我们需要读取描述文件中的各种信息将其转化成场景展示出来。 
(1)对于描述文件中的 Entity,我们需要在数据库中查找是否存在与之匹配的模型,如果有,就获取该模型。由于复杂界标和复杂射体的存在,有的实体既充当射体又充当界标,为了避免在场景中重复载入一个模型,我们需要知道当前模型是否已被加载进场景,因此我们使用 Map 来存放已经加载到场景的模型,Map 是按照键值/数值来进行存储的,我们将键值设为模型的名字,模型的重复次数则用键值对应的数值表示。我们加载模型的算法如下: 
①  获得需要加载的模型的名字,将该名字作为键值在 Map 中进行搜索,得到返回值,如果不为 0,那么说明已经加载了该模型,我们不再重复载入;如果返回值为 0,转到(2)。 
②  将模型加载进场景中去同时在哈希表中加入模型对象的引用,键值是模型的名字。 
(2)对于描述文件中的 Size,系统根据不同的 size 定义不同的放缩操作,我们将“小”的放缩因子定义为 0.5,将“大”的放缩因子定义为 1.5,将“巨大”的放缩因子定义为 2.0。这样在载入模型时,如果没有对模型大小的描述,我们就不对模型进行放缩操作,如果遇到以上描述大小的词,我们就按
照不同词对应不同放缩因子对模型进行大小调整。 
(3)对于描述文件的 LOC 信息,我们分六种情况讨论: 
①  LOC(+Y,Obj1,Obj2):表示将一个物体 Obj1 移动到另一个物体Obj2 的上面,我们首先获取 Obj1 的底面和 Obj2 的顶面,然后在 Y 轴正方向上移动 Obj1,直到将 Obj1 的底面移动到 Obj2 的顶面。 
②  LOC(-Y,Obj1,Obj2):此时需要将物体 Obj1 置于物体 Obj2 的下面,分别获取 Obj1 的顶面和 Obj2 的底面,然后在 Y 轴负方向上移动 Obj1,直到将 Obj1 的顶面移动到 Obj2 的底面。 
③  LOC(+X,Obj1,Obj2):表示将一个物体 Obj1 移动到另一个物体Obj2 的右面,我们首先获取 Obj1 的左面和 Obj2 的右面,然后在 X 轴正方向上移动 Obj1,直到将 Obj1 的左面移动到 Obj2 的右面。 
④  LOC(-X,Obj1,Obj2):表示将一个物体 Obj1 移动到另一个物体Obj2 的左面,我们首先获取 Obj1 的右面和 Obj2 的左面,然后在 X 轴负方向上移动 Obj1,直到将 Obj1 的右面移动到 Obj2 的左面。 
⑤  LOC(+Z,Obj1,Obj2):表示将一个物体 Obj1 移动到另一个物体Obj2 的前面,我们首先获取 Obj1 的后面和 Obj2 的前面,然后在 Z 轴正方向上移动 Obj1,直到将 Obj1 的后面移动到 Obj2 的前面。 
⑥  LOC(-Z,Obj1,Obj2):表示将一个物体 Obj1 移动到另一个物体 Obj2的后面,我们首先获取 Obj1 的前面和 Obj2 的后面,然后在 Z 轴负方向上移动 Obj1,直到将 Obj1 的前面移动到 Obj2 的后面。

4.5 场景组织

(1)背景信息

(2)模型信息

(3)大小信息

(4)基于场景图的模型变换

(5)处理隐含信息

(6)路径规划

(7)优化摆放

结果图:

 

参考文献:王霄.自然语言描述的空间实体自动摆放技术研究.[哈尔滨工业大学硕士学位论文].2014.

自然语言描述的空间实体自动摆放相关推荐

  1. NLP自然语言处理实例——实现机器自动生成商品的推荐标题和推荐语

    NLP自然语言处理实例--实现机器自动生成商品的推荐标题和推荐语 一.案例目的及实现 二.环境配置 1.安装库时遇到的问题 三.数据预处理 1.移除特殊符号 2.去除停用词 3.文本分词jiaba 四 ...

  2. 计算机算法可以用自然语言来描述吗,算法可以用自然语言描述吗

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 算法可以用自然语言描述.算法可以有三种不同的描述:自然语言,程序框图,程序语言.算法(Algorithm)是指解题方案的准确而完整 ...

  3. dpdk报文收发流程--理解dma控制器、UIO驱动、描述符空间、mbuf空间、KNI

    1. dpdk报文收发流程 1.1 报文接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理. 和传统报文接收不同,当应用 ...

  4. 网络空间实体测绘的关键

    风险感知 感知是智能化技术迈出的第一步.安全运营智能的感知层,主要面向网络空间 各类实体与行为的识 别与检测,主要包括情报要素取.网络实体画像.攻击检测与分类.异常行为分析和团伙行为发现等 前沿关键技 ...

  5. mysql的表空间是否自动扩展_Oracle修改指定表空间为自动扩展

    1.数据文件自动扩展的好处 1)不会出现因为没有剩余空间可以利用到数据无法写入 2)尽量减少人为的维护 3)可以用于重要级别不是很大的数据库中,如测试数据库等 2.数据文件自动扩展的弊端 1)如果任其 ...

  6. 阿里云 mysql 表锁死_解决阿里云数据库MySQL实例空间满自动锁问题

    MySQL实例可能会由于SQL语句.外部攻击等原因导致实例空间满,为避免数据丢失,RDS会对实例进行自动锁定,磁盘锁定之后,将无法进行写入操作. 背景信息 当实例由于实例空间满自动锁定时,控制台可以在 ...

  7. 【深度学习】实验6布置:图像自然语言描述生成(让计算机“看图说话”)

    DL_class 学堂在线<深度学习>实验课代码+报告(其中实验1和实验6有配套PPT),授课老师为胡晓林老师.课程链接:https://www.xuetangx.com/training ...

  8. 几楼电路精灵——Cadence Allegro 自动摆放位号

    Allegro自动摆放位号 1.功能说明 2.电路精灵下载 1.功能说明 2.电路精灵下载 http://www.jiloukeji.com QQ群: 573039197(Cadence skill自 ...

  9. 地理信息|空间描述与空间模式分析

    这一部分就是讲数据的分析方法.要想分析数据,就先要对数据进行描述归纳.主要分为描述性数据挖掘和预测性数据挖掘. ​ 描述性数据挖掘就是简单描述数据,给出数据性质,常用泛化的方式进行(俗称口胡). 预测 ...

最新文章

  1. 审计工作存在的难点和问题_电力工程造价审计的难点与对策有哪些?学习安装电力造价广联达计价看这里!!...
  2. 移动客户端UI设计指南
  3. 【Vue2.0】—github小案例(二十三)
  4. 解决“C:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件问题
  5. 向Spark的DataFrame增加一列数据
  6. eclipse中导入jar包源文件
  7. .net web 应用程序C#
  8. 毁灭程序员效率的 15 个障碍
  9. 计算机常用工具软件实训总结报告,计算机常用工具软件实训报告
  10. 一篇文章带你看遍Google I/O 2019大会
  11. 三体计算机原理,“三体”你必须知道的4个理论
  12. PHP学习-数据类型
  13. JBOSS4.0.2 HTTP集群配置详解
  14. 遥感建筑物提取数据集
  15. DVWA-Reflected XSS
  16. QT信号槽与connect的常见写法
  17. Spring AOP 的 Advice 和 Advisor 有什么区别
  18. 微信小程序与后台交互案例
  19. python信用卡客户_信用卡客户画像 作业讲解1
  20. Git的管理、撤销、删除以及创建远程仓库

热门文章

  1. Ubuntu桌面不显示Desktop里的文件(Ubuntu桌面显示的是home文件夹里的文件)怎么办
  2. 11.Flink ProcessFunction介绍及KeyedProcessFunction实例
  3. 嵌入式Linux的RGB触摸屏幕驱动记录
  4. 鸿蒙OS渲染图,华为P50 Pro渲染图,首发鸿蒙OS系统,1英寸传感器比肩专业单反
  5. 互联网产品的未来趋势
  6. vscode设置光标快捷键上下左右移动(详细)
  7. iPhone开发证书破解
  8. 新冠感染发病过程记录
  9. 中e管家教会你如何利用闲钱做理财
  10. 分享-RK3399支持多种屏幕接口如何进行屏幕切换控制