把用文本形式(String)的语言,转换成对应的一个关系(Relation),关系其实对应的是一个类(class),例如,string形式的“AB平行CD”,那么就有一个对应的class来表示,假设类名为ParallelRelation,那么这个类里面有2个成员变量,对应的平行的2个直线。这样就string类型转换成一个类,既保持了原有的信息,生成的类也方便进行推理。
总之,String –> Relation。
以工程中已写好的一个模板文件(xml)为例介绍模板:
<synset name="ANGLE_TYPE" core_term="钝角,直角,锐角为符号" expr="!?@angleType#钝角|直角|锐角|平角"/>
Name:定义一个名字(相当于定义一个“ANGLE_TYPE”的变量,后面在模板中可以直接使用)
core_term:对该变量的一些说明,不重要
expr:分为3个部分:
命名组:格式为"?@category#",为了方便提取出具体的值,从上面可以看出,该expr可以匹配 “钝角/直角/锐角/平角” 中的任意一个词, 由于该命名组为@angleType#,相当于@angleType#中就存放着具体的一个词(联想一下java的正则表达式,当Match.find()匹配成功后,使用Match.group() 来获取具体匹配字符串)
如果你不需要该匹配出来的字符,则可以省略命名组,比如:
<synset name="AND" core_term="和,与符号" expr="N_I和|,|与"/>
3. 正则表达式:该expr具体正则表达式部分。
简单来说 synset就是我们自己定义个标签,用来处理多词同义和data提取。
该部分也就是模板的主体部分,一个模板最基本的格式如下:
<template id="Heart_Or_Excenter_Of_Triangle"> <description>三角形的内心或外心</description> <pattern>(点|)%point%是#三角形#%triangle%的一个#心#</pattern> <pattern>#三角形#%triangle%(的)(一个|)#心#是(点|)%point%</pattern> <semantics type="JSON"> <![CDATA[{"service":"cn.tsinghuabigdata.closedShape","code":"geo.JsonCoreAndShapeRelation", "data":{"point":"%point[0]%","heart":"@Heart","shape":"%triangle%","shapeStyle":"@triangleType","shapeType":"三角形"}}]]> </semantics> </template>
属性说明:
Id:描述标识符,见名识义。
Pattern: 需要匹配某个句子的正则表达式(只是可以使用前面synsets 中定义的标签和全局标签)。
synsets 中定义的标签:用 #name# 来表示,该标签实际是匹配其对应的 expr 中的正则表达式部分。
全局定义的标签:用 %name% 来表示,一些全局通用的标签,例如 %triangle% 可以匹配一个类似 “ABC ”的字符串。(具体标签在NLPConstants类中可以查看)
其中"code": "geo.JsonCircularOnTriangleRelation",表示前面某个pattern匹配成功后,会进入JsonCircularOnTriangleRelation这个类中进行处理,其中传递的参数为"data": {"point":"%point[0]%","heart":"@Heart","shape":"%triangle%","shapeStyle":"@triangleType","shapeType":"三角形"}
这是一种JSON的格式,也就是一种key-value的形式,相当于传递了5个变量:point、heart等。
注:
1. 第四个变量 key 为 shapeStyle,value 为 @triangleType ,注意我们在上面定义了一个synset:
<synset name="三角形" core_term="等边,等腰为符号" expr="!?@triangleType#等边|等腰|正|直角|R|三角形|△"/>
@triangleType 在命名组中(注意不是@triangleType#,没有#),因为在pattern中有一个#三角形#,上面expr中正则表达式匹配的成功字符串,使用名字组@triangleType 进行传递其具体的 data。
2. 第一个变量 key 为 point,value 为 %point[0]%, 和上面类似,上面是我们自己定义的标签,而这个是全局定义的标签,而在pattern中出现的%point%,会存放在一个类似数组中,我们使用 %point[n]%(从0开始)来获取第 n-1 个 point 匹配的 value。
例如:
</template> <template id="TRIANGLE_BISECTOR_AND_MEDIAN"> <description>三角形中的中线和角平分线2</description> <pattern>^(在)#三角形#%triangle%(中) %line% (是)(角平分线) #AND# %line% (是)(中线)$</pattern> <semantics type="JSON"> <![CDATA[{"service":"cn.tsinghuabigdata.line","code":"geo.JsonAngleBisectorRelation", "data":{"triangle":"%triangle%","triangleType":"@triangleType","line":"%line[0]%"}}]]> <![CDATA[{"service":"cn.tsinghuabigdata.closedShape","code":"geo.JsonMidianLinesOfTriangle", "data":{"line":"%line[1]%","triangle":"%triangle%","triangleType":"@triangleType"}}]]> </semantics> </template>
pattern部分中出现了2个 %line%, 在传递值的时候,如果传递的是第一个line,则在data中使用%line[0]%。
上面还有个不同的地方是生成了2个Relation(准确的是说,通过geoJsonAngleBisectorRelation这个类处理了2次,每次的data不一样,每次都生成了relation)。
原文:http://www.cnblogs.com/skyke/p/5024622.html