이 저장소는 GUM 공간 온톨로지를 사용하여 OpenCCG 주위에 얇은 Python 래퍼를 구축하고 도커 컨테이너 내에서 실행할 준비가 되었습니다. litmus.informatik.uni-bremen.de/openccg에서 라이브 버전을 찾을 수 있습니다.
초기 docker-compose up
이후 간단한 POST 요청(예: 컬 사용)을 사용하여 서비스를 쿼리할 수 있습니다.
$ 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": ...}
"그래프" 필드는 graphs
URL 매개변수가 있는 경우에만 포함됩니다.
예를 들어 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 ())
litmus에서 nginx 뒤에 OpenCCG를 호스팅하는 방식으로 인해 web-openccg의 URL에는 모두 "openccg"라는 접두사가 붙습니다. 그러나 두 가지 중요한 엔드포인트(GUI의 경우 /
, API의 경우 /parse
)에는 리디렉션이 있습니다. 컬의 경우 이는 curl -L --data "Take the cup." localhost/parse
를 의미합니다. curl -L --data "Take the cup." localhost/parse
도 작동합니다( -L
( --location
) 인수 참고).
실제로 느리고 최적화되지 않았기 때문에 프로덕션 준비가 되지 않았습니다. OpenCCG의 하나(또는 여러) 인스턴스를 실행하여 더 빠르게 쿼리하는 대신 각 요청이 개별 OpenCCG 인스턴스를 생성합니다.
서비스를 시각적으로 쿼리하려면 http://localhost/openccg에서 브라우저를 열면 됩니다. 그렇지 않은 경우 명령줄이나 애플리케이션을 통해 web-openccg에 쿼리하려면 컬, wget 또는 Python 요청을 사용하세요.
클라이언트가 컬(curl)과 같이 요청 본문을 수동으로 작성할 수 있도록 허용하는 경우 다음 문장을 안에 넣으세요.
curl --data "Take the cup." localhost/openccg/parse
그러나 Python 요청과 같은 많은 상위 수준 프레임워크는 일반적으로 게시 데이터에 키-값 메커니즘을 사용합니다. 이 경우 핵심 sentence
사용하십시오.
requests.post('http://localhost/openccg/parse', data={'sentence': 'Take the cup.'})
예를 들어 아래를 참조하세요.
응답은 JSON 객체이며 항상 다음 필드를 포함합니다.
version
: JSON 객체 버전입니다.application
: 항상 "web-openccg"입니다. 이는 다양한 서비스의 구문 분석을 집계하는 경우 유용합니다.uuid
: 이 응답의 고유 ID입니다. 이는 도구를 어떻게든 통합하려는 경우에만 유용합니다.http_status
: 요청의 HTTP 상태입니다.요청 중에 문장이 제공된 경우 다음 필드가 표시됩니다.
sentence
: 정리된 입력 문장입니다(모두 소문자, 구두점 제거, ...).성공적인 구문 분석이 하나 이상 존재하는 경우 다음 필드가 포함됩니다.
parses
: OpenCCG가 출력할 때 실제로 구문 분석하기 위한 구문 분석 식별자(예: "np") 사전입니다.json_parses
: 플랫 JSON의 OpenCCG 출력 버전입니다. 이는 TatSu의 사용자 정의 문법을 통해 생성됩니다. 자세한 내용은 아래를 참조하세요. 각 개별 사전 값은 명목, 변수 및/또는 역할의 목록입니다.graphs
: 점 문자열에 대한 구문 분석 식별자 사전입니다. graphviz를 사용하여 렌더링할 수 있습니다. 온라인 GUI가 이를 자동으로 렌더링합니다. 참고: 키는 parses
, json_parses
및 graphs
간에 공유되므로 JSON 구문 분석에 대한 원본 출력을 쉽게 조회할 수 있으며 그 반대의 경우도 마찬가지입니다.
오류가 발생하면 오류 필드가 나타납니다.
error
: 오류 설명입니다.현재 버전: 2.3.0
OpenCCG 구문 분석을 위한 JSON 형식은 위의 예에서 또는 완전히 형식화된 OpenCCG.ebnf를 주의 깊게 검사하여 결정할 수 있습니다.
개체에는 명목형, 변수 및 역할의 세 가지 유형이 있습니다. 전체 의미 체계 사양(JSON 파일)은 세 가지 유형 중 하나의 단일 엔터티이거나 명목 목록일 수 있습니다. 변수나 역할 목록인 구문 분석을 찾으면 문법이 확장됩니다. 올바르게 구문 분석할 수 없는 문장을 발견하면 이슈를 열어주세요.
명사는 특별한 변수와 같으며 문장의 "주요 주제"를 설명합니다. 실질적으로 동일하기 때문에(실제로 매우 유사한 구문 분석 규칙을 가짐) 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도 마찬가지입니다.
포트를 변경하려면 docker-compose 파일을 조정하고 포트 줄을 "80:80"
에서 왼쪽의 포트로 변경합니다(그러나 오른쪽의 80은 유지). 예를 들어 포트 9043에서 서비스를 설정하려면 , "9043:80"
으로 변경합니다.
개발을 시작하기 전에 다음을 사용하여 Docker 컨테이너를 빌드해야 합니다.
make build
이 단계에는 빌드 프로세스 중에 로컬 ./webopenccg/static 디렉터리에 다운로드된 일부 파일도 포함됩니다. 개발 서버가 디렉터리를 마운트하기 때문에 복사가 완료됩니다. 디렉터리는 컨테이너 내부에서만 사용할 수 있고 호스트 시스템에서는 사용할 수 없는 파일을 덮어씁니다.
개발 Docker 컨테이너를 시작하려면 Makefile을 사용하십시오.
make run
개발 서버는 포트 5000에 바인딩하고 플라스크 디버그 환경을 사용합니다. 또한 make run
으로 시작된 도커 컨테이너는 플라스크의 다시 로드가 제대로 작동하도록 앱 디렉터리를 바인딩합니다.
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"
}
}
시각화 예시(주요 부분만 표시됨):