<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.aclweb.org/aclwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David+Chiang</id>
	<title>ACL Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.aclweb.org/aclwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=David+Chiang"/>
	<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/Special:Contributions/David_Chiang"/>
	<updated>2026-04-22T10:24:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8421</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8421"/>
		<updated>2010-11-11T22:54:47Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Proposed extensions (yea or nay?) / Open questions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
** David: yea&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
** David: on the fence about this one&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
** David: yea, I think it should be called &#039;&#039;&#039;weight&#039;&#039;&#039; and the weight of the forest is the sum-product.&lt;br /&gt;
&lt;br /&gt;
* Should an Edge with empty &#039;&#039;&#039;tails&#039;&#039;&#039; be allowed? If so, should the following two forests be considered equivalent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ nodes: [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ ] }&lt;br /&gt;
{ nodes : [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ { head: 0, tails: [ ] } ] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** David: yes, tailless edges should be allowed, otherwise it&#039;s not nice to represent the set of trees { (a b) , (a (b c)) }. But the two example forests above should be considered equivalent since they generate the same set of trees.&lt;br /&gt;
&lt;br /&gt;
* A tree can be represented as a Forest where every node has only one incoming edge, but is there any desire for a more concise representation of a tree belonging to an existing Forest? Like a list of Edge ids?&lt;br /&gt;
&lt;br /&gt;
* Can/should we require that &#039;&#039;&#039;edges&#039;&#039;&#039; come after &#039;&#039;&#039;nodes&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8420</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8420"/>
		<updated>2010-11-11T21:37:17Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Proposed extensions (yea or nay?) / Open questions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
** David: yea&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
** David: on the fence about this one&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
** David: yea, I think it should be called &#039;&#039;&#039;weight&#039;&#039;&#039; and the weight of the forest is the sum-product.&lt;br /&gt;
&lt;br /&gt;
* Should an Edge with empty &#039;&#039;&#039;tails&#039;&#039;&#039; be allowed? If so, should the following two forests be considered equivalent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ nodes: [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ ] }&lt;br /&gt;
{ nodes : [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ { head: 0, tails: [ ] } ] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** David: yes, tailless edges should be allowed, otherwise it&#039;s not nice to represent the set of trees { (a b) , (a (b c)) }. But the two example forests above should be considered equivalent since they generate the same set of trees.&lt;br /&gt;
&lt;br /&gt;
* A tree can be represented as a Forest where every node has only one incoming edge, but is there any desire for a more concise representation of a tree belonging to an existing Forest? Like a list of Edge ids?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8419</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8419"/>
		<updated>2010-11-11T21:37:03Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
** David: yea&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
** David: on the fence about this one&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
** David: yea, I think it should be called &#039;&#039;&#039;weight&#039;&#039;&#039; and the weight of the forest is the sum-product.&lt;br /&gt;
&lt;br /&gt;
* Should an Edge with empty &#039;&#039;&#039;tails&#039;&#039;&#039; be allowed? If so, should the following two forests be considered equivalent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ nodes: [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ ] }&lt;br /&gt;
{ nodes : [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ { head: 0, tails: [ ] } ] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** David: yes, tailless edges should be allowed, otherwise it&#039;s not nice to represent the set of trees { (a b) , (a (b c)) }. But the two example forests above should be considered equivalent since they generate the same set of trees.&lt;br /&gt;
&lt;br /&gt;
* A tree can be represented as a Forest where every node has only one incoming edge, but is there any desire for a more concise representation of a tree belonging to an existing Forest? Like a list of Edge ids?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8418</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8418"/>
		<updated>2010-11-11T21:36:30Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Proposed extensions (yea or nay?) / Open questions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
** David: yea&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
** David: on the fence about this one&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
** David: yea, I think it should be called &#039;&#039;&#039;weight&#039;&#039;&#039; and the weight of the forest is the sum-product.&lt;br /&gt;
&lt;br /&gt;
* Should an Edge with empty &#039;&#039;&#039;tails&#039;&#039;&#039; be allowed? If so, should the following two forests be considered equivalent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ nodes: [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ ] }&lt;br /&gt;
{ nodes : [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ { head: 0, tails: [ ] } ] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** David: yes, tailless edges should be allowed, otherwise it&#039;s not nice to represent the set of trees { (a b) , (a (b c)) }. But the two example forests above should be considered equivalent since they generate the same set of trees.&lt;br /&gt;
&lt;br /&gt;
* A tree can be represented as a Forest where every node has only one incoming edge, but is there any desire for a more concise representation of a tree belonging to an existing Forest? Like a list of Edge ids?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8417</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8417"/>
		<updated>2010-11-11T21:33:15Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Proposed extensions (yea or nay?) / Open questions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
** David: yea&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
** David: on the fence about this one&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
** David: yea, I think it should be called &#039;&#039;&#039;weight&#039;&#039;&#039; and the weight of the forest is the sum-product.&lt;br /&gt;
&lt;br /&gt;
* Should an Edge with empty &#039;&#039;&#039;tails&#039;&#039;&#039; be allowed? If so, should the following two forests be considered equivalent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ nodes: [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ ] }&lt;br /&gt;
{ nodes : [ { label: &amp;quot;a&amp;quot; } ],&lt;br /&gt;
  edges: [ { head: 0, tails: [ ] } ] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** David: yes, tailless edges should be allowed, otherwise it&#039;s not nice to represent the set of trees { (a b) , (a (b c)) }. But the two example forests above should be considered equivalent since they generate the same set of trees.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8415</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8415"/>
		<updated>2010-11-09T21:53:14Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + ijson (http://pypi.python.org/pypi/ijson/)  or yajl-py (http://pykler.github.com/yajl-py/) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8414</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8414"/>
		<updated>2010-11-09T21:52:32Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
** For Python, yajl + (&amp;lt;a href=&amp;quot;http://pypi.python.org/pypi/ijson/&amp;quot;&amp;gt;ijson&amp;lt;/a&amp;gt; or &amp;lt;a href=&amp;quot;http://pykler.github.com/yajl-py/&amp;quot;&amp;gt;yajl-py&amp;lt;/a&amp;gt;) might address these concerns.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8413</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8413"/>
		<updated>2010-11-09T21:37:45Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Serialization library options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8412</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8412"/>
		<updated>2010-11-09T21:36:13Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Serialization library options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
* Interesting study under Python: http://metaoptimize.com/blog/2009/03/22/fast-deserialization-in-python/&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8411</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8411"/>
		<updated>2010-11-09T17:43:38Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example: http://www.isi.edu/~chiang/software/forest/example&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8410</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8410"/>
		<updated>2010-11-09T17:40:36Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Bindings/Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/software/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries/Software ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* (David) this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
Software&lt;br /&gt;
* (David) I&#039;ve written a web app for visually exploring forests that I will move over to the new format if it&#039;s JSON (currently it uses XML). Please e-mail me for the link if you want to play; it uses a lot of bandwidth.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8409</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8409"/>
		<updated>2010-11-09T17:37:00Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
** David: Since edges are not shared, it should always be easy to propagate node features down to its edges (i.e., to the edges which it is the head of). I would favor, however, eliminating node features.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/software/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
* Should Edge have an optional &#039;&#039;&#039;weight&#039;&#039;&#039; field? &#039;&#039;&#039;logweight&#039;&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8408</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8408"/>
		<updated>2010-11-09T17:32:38Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Proposed extensions (yea or nay?) / Open questions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
* Some languages (e.g., Python) do not natively support event-driven parsers for JSON, meaning it&#039;s hard to do process JSON files without first loading the entire thing. Since parse forests can be &#039;&#039;&#039;big&#039;&#039;&#039; in real applications, event-driven parsers that construct a hypergraph library&#039;s internal data structure are crucial. For example, loading the example hypergraph using Python&#039;s json.load() command takes almost 10 minutes and 7gb of memory. I understand the desire for familiarity and simplicity, but this scaling behavior makes me worry this won&#039;t be usable for real applications.&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
* (ChrisD) &#039;&#039;question&#039;&#039;: some libraries don&#039;t represent node-level features internally (at least Joshua &amp;amp; cdec), so these would need to denormalize node-level features to either all incoming or outgoing edges of the node in question. This may not be completely straightforward to do. Should we possibly consider just edge-level features?&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/software/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
=== Proposed extensions (yea or nay?) / Open questions ===&lt;br /&gt;
&lt;br /&gt;
*When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
** David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
** ChrisD: nay. agree with David.&lt;br /&gt;
*When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
** ChrisD: I&#039;m in favor of referring to nodes/nonterminals with a numeric id for consistency enforcement (which is admittedly ugly), but supporting optional string aliases/labels for applications that care about such things.&lt;br /&gt;
&lt;br /&gt;
*Another possible extension for edges: it may be useful to encode synchronous forests (for example, imagine the forest of derivations over an input lattice). Do we want to have an optional alt_tails? or a vector of tails (for multiple languages?)?&lt;br /&gt;
** David: IMO that would take us beyond hypergraphs. But nothing would stop you from adding your own fields:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ head: 123, tails: [456, 789],&lt;br /&gt;
  french: [&amp;quot;le&amp;quot;, 456, &amp;quot;que&amp;quot;, 789],&lt;br /&gt;
  english: [&amp;quot;the&amp;quot;, 456, &amp;quot;that&amp;quot;, 789],&lt;br /&gt;
  chinese: [789, &amp;quot;de&amp;quot;, &amp;quot;456&amp;quot;] }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I don&#039;t think the standard needs to specify exactly how this is done.&lt;br /&gt;
&lt;br /&gt;
*What do we think about non-coaccessible states? Is a forest well-formed if it contains elements that cannot be reached from the root?&lt;br /&gt;
** David: yes, I don&#039;t think the format should care&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
C++&lt;br /&gt;
* (ChrisD) I&#039;ll add support for whatever we come up to the cdec hypergraph library. This should make my hypergraph MERT available to non-cdec decoders with very little overhead.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8392</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8392"/>
		<updated>2010-11-08T19:43:20Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/software/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8391</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8391"/>
		<updated>2010-11-08T19:43:03Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* Bindings/Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8390</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8390"/>
		<updated>2010-11-08T19:42:52Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Example (40M): http://www.isi.edu/~chiang/forest/example.gz&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8389</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8389"/>
		<updated>2010-11-08T18:53:55Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
== Bindings/Libraries ==&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
* this module could be easily adapted to the new format: http://www.isi.edu/~chiang/software/forest.py. In 400 lines it has an Earley-style parser that does inside-outside with correct handling of cycles, and lazy k-best derivations.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8388</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8388"/>
		<updated>2010-11-08T18:42:19Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
&lt;br /&gt;
A Node or Edge object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
and any other application-specific fields.&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8387</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8387"/>
		<updated>2010-11-08T18:40:52Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
A Node object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of node ids&lt;br /&gt;
and the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8386</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8386"/>
		<updated>2010-11-08T18:40:13Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a Node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
A Node object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a (possibly empty) list of Node ids&lt;br /&gt;
and the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
Proposed extensions (yea or nay?):&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a set of trees, the Node.&#039;&#039;&#039;label&#039;&#039;&#039;s will be the labels of the tree nodes. It might be convenient to allow a shorthand for leaf/terminal labels: in Edge.&#039;&#039;&#039;tails&#039;&#039;&#039;, a string &#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039; would be shorthand for &#039;&#039;&#039;{label: &amp;quot;&#039;&#039;&#039;&#039;&#039;a&#039;&#039;&#039;&#039;&#039;&amp;quot;}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In Node.&#039;&#039;&#039;label&#039;&#039;&#039;, a value of &#039;&#039;&#039;null&#039;&#039;&#039; means that the tree node is labeled with epsilon, the empty string. This is not the same as &#039;&#039;&#039;&amp;quot;&amp;quot;&#039;&#039;&#039;&#039;: the former would not contribute anything to the yield of the tree, whereas the latter would contribute a token of length 0.&lt;br /&gt;
* David Chiang: nay, this should be left to the application. An empty Edge.&#039;&#039;&#039;tails&#039;&#039;&#039; list has the same effect. And people who care about explicit empty nodes might want to distinguish several kinds of empty nodes (&#039;&#039;t&#039;&#039;, PRO, pro, etc.).&lt;br /&gt;
&lt;br /&gt;
When a hypergraph represents a CFG, the Nodes will be the nonterminal symbols and the Edges will be the productions. It will be ugly for numeric Node ids to appear in the productions, so symbolic names might be preferable. Perhaps a Node object can have a string-valued &#039;&#039;&#039;id&#039;&#039;&#039; field by which it can be referred to. Con: who is going to guarantee that the names are unique? Alternatively, a Forest object can have a &#039;&#039;&#039;nodealiases&#039;&#039;&#039; field which is an object mapping from symbolic names to numeric ids.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8385</id>
		<title>Hypergraph Format</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=Hypergraph_Format&amp;diff=8385"/>
		<updated>2010-11-08T18:17:11Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: proposed schema for JSON format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overall goal =&lt;br /&gt;
&lt;br /&gt;
Make it easy to share packed representations across NLP applications.&lt;br /&gt;
Therefore we want a spec that is primarily easy to use from a variety of different platforms and languages.&lt;br /&gt;
A memory efficient and fast representation is also useful.&lt;br /&gt;
&lt;br /&gt;
= Serialization library options =&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
[http://www.json.org/ JSON Description]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Implementations in every language (often packaged with language).&lt;br /&gt;
* Human readable&lt;br /&gt;
* Already used in CDec for forest output&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Space inefficient&lt;br /&gt;
* Requires custom parser for speed&lt;br /&gt;
* Need additional code to check for well-formed hypergraphs, since there is no schema for JSON objects&lt;br /&gt;
&lt;br /&gt;
Proposed schema:&lt;br /&gt;
&lt;br /&gt;
A Forest object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;nodes&#039;&#039;&#039;: a list of Node objects&lt;br /&gt;
* &#039;&#039;&#039;edges&#039;&#039;&#039;: a list of Edge objects&lt;br /&gt;
* &#039;&#039;&#039;root&#039;&#039;&#039;: a node id, which is an integer index into the &#039;&#039;&#039;nodes&#039;&#039;&#039; list&lt;br /&gt;
&lt;br /&gt;
A Node object has the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
An Edge object has the following required fields:&lt;br /&gt;
* &#039;&#039;&#039;head&#039;&#039;&#039;: a node id&lt;br /&gt;
* &#039;&#039;&#039;tails&#039;&#039;&#039;: a list of node ids&lt;br /&gt;
and the following optional fields:&lt;br /&gt;
* &#039;&#039;&#039;label&#039;&#039;&#039;: string&lt;br /&gt;
* &#039;&#039;&#039;features&#039;&#039;&#039;: a FeatureVector object&lt;br /&gt;
&lt;br /&gt;
A FeatureVector object has arbitrary fields with float values.&lt;br /&gt;
&lt;br /&gt;
== Protocol Buffers ==&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/protobuf/ Protocol Buffer Description]&lt;br /&gt;
&lt;br /&gt;
[http://github.com/srush/hypergraph Implementation Sketch]&lt;br /&gt;
&lt;br /&gt;
Pro:&lt;br /&gt;
* Conversion to and from JSON ([http://code.google.com/p/protobuf-json/ protobuf-json])&lt;br /&gt;
* Very fast to read (particularly in C++ and Java, hopefully soon in python)&lt;br /&gt;
* Very space efficient&lt;br /&gt;
* Implementations in Java, C++ and Python; generates typed stubs in those languages&lt;br /&gt;
&lt;br /&gt;
Con:&lt;br /&gt;
* No implementations for Perl, C#, or other languages commonly used by NLP folks&lt;br /&gt;
* Requires a separate library; adds an external dependency to spec&lt;br /&gt;
* &amp;quot;It&#039;s really easy to get up to some of the data size limits that are in place to prevent malicious data from having the PB parser allocate too much memory&amp;quot;. Some of the limits are described in the section describing SetTotalBytesLimit on [http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.io.coded_stream.html this page]. &lt;br /&gt;
* &amp;quot;You typically have to create a full hypergraph protocol buffer object before you can serialize it, so you either have to use the PB data structures internally in your code or you have to copy your data structure. While doing this copy, you can end up with two copies of the forest in memory, which is bad for memory usage.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Variation of SLF (Standard Lattice Format) ==&lt;br /&gt;
&lt;br /&gt;
[http://labrosa.ee.columbia.edu/doc/HTKBook21/node257.html SLF Specification]&lt;br /&gt;
&lt;br /&gt;
Pro: &lt;br /&gt;
* Blindingly fast. &lt;br /&gt;
* Could be implemented to work lazy/streaming.&lt;br /&gt;
&lt;br /&gt;
Con: &lt;br /&gt;
* Requires a custom format&lt;br /&gt;
* Probably need specialized language bindings.&lt;br /&gt;
&lt;br /&gt;
== Tiburon Format ==&lt;br /&gt;
&lt;br /&gt;
[http://www.isi.edu/licensed-sw/tiburon/ Tiburon Specification]&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Machine translation]]&lt;br /&gt;
* [[Machine translation software]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machine translation]]&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
	<entry>
		<id>https://www.aclweb.org/aclwiki/index.php?title=People&amp;diff=3517</id>
		<title>People</title>
		<link rel="alternate" type="text/html" href="https://www.aclweb.org/aclwiki/index.php?title=People&amp;diff=3517"/>
		<updated>2007-04-13T21:12:47Z</updated>

		<summary type="html">&lt;p&gt;David Chiang: /* C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of homepages of researchers in Computational Linguistics, in the form &#039;&#039;&#039;last name, first name - affiliation&#039;&#039;&#039;. Most of the early additions have been moved here from the [http://www.aclweb.org/universe ACL NLP/CL Universe]. For more information about people in Computational Linguistics and Artificial Intelligence, explore their [[Academic genealogy|academic genealogy]].&lt;br /&gt;
&lt;br /&gt;
== A ==&lt;br /&gt;
&lt;br /&gt;
*[http://littera.deusto.es/prof/abaitua Abaitua, Joseba] - Universidad de Deusto&lt;br /&gt;
*[http://tony.abou-assaleh.net Abou-Assaleh, Tony] - Dalhousie University&lt;br /&gt;
*[http://www-personal.umich.edu/~ladamic/ Adamic, Lada] - University of Michigan&lt;br /&gt;
*[http://www.cond.org/ Adar, Eytan] - University of Washington&lt;br /&gt;
*[http://www.dfki.de/~janal/ Alexandersson,  Jan] - German Research Center for Artificial Intelligence&lt;br /&gt;
*[http://www-scf.usc.edu/~alcazar/ Alcázar, Asier] - University  of Southern California&lt;br /&gt;
*[http://www.cs.rochester.edu/u/james/ Allen, James] - University of Rochester&lt;br /&gt;
*[http://www.dc.fi.udc.es/~alonso/ Alonso, Miguel A.]&lt;br /&gt;
*[http://www.linguist.jussieu.fr/~amsili/ Amsili, Pascal] - University of Paris 7 - Denis Diderot&lt;br /&gt;
*[http://www.aueb.gr/users/ion/ Androutsopoulos, Ion] - Athens University of Economics and Business&lt;br /&gt;
*[http://www.carleton.ca/~asudeh/ Asudeh, Ash] - Carleton University &lt;br /&gt;
*[http://www.coli.uni-sb.de/~tania/ Avgustinova, Tania] - Universität des Saarlandes&lt;br /&gt;
&lt;br /&gt;
== B ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cs.cmu.edu/~klb Baker, Kathryn] - Carnegie Mellon University&lt;br /&gt;
*[http://uts.cc.utexas.edu/~jbaldrid/ Baldridge, Jason] - University of Texas at Austin&lt;br /&gt;
*[http://www.cs.mu.oz.au/~tim/ Baldwin, Timothy] - University  of Melbourne&lt;br /&gt;
*[http://www.georgetown.edu/cball/cball.html Ball, Catherine] - Georgetown University&lt;br /&gt;
*[http://www.lsi.upc.es/~batalla Batalla,Jordi Atserias] -  UPC, Spain&lt;br /&gt;
*[http://www5.informatik.uni-erlangen.de/Personen/batliner/  Batliner, Anton] - Friedrich-Alexander-Universität Erlangen-N&amp;amp;uuml;rnberg&lt;br /&gt;
*[http://www.dfki.de/~becker Becker, Tilman] - DFKI Saarbruecken, Germany&lt;br /&gt;
*[http://faculty.washington.edu/ebender Bender, Emily] - University of Washington&lt;br /&gt;
*[http://www.cs.mu.oz.au/~sb/ Bird, Steven] - University of Melbourne&lt;br /&gt;
*[http://seneca.uab.es/filfrirom/Blanco.html Blanco, Xavier] - Autonomous University of Barcelona&lt;br /&gt;
*[http://www.pdg.cnb.uam.es/blaschke/personalPage.html Blaschke, Christian]&lt;br /&gt;
*[http://www.dcs.shef.ac.uk/~kalina/ Boncheva, Kalina] - Univ. of Sheffield&lt;br /&gt;
*[http://www.kecl.ntt.co.jp/icl/mtg/members/bond/ Bond, Francis] - NTT Communication Science Laboratories&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/jbos/ Bos, Johan] - University of Rome &amp;quot;La Sapienza&amp;quot;&lt;br /&gt;
*[http://www.iro.umontreal.ca/~boufaden/  Boufaden, Narjès] - University of Montreal&lt;br /&gt;
*[http://www.let.rug.nl/~gosse Bouma, Gosse] - RU Groningen&lt;br /&gt;
*[http://www.di.fc.ul.pt/~ahb/ Branco, Antonio] - University of Lisbon&lt;br /&gt;
*[http://www.karlbranting.net Branting, Karl]&lt;br /&gt;
*[http://coli.uni-sb.de/~thorsten Brants, Thorsten] - University of Saarland&lt;br /&gt;
*[http://www.coli.uni-sb.de/~brawer Brawer, Sascha] - University of the Saarland&lt;br /&gt;
*[http://www.cs.cornell.edu/~ebreck Breck, Eric]&lt;br /&gt;
*[http://www.csse.monash.edu.au/~jwb/ Breen, Jim] - Monash University&lt;br /&gt;
*[http://www.informatik.uni-leipzig.de/~brewka/ Brewka] - Gerhard, University of Leipzig&lt;br /&gt;
*[http://research.microsoft.com/%7Ebrill/  Brill, Eric]&lt;br /&gt;
*[http://www.cl.cam.ac.uk/users/ejb/ Briscoe, Ted] - University of Cambridge&lt;br /&gt;
*[http://www.dfki.de/~paulb Buitelaar, Paul] - DFKI&lt;br /&gt;
*[http://www.cs.utexas.edu/users/razvan/ Bunescu, Razvan] - University of Texas at Austin&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.hinocatv.ne.jp/~price/ Caldwell, Price] - Meisei University&lt;br /&gt;
*[http://www.acs.ilstu.edu/faculty/mecalif/calif.htm  Califf,Mary Elaine] - Illinois State University&lt;br /&gt;
*[http://ilk.uvt.nl/~sander/ Canisius, Sander] - Tilburg University&lt;br /&gt;
*[http://www.cis.upenn.edu/~cliff-group/94/carberry.html Carberry, Sandra] - Univ. of Delaware, Univ. of Pennsylvania&lt;br /&gt;
*[http://www.cs.cornell.edu/Info/Faculty/Claire_Cardie.html Cardie, Claire] - Cornell University&lt;br /&gt;
*[http://www.cogs.susx.ac.uk/lab/nlp/carroll/carroll.html Carroll, John] - University of Sussex&lt;br /&gt;
*[http://jones.ling.indiana.edu/~dcavar Cavar, Damir] - Indiana University, Bloomington&lt;br /&gt;
*[http://tantek.com/map.html Celik, Tantek] - Technorati&lt;br /&gt;
*[http://cer.freeshell.org Cer, Daniel] - University of Colorado at Boulder&lt;br /&gt;
*[http://www.cs.uleth.ca/~chali Chali, Yllias] - University of Lethbridge&lt;br /&gt;
*[http://www.cs.brown.edu/people/ec/home.html Charniak, Eugene] - Brown University&lt;br /&gt;
*[http://www.ciscl.unisi.it/persone/chesi.htm Chesi, Cristiano] - CISCL, University of Siena&lt;br /&gt;
*[http://www.isi.edu/~chiang Chiang, David] - USC Information Sciences Institute&lt;br /&gt;
*[http://www.alphabit.net/Docente/docente_eng.htm Chiari, Isabella] - University &amp;quot;La Sapienza&amp;quot; of Rome&lt;br /&gt;
*[http://korterm.kaist.ac.kr/kschoi/  Choi, Key-Sun] - Korea Advanced Institute of Science and Technology&lt;br /&gt;
*[http://web.mit.edu/afs/athena.mit.edu/org/l/linguistics/www/chomsky.home.html Chomsky, Noam] - MIT&lt;br /&gt;
*[http://research.microsoft.com/users/church/ Church, Kenneth] - Microsoft&lt;br /&gt;
*[http://www.dcs.shef.ac.uk/~fabio/ Ciravegna, Fabio] - University of Sheffield&lt;br /&gt;
*[http://www.iccs.informatics.ed.ac.uk/~stephenc Clark, Stephen] - University of Edinburgh&lt;br /&gt;
*[http://compbio.uchsc.edu/Hunter_lab/Cohen Cohen, Kevin Bretonnel] - U. Colorado School of Medicine&lt;br /&gt;
*[http://people.csail.mit.edu/u/m/mcollins/public_html/ Collins, Michael] - MIT Computer Science and Artificial Intelligence Laboratory&lt;br /&gt;
*[http://www.cl.cam.ac.uk/users/aac10/ Copestake, Ann] - University of Cambridge&lt;br /&gt;
*[http://lands.let.kun.nl/TSpublic/coppen Coppen, Peter-Arno] -  University of Nijmegen, The Netherlands&lt;br /&gt;
*[http://plg.uwaterloo.ca/~gvcormac/ Cormack, Gordon] - University of Waterloo&lt;br /&gt;
*[http://www.psych.qub.ac.uk/staff/teaching/cowie/index.aspx Cowie, Roddy] - Queen&#039;s University, Belfast&lt;br /&gt;
*[http://www.biostat.wisc.edu/~craven/ Craven, Mark] - University of Wisconsin&lt;br /&gt;
*[http://www2.ulster.ac.uk/staff/n.creaney.html Creaney, Norman] - University of Ulster&lt;br /&gt;
*[http://www.dia.uniroma3.it/~crescenz/ Crescenzi, Valter] - Università Roma Tre&lt;br /&gt;
*[http://www.harlequin.com/ Crowe, Jeremy] - Harlequin Ltd.&lt;br /&gt;
*[http://www.dcs.shef.ac.uk/~hamish Cunningham, Hamish] - University of Sheffield&lt;br /&gt;
*[http://www-users.cs.york.ac.uk/~jc/ Cussens, James] - University of York&lt;br /&gt;
&lt;br /&gt;
== D ==&lt;br /&gt;
&lt;br /&gt;
*[http://conversational-technologies.com Dahl, Deborah] - Conversational Technologies&lt;br /&gt;
*[http://stl.recherche.univ-lille3.fr/sitespersonnels/dal/index.html Dal, Georgette] - Universite de Lille&lt;br /&gt;
*[http://www.ics.mq.edu.au/~rdale Dale, Robert] - Centre for Language Technology, Macquarie University&lt;br /&gt;
*[http://www.cs.utah.edu/~hal/ Daumé III, Hal] - University of Utah&lt;br /&gt;
*[http://davies-linguistics.byu.edu Davies, Mark] - Brigham Young University&lt;br /&gt;
*[http://www.csi.uottawa.ca/~delannoy  Delannoy, Jean-Francois] - University of Ottawa&lt;br /&gt;
*[http://comp.ling.utexas.edu/denis Denis, Pascal] - University of Texas at Austin&lt;br /&gt;
*[http://www.math.bas.bg/~iad/ Derzhanski, Ivan] - Bulgarian Academy of Sciences&lt;br /&gt;
*[http://www.ling.ohio-state.edu/~dm/ Detmar Meurers, Walt] - The Ohio State University Linguistics Dept.&lt;br /&gt;
*[http://www.limsi.fr/Individu/devil/ Devillers, Laurence] - LIMSI&lt;br /&gt;
*[http://www.cs.umd.edu/users/bonnie/ Dorr, Bonnie] - University of Maryland&lt;br /&gt;
*[http://www.nyu.edu/pages/linguistics/doughert.html Dougherty, Ray] - New York University&lt;br /&gt;
*[http://www.ai.sri.com/~dowding Dowding, John] - SRI&lt;br /&gt;
&lt;br /&gt;
== E ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.uni-bielefeld.de/lili/personen/cebert/ Ebert, Christian] - University of Bielefeld&lt;br /&gt;
*[http://www.ims.uni-stuttgart.de/~eckle/ Eckle-Kohler, Judith]&lt;br /&gt;
*[http://www.philipedmonds.com/ Edmonds, Philip] - University of Toronto&lt;br /&gt;
*[http://www.cs.bgu.ac.il/~elhadad/ Elhadad, Michael] - Ben-Gurion University of the Negev&lt;br /&gt;
*[http://www.cogsci.ed.ac.uk/~marke/ Ellison, T. Mark] -  University of Edinburgh&lt;br /&gt;
*[http://www.sciences.univ-nantes.fr/info/perso/permanents/enguehard/ Enguehard, Chantal] - Laboratoire d&#039;Informatique de Nantes Atlantique&lt;br /&gt;
*[http://coli.uni-sb.de/~erbach/ Erbach, Gregor] - Universität des Saarlandes&lt;br /&gt;
*[http://nl.ijs.si/et/ Erjavec, Tomaz]&lt;br /&gt;
*[http://comp.ling.utexas.edu/erk/ Erk, Katrin] - University of Texas at Austin&lt;br /&gt;
*[http://www.cogsci.uni-osnabrueck.de/~severt/ Evert, Stefan] - University of Osnabrück&lt;br /&gt;
&lt;br /&gt;
== F ==&lt;br /&gt;
&lt;br /&gt;
*[http://slt.wcl.ee.upatras.gr/Fakotakis/personal.htm Fakotakis, Nikos] - University of Patras&lt;br /&gt;
*[http://www.phon.ucl.ac.uk/home/alex/home.htm  Fang, Alex Chengyu] - University College London&lt;br /&gt;
*[http://wordnet.princeton.edu/~fellbaum/ Fellbaum, Christiane] - Princeton University&lt;br /&gt;
*[http://ling.cuc.edu.cn/htliu/feng/feng.htm Feng, Zhiwei] - IAL of China&lt;br /&gt;
*[http://www.cs.umbc.edu/~finin/ Finin, Tim] - University of Maryland&lt;br /&gt;
*[http://lingo.stanford.edu/dan/ Flickinger, Dan] - CSLI, Stanford University&lt;br /&gt;
*[http://www.icsi.berkeley.edu/~fosler Fosler, Eric] - ICSI, University of California at Berkeley&lt;br /&gt;
*[http://www.coli.uni-saarland.de/~fouvry/ Fouvry, Frederik]&lt;br /&gt;
*[http://www.cs.technion.ac.il/~francez Francez, Nissim] - Technion, Israel&lt;br /&gt;
*[http://www.cs.cmu.edu/~ref/ Frederking, Robert] - Carnegie-Mellon University&lt;br /&gt;
*[http://www.ee.ust.hk/~pascale/ Fung, Pascale] - Hong Kong University of Science and Technology&lt;br /&gt;
&lt;br /&gt;
== G ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cs.technion.ac.il/~gabr Gabrilovich, Evgeniy]&lt;br /&gt;
*[http://www.dcs.shef.ac.uk/~robertg/ Gaizauskas, Rob] - University of Sheffield&lt;br /&gt;
*[http://www.sics.se/~gamback/ Gamback, Bjorn] - Swedish Institute of Computer Science&lt;br /&gt;
*[http://www.gelbukh.com/ Gelbukh, Alexander] - CIC-IPN&lt;br /&gt;
*[http://www.isi.edu/natural-language/people/germann/ Germann, Ulrich] - ISI&lt;br /&gt;
*[https://netfiles.uiuc.edu/girju/index.html Girju, Roxana] - University of Illinois, Urbana-Champaign&lt;br /&gt;
*[http://tcc.itc.it/people/giuliano.html Giuliano, Claudio] - ITC-irst&lt;br /&gt;
*[http://www.uni-salzburg.at/portal/page?_pageid=425,405845&amp;amp;_dad=portal&amp;amp;_schema=PORTAL Goebl, Hans] - Univeristät Salzburg&lt;br /&gt;
*[http://www.esi.uem.es/~jmgomez Gomez-Hidalgo, Jose-Maria] - UEM&lt;br /&gt;
*[http://www.linguistics.ucsb.edu/faculty/stgries/ Gries, Stefan Th.] - UCSB&lt;br /&gt;
*[http://cs.nyu.edu/cs/faculty/grishman/ Grishman, Ralph] - New York University&lt;br /&gt;
*[http://das-www.harvard.edu/users/faculty/Barbara_Grosz/Barbara_Grosz.html Grosz, Barbara] - Harvard University&lt;br /&gt;
*[http://www-ksl.stanford.edu/people/gruber/ Gruber, Tom] - Stanford University&lt;br /&gt;
*[http://www.cs.duke.edu/~cig Guinn, Curry I.] -  Duke U.&lt;br /&gt;
*[http://www.ukp.tu-darmstadt.de/ Gurevych, Iryna] - Darmstadt University of Technology&lt;br /&gt;
*[http://www.cs.bilkent.edu.tr/~guvenir/guvenir.html Guvenir, Altay] - Bilkent University&lt;br /&gt;
&lt;br /&gt;
== H ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.swan.ac.uk/french/web-content/staff/p-ten-hacken.html Hacken, Pius ten] - Swansea University&lt;br /&gt;
*[http://www.coling.uni-freiburg.de/~hahn/hahn.html Hahn, Udo] - University of Freiburg&lt;br /&gt;
*[http://www.comp.nus.edu.sg/~cuihang Hang, Cui] - National University of Singapore&lt;br /&gt;
*[http://www.coli.uni-sb.de/~hansen  Hansen-Schirra, Silvia] - Universität des Saarlandes&lt;br /&gt;
*[http://www.cognia.com/ Harkema, Henk] - Cognia EU&lt;br /&gt;
*[http://pi7.fernuni-hagen.de/hartrumpf/ Hartrumpf, Sven] - University of Hagen, Germany&lt;br /&gt;
*[http://www.cis.udel.edu/~harvey/ Harvey, Terry]&lt;br /&gt;
*[http://www.linguistik.uni-erlangen.de/~rrh/ Hausser, Roland] - University of Erlangen, Germany&lt;br /&gt;
*[http://www.sims.berkeley.edu/~hearst Hearst, Marti] - UC Berkeley&lt;br /&gt;
*[http://www.cse.ogi.edu/~heeman Heeman, Peter] - OGI&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/jhender6/ Henderson, James] - University of Edinburgh&lt;br /&gt;
*[http://www.asp.ogi.edu/~hynek/ Hermansky, Hynek] - Oregon Graduate Institute of Science and Technology&lt;br /&gt;
*[http://www.isi.edu/~ulf/ Hermjakob, Ulf] - USC/ISI&lt;br /&gt;
*[http://www.esi.uem.es/~jmgomez/  Hidalgo, José María Gómez] - Universidad Europea de Madrid&lt;br /&gt;
*[http://www.ifi.unizh.ch/staff/hess.html Hess, Michael] - Univ. of Zurich, Switzerland&lt;br /&gt;
*[http://www.cs.toronto.edu/~gh Hirst, Graeme] - University of Toronto&lt;br /&gt;
*[http://www.isi.edu/~hobbs/ Jerry Hobbs] - USC/ISI&lt;br /&gt;
*[http://www.cs.cmu.edu/~chogan Hogan, Christopher] - Carnegie-Mellon University&lt;br /&gt;
*[http://www.isi.edu/natural-language/people/hovy.html Hovy, Eduard] - ISI&lt;br /&gt;
*[http://ist-socrates.berkeley.edu/~jcl2/churen.htm  Huang, Chu-Ren] - Academica Sinica&lt;br /&gt;
*[http://www.cs.ucf.edu/~hull Hull, Richard] - University of Central Florida&lt;br /&gt;
*[http://compbio.uchsc.edu/Hunter_lab/Hunter Hunter, Larry] - U. Colorado School of Medicine&lt;br /&gt;
*[http://datamining.typepad.com/data_mining/ Hurst, Matthew] - BuzzMetrics&lt;br /&gt;
*[http://ourworld.compuserve.com/homepages/WJHutchins/ Hutchins, John]&lt;br /&gt;
&lt;br /&gt;
== I ==&lt;br /&gt;
&lt;br /&gt;
== J ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cis.upenn.edu/~cliff-group/94/pjacobs.html Jacobs, Paul] - General Electric&lt;br /&gt;
*[http://www.stanford.edu/~tiflo  Jaeger, T. Flroian] - Stanford University&lt;br /&gt;
*[http://ist.psu.edu/faculty_pages/jjansen/ Jansen, Jim] - Penn State&lt;br /&gt;
*[http://www.ida.liu.se/~arnjo/ Jönsson, Arne] - Linkoping University&lt;br /&gt;
*[http://www.cog.brown.edu/~mj Johnson, Mark] - Brown University&lt;br /&gt;
&lt;br /&gt;
== K ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.ai.sri.com/~megumi Kameyama, Megumi] - SRI International&lt;br /&gt;
*[http://www.comp.nus.edu.sg/~kanmy  Kan, Min-Yen] - National University of Singapore&lt;br /&gt;
*[http://users.utu.fi/karhumak/ Karhumaki] - Juhani University of Turku&lt;br /&gt;
*[http://www.sics.se/~jussi/ Karlgren, Jussi] - SICS, Sweden&lt;br /&gt;
*[http://www2.parc.com/istl/members/karttune/ Karttunen, Lauri]&lt;br /&gt;
*[http://elex.amu.edu.pl/ifa/staff/kaszubski.html  Kaszubski, Przemys&amp;amp;#322;aw] - Adam Mickiewicz University&lt;br /&gt;
*[http://www.cs.utexas.edu/users/rjkate/ Kate, Rohit J.] - University of Texas at Austin&lt;br /&gt;
*[http://www-users.cs.york.ac.uk/~kazakov/ Kazakov, Dimitar] - University of York&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/keller/ Keller, Frank] - University of Edinburgh&lt;br /&gt;
*[http://www.mabidkhan.com/ Khan, Abid] - University of Peshawar, Pakistan&lt;br /&gt;
*[http://www.itri.bton.ac.uk/~Adam.Kilgarriff Kilgarriff, Adam] - University of Brighton&lt;br /&gt;
*[http://www.cs.wisc.edu/~sklein/sklein.html Klein, Sheldon] - University of Wisconsin&lt;br /&gt;
*[http://www.isi.edu/~knight/ Knight, Kevin] - ISI&lt;br /&gt;
*[http://www.iccs.inf.ed.ac.uk/~pkoehn/ Koehn, Philipp] - University of Edinburgh&lt;br /&gt;
*[http://svenska.gu.se/~svedk Kokkinakis, Dimitrios] - Göteborg University&lt;br /&gt;
*[http://www.coli.uni-saarland.de/~kordoni/ Kordoni, Valia] - Universität des Saarlandes&lt;br /&gt;
*[http://www.kornai.com/ Kornai, Andras]&lt;br /&gt;
*[http://www.ling.helsinki.fi/~koskenni/ Koskenniemi, Kimmo] - University of Helsinki&lt;br /&gt;
*[http://users.encs.concordia.ca/~kosseim/ Kosseim, Leila] - Concordia University, Montreal&lt;br /&gt;
*[http://www.dlsi.ua.es/~zkozareva/ Kozareva, Zornitsa] - University of Alicante&lt;br /&gt;
*[http://dis.tpd.tno.nl/mmts/wessel_kraaij.html Kraaij, Wessel] - TNO&lt;br /&gt;
*[http://www-sk.let.uu.nl Krauwer, Steven, ELSNET] - Utrecht University&lt;br /&gt;
*[http://www.peter-kuehnlein.net/ Kuehnlein, Peter] - Bielefeld University&lt;br /&gt;
*[http://jones.ling.indiana.edu/~skuebler/ Kuebler, Sandra] - Indiana University, Bloomington&lt;br /&gt;
*[http://www.cs.ucd.ie/staff/nick/ Kushmerick, Nicholas] - University College, Dublin&lt;br /&gt;
&lt;br /&gt;
== L ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.ling.gu.se/~lager/ Lager, Torbjörn] - Göteborg University&lt;br /&gt;
*[http://www.ict.csiro.au/staff/Andrew.Lampert/ Lampert, Andrew] - CSIRO ICT Centre / Macquarie University&lt;br /&gt;
*[http://tcc.itc.it/people/lavelli/ Lavelli, Alberto] - ITC-IRST&lt;br /&gt;
*[http://www-personal.umich.edu/~jlawler/index.html Lawler, John] - University of Michigan&lt;br /&gt;
*[http://nlp.postech.ac.kr/~gblee Lee, Geunbae] - POSTECH&lt;br /&gt;
*[http://www.cs.bham.ac.uk/~mgl Lee, Mark] - University of Birmingham&lt;br /&gt;
*[http://www.ling.lancs.ac.uk/staff/geoff/geoff.htm Leech, Geoffrey] - Professor LAMEL, Lancaster University, UK&lt;br /&gt;
*[http://www.iccs.inf.ed.ac.uk/~s0239229/ Leidner, Jochen L.]&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/olemon Lemon, Oliver]&lt;br /&gt;
*[http://www.ilc.cnr.it/~lenci/ Lenci, Alessandro] - Università di Pisa&lt;br /&gt;
*[http://people.cs.uchicago.edu/~levow/  Levow, Gina-Anne] - University of Chicago&lt;br /&gt;
*[http://www.ling.upenn.edu/~myl/ Liberman, Mark] -University of Pennsylvania&lt;br /&gt;
*[http://www.cs.cornell.edu/home/llee Lee, Lillian] - Cornell University&lt;br /&gt;
*[http://www.cs.umanitoba.ca/~lindek/ Lin, Dekang] - University of Manitoba&lt;br /&gt;
*[http://htliu.yeah.net/ Liu, Haitao] - Communication University of China&lt;br /&gt;
*[http://www.langnat.com/~loupy/index-en.html Loupy, Claude de] - Universite de Paris X Nanterre&lt;br /&gt;
*[http://www.personal.psu.edu/xxl13 Lu, Xiaofei] - Pennsylvania State University&lt;br /&gt;
*[http://mtgroup.ict.ac.cn/~liuyang/ Liu, Yang] - Institute of Computing Technology, CAS&lt;br /&gt;
&lt;br /&gt;
== M ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.soi.city.ac.uk/~andym/ MacFarlane, Andrew] - City University of London&lt;br /&gt;
*[http://www-cs-students.Stanford.EDU/~magerman Magerman, David] - Stanford University&lt;br /&gt;
*[http://tcc.itc.it/people/magnini.html Magnini, Bernardo] - ITC-IRST&lt;br /&gt;
*[http://www.karacaymalkar.com Malkar, Karacay] - Webportal&lt;br /&gt;
*[http://www.rohan.sdsu.edu/~malouf Malouf, Rob] - San Diego State University&lt;br /&gt;
*[http://www.sultry.arts.usyd.edu.au/ Manning, Christopher] - University of Sydney&lt;br /&gt;
*[http://www.isi.edu/~marcu/ Marcu, Daniel] - USC/ISI&lt;br /&gt;
*[http://overstated.net/about Marlow, Cameron] - Yahoo! Research&lt;br /&gt;
*[http://www.limsi.fr/Individu/martin/  Martin,Jean-Claude] - LIMSI&lt;br /&gt;
*[http://www.let.rug.nl/~begona/  Moirón, Begoña Villada] - University of Groningen&lt;br /&gt;
*[http://www.ics.mq.edu.au/~mpawel Mazur, Pawel] - Wroclaw University of Technology and Macquarie University&lt;br /&gt;
*[http://www.informatics.susx.ac.uk/research/nlp/mccarthy/mccarthy.html McCarthy, Diana] - University of Sussex&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/mmcconvi McConville, Mark] - University of Edinburgh&lt;br /&gt;
*[http://www.eecis.udel.edu/~mccoy/ McKoy, Kathy] - University of Delaware&lt;br /&gt;
*[http://alum.mit.edu/www/davidmcdonald/ McDonald, David] - BBN Technologies&lt;br /&gt;
*[http://stp.lingfil.uu.se/~bea Megyesi, B. Beata] - Uppsala University&lt;br /&gt;
*[http://cs.nyu.edu/~melamed Melamed, I. Dan] - New York University&lt;br /&gt;
*[http://www.cs.unt.edu/~rada Mihalcea, Rada] - University of North Texas&lt;br /&gt;
*[http://www.cis.upenn.edu/~elenimi/ Miltsakaki, Eleni] - University of Pennsylvania&lt;br /&gt;
*[http://imaginarycartography.com/work.html Minor, Joshua T.] - Cataphora, Inc.&lt;br /&gt;
*[http://staff.science.uva.nl/~gilad/ Mishne, Gilad] - University of Amsterdam&lt;br /&gt;
*[http://www.wlv.ac.uk/~le1825/main.html Mitkov, Ruslan] - University of Wolverhampton&lt;br /&gt;
*[http://www.ifi.unizh.ch/~molla/ Molla-Aliod, Diego] - University of Zurich&lt;br /&gt;
*[http://www.dcs.qmul.ac.uk/~christof/ Monz, Christof] - University of Amsterdam (ILLC)&lt;br /&gt;
*[http://www.cs.utexas.edu/users/mooney/ Mooney, Raymond J.] - University of Texas at Austin&lt;br /&gt;
*[http://www.signiform.com/erik/ Mueller, Erik] - IBM Research&lt;br /&gt;
*[http://www.xn--stefan-mller-klb.net/ Müler, Stefan] - Universität Bremen&lt;br /&gt;
*[http://www.dlsi.ua.es/eines/membre.cgi?id=eng&amp;amp;nom=rafael&amp;amp;tipus=pdi Muñoz, Rafael] - University of Alicante&lt;br /&gt;
&lt;br /&gt;
== N ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cs.utexas.edu/users/ai-lab/people/grad/nahm.html  Nahm, Un Yong] - University of Texas, Austin&lt;br /&gt;
*[http://www.univ-nancy2.fr/pers/namer/ Namer, Fiammetta] - University of Nancy&lt;br /&gt;
*[http://www.lr.pi.titech.ac.jp/~nanno/index.cgi?page=Tomoyuki+NANNO Nanno, Tomoyuki] - Tokyo Institute of Technology&lt;br /&gt;
*[http://www.dlsi.ua.es/~borja/  Navarro, Borja] - University of Alicante, Spain&lt;br /&gt;
*[http://tcc.itc.it/people/negri.html Negri, Matteo] - ITC-irst&lt;br /&gt;
*[http://www.let.rug.nl/~nerbonne Nerbonne, John] - RU Groningen&lt;br /&gt;
*[http://cl-www.dfki.uni-sb.de/~neumann Neumann, Guenter] - DFKI, Saarbrücken&lt;br /&gt;
*[http://www.comp.nus.edu.sg/~nght Ng, Hwee Tou] - National University of Singapore&lt;br /&gt;
*[http://www.slt.atr.co.jp/~night/ Nightingale, Stephen] - ATR Institute International&lt;br /&gt;
*[http://homepages.inf.ed.ac.uk/mnissim/ Nissim, Malvina] - University of Bologna&lt;br /&gt;
*[http://www.comp.nus.edu.sg/~niuzheng  Niu, Zheng-Yu] - NU Singapore&lt;br /&gt;
*[http://w3.msi.vxu.se/~nivre/ Nivre, Joakim] - Växjö University&lt;br /&gt;
*[http://www.cs.berkeley.edu/~russell/norvig.html Norvig, Peter]&lt;br /&gt;
&lt;br /&gt;
== O ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.ltg.ed.ac.uk/~jon/ Oberlander, Jon] - U. Edinburgh&lt;br /&gt;
*[http://people.sabanciuniv.edu/oflazer/ Oflazer, Kemal] - Sabanci University, Istanbul, Turkey&lt;br /&gt;
*[http://www.loa-cnr.it/oltramari.html Oltramari, Alessandro] - Laboratory for Applied Ontology, Italian National Research Council&lt;br /&gt;
*[http://www.wlv.ac.uk/~in6093/ Orasan, Constantin] - University of Wolverhampton&lt;br /&gt;
*[http://www.bultreebank.org/petya/OsenovaPub.html Osenova, Petya] - Bulgarian Academy of Sciences&lt;br /&gt;
&lt;br /&gt;
== P ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[http://cst.dk/patrizia/ Paggio, Patrizia] - University of Copenhagen&lt;br /&gt;
*[http://www.slt.atr.co.jp/~kpaik/ Paik, Kyonghee] - ATR Spoken Language Translation Research Laboratories&lt;br /&gt;
*[http://www.cs.cornell.edu/People/pabo Pang, Bo] - Cornell University&lt;br /&gt;
*[http://verbs.colorado.edu/~mpalmer/ Palmer, Martha] - University of Colorado&lt;br /&gt;
*[http://www.isi.edu/~pantel/ Pantel, Patrick] - ISI/University of Southern California&lt;br /&gt;
*[http://www.l2f.inesc-id.pt/~joana/english.html Paulo Pardal] - Joana L&amp;amp;sup2;F] - INESC-ID&lt;br /&gt;
*[http://www.d.umn.edu/~tpederse Pedersen, Ted] - University of Minnesota, Duluth&lt;br /&gt;
*[http://ai-nlp.info.uniroma2.it/pennacchiotti Pennacchiotti, Marco] - University of Roma Tor Vergata&lt;br /&gt;
*[http://www.perry.com/ Perry, John] - UCLA&lt;br /&gt;
*[http://tcc.itc.it/people/pianesi.html Pianesi, Fabio] - ITC-irst &lt;br /&gt;
*[http://www.resegone.com/mapb/ Piccolino Boniforti, Marco Aldo] - Rovira i Virgili University&lt;br /&gt;
*[http://cswww.essex.ac.uk/staff/poesio Poesio, Massimo] - University of Essex&lt;br /&gt;
*[http://www.fas.umontreal.ca/ling/olst/polguereE Polguere, Alain] - Université de Montréal&lt;br /&gt;
*[http://fas.sfu.ca/0h/cs/people/Faculty/Popowich/popowich Popowich, Fred] - Simon Fraser University&lt;br /&gt;
*[http://nlp.ipipan.waw.pl/~adamp/ Przepiórkowski, Adam] - Polish Academy of Sciences, Warsaw&lt;br /&gt;
*[http://www.ling-phil.ox.ac.uk/people/staff/pulman/ Pulman, Stephen] - Oxford University&lt;br /&gt;
*[http://www.cs.brandeis.edu/~jamesp Pustejovsky, James] - Brandeis University&lt;br /&gt;
&lt;br /&gt;
== Q ==&lt;br /&gt;
&lt;br /&gt;
== R ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.eecs.umich.edu/~radev/ Radev, Dragomir] - University of Michigan&lt;br /&gt;
*[http://www.fask.uni-mainz.de/user/rapp Rapp, Reinhard] - Johannes Gutenberg-Universitaet Mainz&lt;br /&gt;
*[http://www.cs.buffalo.edu/pub/WWW/faculty/rapaport/rapaport.html Rapaport, William J.] - SUNY Buffalo&lt;br /&gt;
*[http://www.cis.upenn.edu/~cliff-group/94/lrau.html Rau, Lisa]&lt;br /&gt;
*[http://www.comp.lancs.ac.uk/computing/users/paul/ Rayson, Paul] - Lancaster University&lt;br /&gt;
*[http://www.csd.abdn.ac.uk/~ereiter Reiter, Ehud] - University of Aberdeen&lt;br /&gt;
*[http://www.dfki.uni-sb.de/~bert Reithinger, Norbert] - Universität des Saarlandes&lt;br /&gt;
*[http://www.reitter-it-media.de/ Reitter, David] - University of Edinburgh&lt;br /&gt;
*[http://www.ai.mit.edu/~jrennie/ Rennie, Jason] - MIT&lt;br /&gt;
*[http://umiacs.umd.edu/~resnik Resnik, Philip] - University of Maryland, College Park&lt;br /&gt;
*[http://www.cs.utah.edu/~riloff/ Riloff, Ellen] - University of Utah&lt;br /&gt;
*[http://www.cs.rochester.edu/u/ringger/ Ringger, Eric,] - University of Rochester&lt;br /&gt;
*[http://www.di.ufpe.br/~jr Robin, Jacques, Federal] - University of Pernambuco, Brazil.&lt;br /&gt;
*[http://www.univ-ab.pt/~vjr/ Rocio, Vitor] - Open University, Lisbon&lt;br /&gt;
*[http://jones.ling.indiana.edu/~prrodrig/ Rodrigues, Paul] - Indiana University, Bloomington&lt;br /&gt;
*[http://www.cs.uiuc.edu/directory/directory.php?name=roth Roth, Dan 0 University of Illinois, Urbana-Champaign]&lt;br /&gt;
*[http://www.public.asu.edu/~droussi/ Roussinov, Dmitri] - Arizona State University&lt;br /&gt;
*[http://www.hi.is/~eirikur/ Rögnvaldsson, Eiríkur] - University of Iceland&lt;br /&gt;
*[http://www.uteroemer.de/ Römer, Ute] - University of Hanover&lt;br /&gt;
&lt;br /&gt;
== S ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cis.upenn.edu/~anoop/ Sarkar, Anoop] - University of Pennsylvania&lt;br /&gt;
*[http://personalpages.manchester.ac.uk/staff/yutaka.sasaki/ Sasaki, Yutaka] - University of Manchester&lt;br /&gt;
*[http://www.cog.jhu.edu/~savova/ Savova, Virginia] - MIT&lt;br /&gt;
*[http://www.dfki.de/~uschaefer Schaefer, Ulrich] - German Research Center for Artificial Intelligence&lt;br /&gt;
*[http://www7.informatik.tu-muenchen.de/~scheler Scheler] - Gabriele, TU München&lt;br /&gt;
*[http://www.ims.uni-stuttgart.de/~mike/ Schiehlen, Michael] - University of Stuttgart&lt;br /&gt;
*[http://www.ims.uni-stuttgart.de/~schmid/ Schmid, Helmut] - University of Stuttgart&lt;br /&gt;
*[http://www.kde.cs.uni-kassel.de/schmitz Schmitz, Christoph] - Universität Kassel&lt;br /&gt;
*[http://www.schulteimwalde.de/ Schulte, Sabine, im Walde]&lt;br /&gt;
*[http://www.ics.mq.edu.au/~rolfs Schwitter, Rolf] - Macquarie University&lt;br /&gt;
*[http://mcs.open.ac.uk/ds5473/ Scott, Donia] - The Open University&lt;br /&gt;
*[http://nlp.cs.nyu.edu/sekine Sekine, Satoshi] - New York University&lt;br /&gt;
*[http://www.eecs.harvard.edu/~shieber/ Shieber, Stuart] - Harvard University&lt;br /&gt;
*[http://www.cs.rochester.edu/u/sikorski/ Sikorski, Teresa] - University of Rochester&lt;br /&gt;
*[http://www.lingsoft.fi/~silvonen/ Silvonen, Mikko] - Lingsoft, Inc.&lt;br /&gt;
*[http://www.bultreebank.org/kivs/ Simov, Kiril] - Bulgarian Academy of Sciences&lt;br /&gt;
*[http://www.utexas.edu/cola/centers/lrc/general/facultyhomes/jonathan.html Slocum, Jonathan] - The University of Texas at Austin&lt;br /&gt;
*[http://www.cog.jhu.edu/faculty/smolensky.html Smolensky, Paul] - Johns Hopkins University&lt;br /&gt;
*[http://www.ece.uiuc.edu/faculty/faculty.asp?rws Sproat, Richard] - University of Illinois, Urbana-Champaign&lt;br /&gt;
*[http://www.coling.uni-freiburg.de/~staab/staab.html Staab, Steffen] - Freiburg University&lt;br /&gt;
*[http://www.humnet.ucla.edu/humnet/linguistics/people/stabler/stabler.htm Stabler, Edward] - UCLA&lt;br /&gt;
*[http://slt.wcl.ee.upatras.gr/stamatatos/personal.html Stamatatos, Efstathios] - University of Patras&lt;br /&gt;
*[http://www.cs.toronto.edu/~suzanne/ Suzanne Stevenson] - University of Toronto&lt;br /&gt;
*[http://isl.ira.uka.de/~stiefel Stiefelhagen, Rainer] - Universität Karlsruhe&lt;br /&gt;
*[http://www.coling.uni-freiburg.de/~strube/strube.html Strube, Michael] - University of Freiburg&lt;br /&gt;
*[http://www.csi.uottawa.ca/~szpak/ Szpakowicz, Stan] - University of Ottawa&lt;br /&gt;
&lt;br /&gt;
== T ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.sfu.ca/~mtaboada Taboada, Maite] - Simon Fraser University&lt;br /&gt;
*[http://hnk.ffzg.hr/mt/ Tadic, Marko] - Faculty of Philosophy, University of Zagreb&lt;br /&gt;
*[http://www.ling.helsinki.fi/~tapanain Tapanainen, Pasi] - University of Helsinki&lt;br /&gt;
*[http://www8.informatik.uni-erlangen.de/inf8/en/thabet.html Thabet, Iman] - University of Erlangen-Nuremberg&lt;br /&gt;
*[http://www.siit.tu.ac.th/dirctory/ft_fac/thanaruk.html Theeramunkong, Thanaruk] - Sirindhorn International Institute of Technology, Thammasat University&lt;br /&gt;
*[http://www.objs.com/thompson.htm Thompson, Craig] - Object Services and Consulting, Inc.&lt;br /&gt;
*[http://www.let.rug.nl/~tiedeman/blog/index.php?category=1  Tiedemann, Jörg] - University of Groningen&lt;br /&gt;
*[http://tecfa.unige.ch/tecfa-people/traum.html Traum, David] - TECFA, Universite de Geneve&lt;br /&gt;
*[http://www.hum.uit.no/a/trond/ Trosterud, Trond] - University of Tromsø&lt;br /&gt;
*[http://www.racai.ro/~tufis/ Tufis, Dan] - Research Institute for Artificial Intelligence, Romanian Academy&lt;br /&gt;
*[http://www.apperceptual.com/ Turney, Peter] - National Research Council of Canada&lt;br /&gt;
&lt;br /&gt;
== U ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.coli.uni-sb.de/~hansu Uszkoreit, Hans] - University of the Saarland and DFKI Saarbrücken&lt;br /&gt;
&lt;br /&gt;
== V ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.q-go.com/  van de Burgt, Stan P.] - Q-go.com&lt;br /&gt;
*[http://ilk.uvt.nl/~antalb/ van den Bosch, Antal] - Tilburg University&lt;br /&gt;
*[http://www.media.mit.edu/~nwv/  Van Dyke, Neil] - MIT Media Lab&lt;br /&gt;
*[http://www.ua.es/personal/chelo.vargas Vargas, Chelo Sierra] - Universidad de Alicante&lt;br /&gt;
*[http://www.cs.brandeis.edu/~marc/home.html Verhagen, Marc] - Brandeis University&lt;br /&gt;
*[http://www.up.univ-mrs.fr/veronis/ Véronis, Jean] - Université de Provence&lt;br /&gt;
*[http://www.dlsi.ua.es/~vicedo/vicedo_en.html  Vicedo, Jose Luis] - Alicante University&lt;br /&gt;
*[http://www.inf.unisinos.br/~renata/ Vieira, Renata] - Universidade do Vale do Rio dos Sinos, Brazil&lt;br /&gt;
*[http://www.cl.cam.ac.uk/~av208/ Villavicencio, Aline] - Federal University of Rio Grande do Sul, Brazil&lt;br /&gt;
*[http://www.ling.helsinki.fi/~avoutila/ Voutilainen, Atro] - University of Helsinki&lt;br /&gt;
&lt;br /&gt;
== W ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.dfki.de/~wahlster/ Wahlster, Wolfgang] - Universität des Saarlandes&lt;br /&gt;
*[http://www.uindy.gr/faculty/cv/wallace_manolis/ Wallace, Manolis] - National Technical University of Athens&lt;br /&gt;
*[http://www.nigelward.com/ Ward, Nigel]&lt;br /&gt;
*[http://www.nick-webb.net Webb, Nick] - SUNY Albany&lt;br /&gt;
*[http://www.pages.drexel.edu/~rw37/ Weber, Rosina] - Drexel University&lt;br /&gt;
*[http://www.ucsc.cmb.ac.lk/people/arw Weerasinghe, Ruvan] - University of Colombo School of Computing&lt;br /&gt;
*[http://www.cs.tu-berlin.de/~ww/ Weisweber, Wilhelm] - Technical University of Berlin&lt;br /&gt;
*[http://www.ukp.tu-darmstadt.de Weimer, Markus] - University of Technology Darmstadt&lt;br /&gt;
*[http://www.cis.upenn.edu/~bonnie Webber, Bonnie Lynn] - University of Pennsylvania&lt;br /&gt;
*[http://www.dcs.shef.ac.uk/~yorick Wilks, Yorick] - University of Sheffield&lt;br /&gt;
*[http://cs.haifa.ac.il/~shuly Wintner, Shuly] - University of Haifa, Israel&lt;br /&gt;
*[http://www.se.cuhk.edu.hk/~kfwong/  Wong, Kam-Fai] - Chinese University of Hong Kong&lt;br /&gt;
*[http://www.cs.utexas.edu/users/ywwong/ Wong, Yuk Wah] - University of Texas at Austin&lt;br /&gt;
*[http://www.cs.man.ac.uk/~wroec/ Wroe, Chris] - University of Manchester&lt;br /&gt;
*[http://www.cs.ust.hk/faculty/dekai/bio.html Wu, Dekai] - HKUST&lt;br /&gt;
&lt;br /&gt;
== X ==&lt;br /&gt;
&lt;br /&gt;
== Y ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.cs.helsinki.fi/u/yangarbe/ Yangarber, Roman] - University of Helsinki&lt;br /&gt;
*[http://www.cis.upenn.edu/~cliff-group/94/yarowsky.html Yarowsky, David] - University of Pennsylvania&lt;br /&gt;
*[http://www.ai.mit.edu/people/deniz Yuret, Deniz] - MIT Artificial Intelligence Laboratory&lt;br /&gt;
&lt;br /&gt;
== Z ==&lt;br /&gt;
&lt;br /&gt;
*[http://ai-nlp.info.uniroma2.it/zanzotto Zanzotto, Fabio Massimo] - University of Roma Tor Vergata&lt;br /&gt;
*[http://www.ukp.tu-darmstadt.de/ Zesch, Torsten] - Darmstadt University of Technology&lt;br /&gt;
*[http://www.csse.monash.edu.au/~ingrid/ Zukerman, Ingrid] - Monash University&lt;/div&gt;</summary>
		<author><name>David Chiang</name></author>
	</entry>
</feed>