พื้นที่เก็บข้อมูลนี้สร้างเครื่องห่อ Python แบบบางรอบๆ OpenCCG โดยใช้ GUM-space ontology ซึ่งพร้อมที่จะทำงานภายในคอนเทนเนอร์นักเทียบท่า คุณสามารถค้นหาเวอร์ชันสดได้ที่ litmus.informatik.uni-bremen.de/openccg
หลังจากที่ docker-compose up
เริ่มต้นแล้ว สามารถสอบถามบริการได้โดยใช้คำขอ POST แบบง่ายๆ เช่น การใช้ curl:
$ curl --data "Take the cup." "localhost/openccg/parse?graphs"
{"version": "2.2.0", "application": "web-openccg", "uuid": "3bafdaf8-cc9c-4fdf-b455-c9687babba49", "sentence": "take the cup", "parses": ..., "http_status": 200, "json_parses": ..., "graphs": ...}
ช่อง "กราฟ" จะรวมไว้ก็ต่อเมื่อมีพารามิเตอร์ URL graphs
อยู่
เป็นตัวอย่าง การใช้คำขอ Python:
import requests
# Without graphs
print ( requests . post ( 'http://localhost/openccg/parse' , data = { 'sentence' : 'Take the cup.' }). json ())
# With graphs
print ( requests . post ( 'http://localhost/openccg/parse' ,
data = { 'sentence' : 'Take the cup.' },
params = { 'graphs' : True }). json ())
เนื่องจากวิธีที่เราโฮสต์ OpenCCG หลัง nginx ที่สารสีน้ำเงิน URL สำหรับ web-openccg จึงมีคำนำหน้าด้วย "openccg" อย่างไรก็ตาม สำหรับจุดสิ้นสุดที่สำคัญสองจุด ( /
สำหรับ GUI และ /parse
สำหรับ API) มีการเปลี่ยนเส้นทางอยู่ สำหรับ curl นี่หมายถึง curl -L --data "Take the cup." localhost/parse
จะทำงานเช่นกัน (สังเกตอาร์กิวเมนต์ -L
( --location
))
โปรดทราบว่ายังไม่พร้อมสำหรับการผลิต เนื่องจากช้ามากและไม่ได้รับการปรับให้เหมาะสม: แทนที่จะปล่อยให้ OpenCCG หนึ่งอินสแตนซ์ (หรือหลายอินสแตนซ์) ทำงานเพื่อให้สามารถสืบค้นได้เร็วขึ้น แต่ละคำขอจะสร้างอินสแตนซ์ OpenCCG แต่ละรายการ
หากต้องการค้นหาบริการด้วยสายตา เพียงเปิดเบราว์เซอร์ของคุณที่ http://localhost/openccg มิฉะนั้น ให้ใช้คำขอ curl, wget หรือเช่น python เพื่อสืบค้น web-openccg ผ่านทางบรรทัดคำสั่งหรือแอปพลิเคชันของคุณ
หากไคลเอนต์ของคุณอนุญาตให้สร้างเนื้อหาคำขอของคุณด้วยตนเอง เช่น curl เพียงแค่ใส่ประโยคไว้ข้างใน:
curl --data "Take the cup." localhost/openccg/parse
อย่างไรก็ตาม กรอบงานระดับสูงจำนวนมาก เช่น คำขอของ Python มักจะใช้กลไกคีย์-ค่าสำหรับการโพสต์ข้อมูล ในกรณีนี้ให้ใช้ sentence
สำคัญ:
requests.post('http://localhost/openccg/parse', data={'sentence': 'Take the cup.'})
ตัวอย่างเช่น ดูด้านล่าง
การตอบกลับเป็นออบเจ็กต์ JSON และจะมีช่องเหล่านี้เสมอ:
version
: เวอร์ชันออบเจ็กต์ JSONapplication
: "web-openccg" เสมอ สิ่งนี้มีประโยชน์หากคุณรวมการแยกวิเคราะห์จากบริการต่างๆuuid
: ID เฉพาะสำหรับการตอบกลับนี้ สิ่งนี้จะมีประโยชน์ก็ต่อเมื่อคุณวางแผนที่จะรวมเครื่องมือนี้เข้าด้วยกันhttp_status
: สถานะ HTTP จากคำขอหากมีการระบุประโยคในระหว่างการร้องขอ ฟิลด์เหล่านี้จะปรากฏขึ้น:
sentence
: ประโยคอินพุตที่สะอาด (ตัวพิมพ์เล็กทั้งหมด, เครื่องหมายวรรคตอนถูกลบออก, ... )หากมีการแยกวิเคราะห์สำเร็จอย่างน้อยหนึ่งรายการ ฟิลด์เหล่านี้จะรวมอยู่ด้วย:
parses
: พจนานุกรมของ parse-identifier (เช่น "np") เพื่อแยกวิเคราะห์ตามจริงเมื่อ OpenCCG ส่งออกผลลัพธ์json_parses
: เวอร์ชันของเอาต์พุต OpenCCG ใน JSON แบบแฟลต สิ่งนี้สร้างผ่านไวยากรณ์ที่กำหนดเองสำหรับ TatSu สำหรับรายละเอียดดูด้านล่าง ค่าพจนานุกรมแต่ละค่าคือรายการชื่อ ตัวแปร และ/หรือบทบาทgraphs
: พจนานุกรมของตัวระบุแยกวิเคราะห์ถึงสตริงจุด สามารถเรนเดอร์ได้โดยใช้ graphviz -- GUI ออนไลน์จะเรนเดอร์สิ่งเหล่านี้โดยอัตโนมัติ หมายเหตุ: คีย์จะถูกแชร์ระหว่าง parses
, json_parses
และ graphs
ดังนั้นคุณจึงสามารถค้นหาเอาต์พุตดั้งเดิมสำหรับ JSON parse และในทางกลับกันได้อย่างง่ายดาย
หากมีข้อผิดพลาดเกิดขึ้น ฟิลด์ข้อผิดพลาดจะปรากฏขึ้น:
error
: คำอธิบายข้อผิดพลาดเวอร์ชันปัจจุบัน: 2.3.0
รูปแบบ JSON สำหรับการแยกวิเคราะห์ OpenCCG สามารถกำหนดได้จากตัวอย่างด้านบน หรือโดยการตรวจสอบ OpenCCG.ebnf ที่พิมพ์อย่างครบถ้วนอย่างระมัดระวัง
ออบเจ็กต์มีสามประเภทที่แตกต่างกัน: ที่กำหนด ตัวแปร และบทบาท ข้อมูลจำเพาะความหมายแบบเต็ม (ไฟล์ JSON) อาจเป็นเอนทิตีเดียวจากทั้งสามประเภทหรือรายการ Nominals หากเราพบพาร์สที่เป็นรายการตัวแปรหรือบทบาท ไวยากรณ์ก็จะขยายออกไป โปรดเปิดประเด็นหากคุณพบประโยคที่ไม่สามารถแยกวิเคราะห์ได้อย่างถูกต้อง
ชื่อนั้นเปรียบเสมือนตัวแปรพิเศษ โดยจะอธิบาย "ธีมหลัก" ของประโยค เนื่องจากเกือบจะเหมือนกัน (จริงๆ แล้วมีกฎการแยกวิเคราะห์ที่คล้ายกันมาก) รูปแบบ JSON จึงมีโครงสร้างที่เหมือนกัน:
{
"__class__" : " Variable " ,
"name" : " x1 " ,
"type" : " gum-OrientationChange " ,
"roles" : []
}
__class__
เป็น Variable
หรือ Nominal
name
คือตัวแปรที่ OpenCCG ใช้ โดยเป็นตัวอักษรตามด้วยตัวเลข เช่น x1
หรือ w12
type
เป็นตัวระบุ GUM ที่แสดงประเภทของตัวแปร นอกจากนี้ยังอาจเป็น null
ได้ หากไม่ได้ระบุประเภทroles
คือรายการบทบาทตามที่อธิบายไว้ด้านล่าง บทบาทจะกำหนดคุณสมบัติทั้งหมดที่ตัวแปรหรือที่กำหนดสามารถมีได้ มีโครงสร้างคล้ายกันมาก:
{
"__class__" : " Role " ,
"type" : " quant " ,
"target" : ...
}
__class__
: Role
type
: ประเภทบทบาท สิ่งนี้จะกำหนดความเป็นไปได้ target
target
: คุณค่าของบทบาท นี่อาจเป็นได้หลายอย่างที่แตกต่างกัน ดูด้านล่าง หากประเภทเป็น entity
เป้าหมายจะเป็นอินสแตนซ์ เช่น "cup" หรือ "slm-Taking" หากประเภทนั้นมีคำนำหน้าตามด้วยขีดกลาง เช่น gs-hasSpatialModality
หรือ gs-direction
เป้าหมายจะเป็น Variable
; ในนกฮูกนี่จะเป็น ObjectProperty หากประเภทนั้นเป็นสตริงอื่น เป้าหมายจะเป็นสตริงแบบอะตอมมิก เช่น ประเภท det
สามารถมีเป้าหมาย the
ในขณะที่ประเภท quant
สามารถมีเป้าหมาย singular
บริการเว็บส่วนใหญ่ใช้พอร์ต 80 เป็นพอร์ตเริ่มต้น และ web-openccg ก็เช่นกัน
หากต้องการเปลี่ยนพอร์ต ให้ปรับไฟล์นักเทียบท่าและเปลี่ยนบรรทัดพอร์ตจาก "80:80"
เป็นพอร์ตของคุณทางด้านซ้าย (แต่เก็บ 80 ไว้ทางด้านขวา) ดังนั้น เช่น เพื่อตั้งค่าบริการบนพอร์ต 9043 คุณจะเปลี่ยนเป็น "9043:80"
ก่อนที่จะเริ่มการพัฒนา คุณต้องสร้างคอนเทนเนอร์นักเทียบท่าโดยใช้:
make build
ขั้นตอนนี้ยังรวมถึงไฟล์บางไฟล์ที่ดาวน์โหลดระหว่างกระบวนการสร้างลงในไดเร็กทอรี ./webopenccg/static ในเครื่องของคุณ การคัดลอกเสร็จสิ้นเนื่องจากเซิร์ฟเวอร์การพัฒนาติดตั้งไดเร็กทอรี ซึ่งจะเขียนทับไฟล์ที่มีอยู่ในคอนเทนเนอร์เท่านั้น แต่ไม่มีอยู่บนระบบโฮสต์
หากต้องการเริ่มคอนเทนเนอร์นักเทียบท่าการพัฒนาให้ใช้ Makefile:
make run
เซิร์ฟเวอร์การพัฒนาเชื่อมโยงกับพอร์ต 5000 และใช้สภาพแวดล้อมการแก้ไขข้อบกพร่องของขวด นอกจากนี้ คอนเทนเนอร์นักเทียบท่าที่เริ่มต้นด้วย make run
จะผูกไดเรกทอรีของแอป เพื่อให้การโหลดซ้ำของ Flask ทำงานได้อย่างถูกต้อง
หากต้องการคอมไพล์ไวยากรณ์ OpenCCG.ebnf ให้รัน:
make
ตัวอย่างคำตอบสำหรับประโยค "Take the cup" เป็น:
{
"version" : " 2.2.0 " ,
"application" : " web-openccg " ,
"uuid" : " ecae8222-af9b-4185-a508-efa8be33c7e6 " ,
"sentence" : " take the cup " ,
"parses" : {
"smain" : " @x1:gum-OrientationChange( <mood>imp ^ <gs-direction>(x2:gs-GeneralizedLocation ^ <gs-hasSpatialModality>(w2:slm-Cup ^ cup ^ <det>the ^ <ident>specific ^ <quant>singular)) ^ <gum-processInConfiguration>(w0:slm-Moving ^ slm-Taking)) " ,
"smain/0" : " @x1:gum-OrientationChange( <mood>imp ^ <gs-direction>(x2:gs-GeneralizedLocation ^ <gs-hasSpatialModality>(w2:slm-Cup ^ cup ^ <det>the ^ <ident>specific ^ <quant>singular)) ^ <gum-processInConfiguration>(w0:slm-Taking ^ slm-Taking)) " ,
"smain/.r" : " @x1:gs-AffectingDirectedMotion( <mood>imperative ^ <gs-route>x2 ^ <gum-actee>(w2:slm-Cup ^ cup ^ <det>the ^ <ident>specific ^ <quant>singular) ^ <gum-processInConfiguration>(w0:slm-Moving ^ slm-Taking)) " ,
"smain/.r/0" : " @x1:gs-AffectingDirectedMotion( <mood>imperative ^ <gs-route>x2 ^ <gum-actee>(w2:slm-Cup ^ cup ^ <det>the ^ <ident>specific ^ <quant>singular) ^ <gum-processInConfiguration>(w0:slm-Taking ^ slm-Taking)) "
},
"http_status" : 200 ,
"json_parses" : {
"smain" : {
"__class__" : " Nominal " ,
"type" : " gum-OrientationChange " ,
"name" : " x1 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " mood " ,
"target" : " imp "
},
{
"__class__" : " Role " ,
"type" : " gs-direction " ,
"target" : {
"__class__" : " Variable " ,
"type" : " gs-GeneralizedLocation " ,
"name" : " x2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " gs-hasSpatialModality " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Cup " ,
"name" : " w2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " cup "
},
{
"__class__" : " Role " ,
"type" : " det " ,
"target" : " the "
},
{
"__class__" : " Role " ,
"type" : " ident " ,
"target" : " specific "
},
{
"__class__" : " Role " ,
"type" : " quant " ,
"target" : " singular "
}
]
}
}
]
}
},
{
"__class__" : " Role " ,
"type" : " gum-processInConfiguration " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Moving " ,
"name" : " w0 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " slm-Taking "
}
]
}
}
]
},
"smain/0" : {
"__class__" : " Nominal " ,
"type" : " gum-OrientationChange " ,
"name" : " x1 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " mood " ,
"target" : " imp "
},
{
"__class__" : " Role " ,
"type" : " gs-direction " ,
"target" : {
"__class__" : " Variable " ,
"type" : " gs-GeneralizedLocation " ,
"name" : " x2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " gs-hasSpatialModality " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Cup " ,
"name" : " w2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " cup "
},
{
"__class__" : " Role " ,
"type" : " det " ,
"target" : " the "
},
{
"__class__" : " Role " ,
"type" : " ident " ,
"target" : " specific "
},
{
"__class__" : " Role " ,
"type" : " quant " ,
"target" : " singular "
}
]
}
}
]
}
},
{
"__class__" : " Role " ,
"type" : " gum-processInConfiguration " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Taking " ,
"name" : " w0 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " slm-Taking "
}
]
}
}
]
},
"smain/.r" : {
"__class__" : " Nominal " ,
"type" : " gs-AffectingDirectedMotion " ,
"name" : " x1 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " mood " ,
"target" : " imperative "
},
{
"__class__" : " Role " ,
"type" : " gs-route " ,
"target" : {
"__class__" : " Variable " ,
"type" : null ,
"name" : " x2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " gum-actee " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Cup " ,
"name" : " w2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " cup "
},
{
"__class__" : " Role " ,
"type" : " det " ,
"target" : " the "
},
{
"__class__" : " Role " ,
"type" : " ident " ,
"target" : " specific "
},
{
"__class__" : " Role " ,
"type" : " quant " ,
"target" : " singular "
}
]
}
},
{
"__class__" : " Role " ,
"type" : " gum-processInConfiguration " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Moving " ,
"name" : " w0 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " slm-Taking "
}
]
}
}
]
}
}
]
},
"smain/.r/0" : {
"__class__" : " Nominal " ,
"type" : " gs-AffectingDirectedMotion " ,
"name" : " x1 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " mood " ,
"target" : " imperative "
},
{
"__class__" : " Role " ,
"type" : " gs-route " ,
"target" : {
"__class__" : " Variable " ,
"type" : null ,
"name" : " x2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " gum-actee " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Cup " ,
"name" : " w2 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " cup "
},
{
"__class__" : " Role " ,
"type" : " det " ,
"target" : " the "
},
{
"__class__" : " Role " ,
"type" : " ident " ,
"target" : " specific "
},
{
"__class__" : " Role " ,
"type" : " quant " ,
"target" : " singular "
}
]
}
},
{
"__class__" : " Role " ,
"type" : " gum-processInConfiguration " ,
"target" : {
"__class__" : " Variable " ,
"type" : " slm-Taking " ,
"name" : " w0 " ,
"roles" : [
{
"__class__" : " Role " ,
"type" : " entity " ,
"target" : " slm-Taking "
}
]
}
}
]
}
}
]
}
},
"graphs" : {
"smain": "strict graph "" {ntnode [label="\N"];ntsubgraph cluster_x1 {nttgraph [fillcolor=lightskyblue,ntttlabel="x1: gum-OrientationChange",ntttstyle=filledntt];nttsubgraph "cluster_gs-direction" {ntttgraph [fillcolor=honeydew,nttttlabel="gs-direction",nttttstyle=fillednttt];ntttsubgraph cluster_x2 {nttttgraph [fillcolor=lightblue,ntttttlabel="x2: gs-GeneralizedLocation",ntttttstyle=filledntttt];nttttsubgraph "cluster_gs-hasSpatialModality" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gs-hasSpatialModality",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w2 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w2: slm-Cup",ntttttttstyle=filledntttttt];nttttttw2tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> cup|<det> the|<ident> specific|<quant> singular}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttt}ntt}nttsubgraph "cluster_gum-processInConfiguration" {ntttgraph [fillcolor=honeydew,nttttlabel="gum-processInConfiguration",nttttstyle=fillednttt];ntttsubgraph cluster_w0 {nttttgraph [fillcolor=lightblue,ntttttlabel="w0: slm-Moving",ntttttstyle=filledntttt];nttttw0tttt [fillcolor=aliceblue,ntttttlabel="{<entity> slm-Taking}",ntttttshape=Mrecord,ntttttstyle=filled];nttt}ntt}nttx1tt [fillcolor=aliceblue,ntttlabel="{<mood> imp}",ntttshape=Mrecord,ntttstyle=filled];nt}n}n",
"smain/0": "strict graph "" {ntnode [label="\N"];ntsubgraph cluster_x1 {nttgraph [fillcolor=lightskyblue,ntttlabel="x1: gum-OrientationChange",ntttstyle=filledntt];nttsubgraph "cluster_gs-direction" {ntttgraph [fillcolor=honeydew,nttttlabel="gs-direction",nttttstyle=fillednttt];ntttsubgraph cluster_x2 {nttttgraph [fillcolor=lightblue,ntttttlabel="x2: gs-GeneralizedLocation",ntttttstyle=filledntttt];nttttsubgraph "cluster_gs-hasSpatialModality" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gs-hasSpatialModality",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w2 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w2: slm-Cup",ntttttttstyle=filledntttttt];nttttttw2tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> cup|<det> the|<ident> specific|<quant> singular}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttt}ntt}nttsubgraph "cluster_gum-processInConfiguration" {ntttgraph [fillcolor=honeydew,nttttlabel="gum-processInConfiguration",nttttstyle=fillednttt];ntttsubgraph cluster_w0 {nttttgraph [fillcolor=lightblue,ntttttlabel="w0: slm-Taking",ntttttstyle=filledntttt];nttttw0tttt [fillcolor=aliceblue,ntttttlabel="{<entity> slm-Taking}",ntttttshape=Mrecord,ntttttstyle=filled];nttt}ntt}nttx1tt [fillcolor=aliceblue,ntttlabel="{<mood> imp}",ntttshape=Mrecord,ntttstyle=filled];nt}n}n",
"smain/.r": "strict graph "" {ntnode [label="\N"];ntsubgraph cluster_x1 {nttgraph [fillcolor=lightskyblue,ntttlabel="x1: gs-AffectingDirectedMotion",ntttstyle=filledntt];nttsubgraph "cluster_gs-route" {ntttgraph [fillcolor=honeydew,nttttlabel="gs-route",nttttstyle=fillednttt];ntttsubgraph cluster_x2 {nttttgraph [fillcolor=lightblue,ntttttlabel=None,ntttttstyle=filledntttt];nttttsubgraph "cluster_gum-actee" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gum-actee",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w2 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w2: slm-Cup",ntttttttstyle=filledntttttt];nttttttw2tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> cup|<det> the|<ident> specific|<quant> singular}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttttsubgraph "cluster_gum-processInConfiguration" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gum-processInConfiguration",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w0 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w0: slm-Moving",ntttttttstyle=filledntttttt];nttttttw0tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> slm-Taking}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttt}ntt}nttx1tt [fillcolor=aliceblue,ntttlabel="{<mood> imperative}",ntttshape=Mrecord,ntttstyle=filled];nt}n}n",
"smain/.r/0": "strict graph "" {ntnode [label="\N"];ntsubgraph cluster_x1 {nttgraph [fillcolor=lightskyblue,ntttlabel="x1: gs-AffectingDirectedMotion",ntttstyle=filledntt];nttsubgraph "cluster_gs-route" {ntttgraph [fillcolor=honeydew,nttttlabel="gs-route",nttttstyle=fillednttt];ntttsubgraph cluster_x2 {nttttgraph [fillcolor=lightblue,ntttttlabel=None,ntttttstyle=filledntttt];nttttsubgraph "cluster_gum-actee" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gum-actee",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w2 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w2: slm-Cup",ntttttttstyle=filledntttttt];nttttttw2tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> cup|<det> the|<ident> specific|<quant> singular}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttttsubgraph "cluster_gum-processInConfiguration" {ntttttgraph [fillcolor=honeydew,nttttttlabel="gum-processInConfiguration",nttttttstyle=fillednttttt];ntttttsubgraph cluster_w0 {nttttttgraph [fillcolor=lightblue,ntttttttlabel="w0: slm-Taking",ntttttttstyle=filledntttttt];nttttttw0tttttt [fillcolor=aliceblue,ntttttttlabel="{<entity> slm-Taking}",ntttttttshape=Mrecord,ntttttttstyle=filled];nttttt}ntttt}nttt}ntt}nttx1tt [fillcolor=aliceblue,ntttlabel="{<mood> imperative}",ntttshape=Mrecord,ntttstyle=filled];nt}n}n"
}
}
ตัวอย่างการแสดงภาพ (แสดงเฉพาะรอยเปื้อน):