首页 > 其他 > 详细

模板编写

时间:2015-12-07 00:30:16      阅读:216      评论:0      收藏:0      [点我收藏+]

1. 模板的作用

  把用文本形式(String)的语言,转换成对应的一个关系(Relation),关系其实对应的是一个类(class),例如,string形式的“AB平行CD”,那么就有一个对应的class来表示,假设类名为ParallelRelation,那么这个类里面有2个成员变量,对应的平行的2个直线。这样就string类型转换成一个类,既保持了原有的信息,生成的类也方便进行推理。

      总之,String –> Relation。

2. 模板的介绍

  以工程中已写好的一个模板文件(xml)为例介绍模板:

2.1 Synsets标签

<synset name="ANGLE_TYPE" core_term="钝角,直角,锐角为符号" expr="!?@angleType#钝角|直角|锐角|平角"/>

Name:定义一个名字(相当于定义一个“ANGLE_TYPE”的变量,后面在模板中可以直接使用)

core_term:对该变量的一些说明,不重要

expr:分为3个部分:

  1. 重要性:有两个级别 “!”:重要的词;"N_I":不重要的词。
    (标记重要性的原则,如果具有数学意义的词,一般标为重要(用于机器学习中使用,对模板的编写没影响))
  2. 命名组:格式为"?@category#",为了方便提取出具体的值,从上面可以看出,该expr可以匹配 “钝角/直角/锐角/平角” 中的任意一个词, 由于该命名组为@angleType#,相当于@angleType#中就存放着具体的一个词(联想一下java的正则表达式,当Match.find()匹配成功后,使用Match.group() 来获取具体匹配字符串)

    如果你不需要该匹配出来的字符,则可以省略命名组,比如:

     <synset name="AND" core_term="和,与符号" expr="N_I和|,|与"/>

  3. 正则表达式:该expr具体正则表达式部分。
  

  简单来说 synset就是我们自己定义个标签,用来处理多词同义data提取。

2.2 Template标签

  该部分也就是模板的主体部分,一个模板最基本的格式如下:

<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>

  属性说明:

  1. Id:描述标识符,见名识义。

  2. Pattern: 需要匹配某个句子的正则表达式(只是可以使用前面synsets 中定义的标签和全局标签)。

    synsets 中定义的标签:用 #name# 来表示,该标签实际是匹配其对应的 expr 中的正则表达式部分。
    全局定义的标签:用 %name% 来表示,一些全局通用的标签,例如 %triangle% 可以匹配一个类似 “ABC ”的字符串。(具体标签在NLPConstants类中可以查看)

  3. Semantics:重要部分,利用 Json 进行消息传递。

    其中"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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!