<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Sat, Apr 2, 2016 at 2:09 PM Stephan Oepen &lt;<a href="mailto:oe@ifi.uio.no">oe@ifi.uio.no</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">i also by and large followed your example for MRS serialization in<br>
JSON, with the complication that i want to allow variable properties<br>
on arbitrary argument positions, i.e. make these independent of a<br>
particular EP.  for now, i ended up with the following:<br>
<br>
MRS(30): (mrs-output-json (extract-mrs (first *parse-record*)) :stream<br>
t :columns 79)<br>
{&quot;top&quot;: {&quot;id&quot;: &quot;h1&quot;, &quot;type&quot;: &quot;h&quot;},<br>
 &quot;index&quot;: {&quot;id&quot;: &quot;e3&quot;, &quot;type&quot;: &quot;e&quot;, &quot;properties&quot;:<br>
 {&quot;SF&quot;: &quot;prop&quot;, &quot;TENSE&quot;: &quot;past&quot;, &quot;MOOD&quot;: &quot;indicative&quot;, &quot;PROG&quot;: &quot;-&quot;,<br>
&quot;PERF&quot;: &quot;-&quot;}},<br>
 &quot;rels&quot;:<br>
 [{&quot;label&quot;: {&quot;id&quot;: &quot;h4&quot;, &quot;type&quot;: &quot;h&quot;}, &quot;predicate&quot;: &quot;proper_q&quot;, &quot;lnk&quot;:<br>
{&quot;from&quot;: 0, &quot;to&quot;: 3}, &quot;roles&quot;:<br>
   {&quot;ARG0&quot;: {&quot;id&quot;: &quot;x6&quot;, &quot;type&quot;: &quot;x&quot;, &quot;properties&quot;: {&quot;PERS&quot;: &quot;3&quot;,<br>
&quot;NUM&quot;: &quot;sg&quot;, &quot;IND&quot;: &quot;+&quot;}}, &quot;RSTR&quot;: {&quot;id&quot;: &quot;h5&quot;, &quot;type&quot;: &quot;h&quot;}, &quot;BODY&quot;:<br>
{&quot;id&quot;: &quot;h7&quot;, &quot;type&quot;: &quot;h&quot;}}},<br>
  {&quot;label&quot;: {&quot;id&quot;: &quot;h8&quot;, &quot;type&quot;: &quot;h&quot;}, &quot;predicate&quot;: &quot;named&quot;, &quot;lnk&quot;:<br>
{&quot;from&quot;: 0, &quot;to&quot;: 3}, &quot;roles&quot;: {&quot;ARG0&quot;: {&quot;id&quot;: &quot;x6&quot;}, &quot;CARG&quot;: &quot;Kim&quot;}},<br>
  {&quot;label&quot;: {&quot;id&quot;: &quot;h2&quot;, &quot;type&quot;: &quot;h&quot;}, &quot;predicate&quot;: &quot;_arrive_v_1&quot;,<br>
&quot;lnk&quot;: {&quot;from&quot;: 4, &quot;to&quot;: 12}, &quot;roles&quot;: {&quot;ARG0&quot;: {&quot;id&quot;: &quot;e3&quot;}, &quot;ARG1&quot;:<br>
{&quot;id&quot;: &quot;x6&quot;}}}],<br>
 &quot;hcons&quot;:<br>
 [{&quot;relation&quot;: &quot;qeq&quot;, &quot;high&quot;: {&quot;id&quot;: &quot;h1&quot;}, &quot;low&quot;: {&quot;id&quot;: &quot;h2&quot;}},<br>
  {&quot;relation&quot;: &quot;qeq&quot;, &quot;high&quot;: {&quot;id&quot;: &quot;h5&quot;}, &quot;low&quot;: {&quot;id&quot;: &quot;h8&quot;}}]}<br>
<br>
this end up less compact than the simple format, in part because all<br>
variables are objects.  however, the full object content is only<br>
printed once (upon the first variable occurrence).<br></blockquote><div><br></div><div>(aside: I&#39;ve found that JSON is often not compact; even less than XML at times, and especially when printed with line-breaks and indentation; but if HTTP responses are compressed there&#39;s hardly any difference to compressed XML. But JSON is more readable and more convenient if you&#39;re consuming the JSON with Javascript (or even other languages like Python))</div><div><br></div><div>Regarding properties not just on EPs: I agree; I was forgetting that MRS can have variables for dropped arguments which aren&#39;t ARG0s of some EP but may have properties (e.g. through agreement or something).</div><div><br></div><div>Regarding variables-as-objects; I recognize they have some internal structure (variable-sort, variable-id, and assigned properties), but it&#39;s a headache for serialization. When writing, do you always write the full object, or use some reduced form (e.g., just the &quot;id&quot;) for all but the first occurrence? When reading, if two objects with the same ID both have properties, do you merge them, or use the first/second/etc., or throw an error? For these reasons, partly, I would prefer having simple strings for variables and a separate hash of variable-to-properties. E.g.:</div><div><br></div><div>{ &quot;top&quot;: &quot;h0&quot;, &quot;index&quot;: &quot;e2&quot;, ..., &quot;properties&quot;: { &quot;e2&quot;: { &quot;TENSE&quot;: &quot;past&quot;, ...}}}</div><div><br></div><div>For the variable-sort, I&#39;d use a simple regex-based function. E.g. (assuming here, and below, that your client language is Javascript):</div><div>    var variable_re = /(.*?)(\d+)$/;<br></div><div>    function varsort(v) { return v.replace(variable_re, &quot;$1&quot;); }</div><div>    varsort(&quot;x12&quot;);  # returns &quot;x&quot;</div><div><br></div><div>Also, if we don&#39;t put the variable properties in every variable object, then you&#39;ll have to do some post-processing (after deserializing JSON) in order to resolve those objects (and see below about re-entrancy). E.g. you might ask for:</div><div>    mrs.rels[2].roles.ARG0.properties</div><div>but that information is at:</div><div>    mrs.index.properties</div><div>Even if we did have the properties objects on every variable occurrence, the two above expressions don&#39;t return the same object; just ones with the same contents (hopefully).</div><div><br></div><div>With the separate properties list, you can do:</div><div>    mrs.properties[mrs.index]</div><div>or:</div><div>    mrs.properties[mrs.rels[2].roles.ARG0]</div><div>and get the same object back.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
really, what one might want is an explicit re-entrancy, e.g. something like<br>
<br>
  { &quot;index&quot;: #1={ &quot;id&quot;: &quot;x1&quot;, &quot;type&quot;: &quot;x&quot;, ...},<br>
    ... { &quot;ARG0&quot;: #1# ... } ... }<br>
<br>
but for all i can tell there is no facility like that available in JSON, right?<br></blockquote><div><br></div><div>It&#39;s not part of the JSON spec. But even XMLs ID and IDREF don&#39;t always result in actual-re-entrancies. You&#39;d need an XML reader that honors that information, AND probably the DTD (or other schema) that says which attributes are IDREFs. If you want this in JSON, you&#39;d have to do it yourself---i.e., write your own post-processing transforms after deserializing the JSON into Javascript objects---or use a library that does this for you.</div><div><br></div><div>Also see these:</div><div>* <a href="https://en.wikipedia.org/wiki/JSON#Object_references">https://en.wikipedia.org/wiki/JSON#Object_references</a><br></div><div>* <a href="http://www.jspon.org/">http://www.jspon.org/</a></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
—do you have any suggestions for refining the above further?  i<br>
debated making the surface vs. abstract predicate distinction explicit<br>
in the JSON serialization, but i currently look at JSON as an<br>
alternative to the simple serialization, specifically for the RESTful<br>
interface, hence i ended up with the above.<br></blockquote><div><br></div><div>I usually base my naming off the MRS DTD, e.g., &quot;pred&quot; instead of &quot;predicate&quot;, &quot;hi&quot; and &quot;lo&quot; in HCONS, etc., but I now see the fuller forms exist in the lisp code, which you may be more used to seeing. As long as it&#39;s documented, I don&#39;t think it matters either way.</div><div><br></div><div>Regarding surface vs abstract predicates: I don&#39;t have strong opinions here. I think the convention (rule?) that surface predicates begin with an underscore seems sufficient. For convenience, we could define a simple function (like the varsort() one above) to return something based on it&#39;s presence/absence (e.g. `predicateType(&quot;_arrive_v_1&quot;) == &quot;surface&quot;`). But similar to my thoughts on variables, I think making the value of the &quot;predicate&quot; key an object (e.g. `&quot;predicate&quot;: {&quot;value&quot;: &quot;_arrive_v_1&quot;, &quot;type&quot;: &quot;surface&quot;}`) would cause more problems than it would help.</div><div><br></div><div>Oh and BTW, Emily said (offline) that I shouldn&#39;t offer to take technical discussions offline. What I was withholding was that I tried requesting XML and got JSON instead of an error 406:</div><div><br></div><div><div>$ curl -v -H &quot;Accept: application/xml&quot; <a href="http://erg.delph-in.net/rest/0.9/parse?input=Abrams%20arrived">http://erg.delph-in.net/rest/0.9/parse?input=Abrams%20arrived</a></div><div>[...]</div><div>&lt; HTTP/1.1 200  OK</div><div>[...]</div><div>{&quot;input&quot;: &quot;Abrams arrived&quot;,<br></div></div><div>[...]</div><div><br></div><div>There are differing opinions on how to treat bad requests (<a href="http://archive.oreilly.com/pub/post/restful_error_handling.html">http://archive.oreilly.com/pub/post/restful_error_handling.html</a>), but I think that returning descriptive status codes is a good way to help the client know what to present the user.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
cheers, oe<br>
<br>
<br>
On Tue, Mar 29, 2016 at 1:00 AM, Michael Wayne Goodman<br>
&lt;<a href="mailto:goodmami@u.washington.edu" target="_blank">goodmami@u.washington.edu</a>&gt; wrote:<br>
&gt; Hi Stephan,<br>
&gt;<br>
&gt; On Mon, Mar 28, 2016 at 1:53 PM Stephan Oepen &lt;<a href="mailto:oe@ifi.uio.no" target="_blank">oe@ifi.uio.no</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; dear colleagues,<br>
&gt;&gt;<br>
&gt;&gt; i used part of the easter break to teach myself about modern<br>
&gt;&gt; technologies and are currently in the process of providing a RESTful<br>
&gt;&gt; (programmatic) interface to the on-line ERG demonstrator.  i know of<br>
&gt;&gt; at least one colleague who has been waiting impatiently for this<br>
&gt;&gt; functionality :-).<br>
&gt;&gt;<br>
&gt;&gt; in a nutshell, client software can now obtain parses using the HTTP<br>
&gt;&gt; protocol and URIs providing the input string (and a handful of<br>
&gt;&gt; optional parameters).  for example:<br>
&gt;&gt;<br>
&gt;&gt;   <a href="http://erg.delph-in.net/rest/0.9/parse?input=Abrams%20arrived" rel="noreferrer" target="_blank">http://erg.delph-in.net/rest/0.9/parse?input=Abrams%20arrived</a>.<br>
&gt;&gt;<br>
&gt;&gt; parsing results will be returned in machine-readable format,<br>
&gt;&gt; serialized as a JSON document.  for a little more background on how to<br>
&gt;&gt; use this new service (including an example client in Python, believe<br>
&gt;&gt; it or not), please see:<br>
&gt;&gt;<br>
&gt;&gt;   <a href="http://moin.delph-in.net/ErgApi" rel="noreferrer" target="_blank">http://moin.delph-in.net/ErgApi</a><br>
&gt;<br>
&gt;<br>
&gt; What a beautiful bike shed :)<br>
&gt;<br>
&gt; BTW, Demophin has an undocumented HTTP API, but it&#39;s not RESTful:<br>
&gt;<br>
&gt; $ curl -F &#39;sentence=Abrams arrived.&#39;<br>
&gt; <a href="http://chimpanzee.ling.washington.edu/demophin/erg/parse" rel="noreferrer" target="_blank">http://chimpanzee.ling.washington.edu/demophin/erg/parse</a><br>
&gt;<br>
&gt; I had hoped to change it to follow the REST principles more closely and<br>
&gt; document the API, but I&#39;m happy to know that you&#39;ve already started that<br>
&gt; effort.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; there is some more work to be done on the interface (see the page<br>
&gt;&gt; above), but i would like to ask for help already at this point:<br>
&gt;&gt;<br>
&gt;&gt; (0) in case you notice anything surprising in the interactive ERG<br>
&gt;&gt; demonstrator, please do not hesitate to let me know!<br>
&gt;<br>
&gt;<br>
&gt; If you&#39;re defining a new JSON schema for EDS, then maybe we can do something<br>
&gt; more convenient for, e.g., lnk values. Currently the indices are encoded in<br>
&gt; a string:<br>
&gt;<br>
&gt;     &quot;lnk&quot;: &quot;&lt;0:6&gt;&quot;<br>
&gt;<br>
&gt; If we make it a JSON object, then users of the results wouldn&#39;t have to<br>
&gt; parse the string later:<br>
&gt;<br>
&gt; &quot;lnk&quot;: {&quot;type&quot;: &quot;charspan&quot;, &quot;cfrom&quot;: 0, &quot;cto&quot;: 6}<br>
&gt;<br>
&gt; (The &quot;type&quot; could be optional if we define &quot;charspan&quot; as the default, or if<br>
&gt; we pretend that the other types don&#39;t exist)<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; (1) i still need to provide a serialization of MRSs in JSON; in case<br>
&gt;&gt; anyone has previously tackled this (design) problem, please do get in<br>
&gt;&gt; touch!<br>
&gt;<br>
&gt;<br>
&gt; Not yet, sorry.  One thing that comes to mind is that JSON doesn&#39;t have an<br>
&gt; unordered collection aside from objects (hashes), which require keys. So we<br>
&gt; could treat the RELS, HCONS, and ICONS bags as arrays (lists) (but we often<br>
&gt; do this anyway, so I think it&#39;s fine to use arrays). Here&#39;s a rather direct<br>
&gt; conversion:<br>
&gt;<br>
&gt; { &quot;top&quot;: &quot;h0&quot;, &quot;index&quot;: &quot;e2&quot;, &quot;rels&quot;: [ {&quot;pred&quot;: &quot;proper_q&quot;, &quot;lbl&quot;: &quot;h3&quot;,<br>
&gt; &quot;arg0&quot;: &quot;x4&quot;...}...]...}<br>
&gt;<br>
&gt; One thing that isn&#39;t obvious is variable properties. They could follow the<br>
&gt; EDS example and put them in the EP object (and similarly be controlled by<br>
&gt; the &quot;properties&quot; parameter in the URL):<br>
&gt;<br>
&gt; { ..., &quot;rels&quot;: [ { &quot;pred&quot;: &quot;named&quot;, ..., &quot;properties&quot;: { &quot;PERS&quot;: &quot;3&quot;}}, ...<br>
&gt; ], ...}<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; (2) i think it might be nice to incorporate RESTful parsing as an<br>
&gt;&gt; option in pyDelphin; mike, could you be interested in collaborating on<br>
&gt;&gt; this?<br>
&gt;<br>
&gt;<br>
&gt; Yes. Whatever API we settle on, I&#39;d like to incorporate that into pyDelphin<br>
&gt; and use it as the basis for Demophin as well.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; finally, i would be curious to hear comments or suggestions for how to<br>
&gt;&gt; use and extend this service (though cannot promise i will have a lot<br>
&gt;&gt; of time to develop this further until another holiday break); please<br>
&gt;&gt; see towards the bottom of the above wiki page for some candidate<br>
&gt;&gt; directions.<br>
&gt;<br>
&gt;<br>
&gt; I&#39;ve done a couple of REST APIs so far, so I have some suggestions (some are<br>
&gt; rather technical so I&#39;m happy to save those for an off-list discussion).<br>
&gt;<br>
&gt; One thing that might be relevant to others is how we can request other<br>
&gt; formats. I see you have parameters &quot;eds=...&quot;, &quot;derivation=...&quot;, &quot;mrs=...&quot;,<br>
&gt; so presumably we could expand it with others (&quot;rmrs=...&quot;, &quot;dmrs=...&quot;, etc.)?<br>
&gt;<br>
&gt; Other ideas:<br>
&gt; * what about generation?<br>
&gt; * can set a request header for preprocessing? (e.g. morphological<br>
&gt; segmentation for Jacy or Zhong)<br>
&gt; * If we have already preprocessed, can we specify the Content-Type (e.g.<br>
&gt; Content-Type: application/yy)<br>
&gt;<br>
&gt;&gt; best wishes; god påske!  oe<br>
&gt;&gt;<br>
&gt;<br>
</blockquote></div></div>