penman

Penman graph library.

For basic usage, common functionality is available from the top-level penman module. For more advanced usage, please use the full API available via the submodules.

Users wanting to interact with graphs might find the decode() and encode() functions a good place to start:

>>> import penman
>>> g = penman.decode('(w / want-01 :ARG0 (b / boy) :ARG1 (g / go :ARG0 b))')
>>> g.top
'w'
>>> len(g.triples)
6
>>> [concept for _, _, concept in g.instances()]
['want-01', 'boy', 'go']
>>> print(penman.encode(g, top='b'))
(b / boy
   :ARG0-of (w / want-01
               :ARG1 (g / go
                        :ARG0 b)))

The decode() and encode() functions work with one PENMAN graph. The load() and dump() functions work with collections of graphs.

Users who want to work with trees would use parse() and format() instead:

>>> import penman
>>> t =  penman.parse('(w / want-01 :ARG0 (b / boy) :ARG1 (g / go :ARG0 b))')
>>> var, branches = t.node
>>> var
'w'
>>> len(branches)
3
>>> role, target = branches[2]
>>> role
':ARG1'
>>> print(penman.format(target))
(g / go
   :ARG0 b)

Module Constants

penman.__version__

The software version string.

penman.__version_info__

The software version as a tuple.

Classes

class penman.Tree[source]

Alias of penman.tree.Tree.

class penman.Triple[source]

Alias of penman.graph.Triple.

class penman.Graph[source]

Alias of penman.graph.Graph.

class penman.PENMANCodec[source]

Alias of penman.codec.PENMANCodec.

Module Functions

Trees

penman.parse(s)[source]

Parse PENMAN-notation string s into its tree structure.

Parameters

s – a string containing a single PENMAN-serialized graph

Returns

The tree structure described by s.

Example

>>> import penman
>>> penman.parse('(b / bark-01 :ARG0 (d / dog))')  # noqa
Tree(('b', [('/', 'bark-01'), (':ARG0', ('d', [('/', 'dog')]))]))
penman.iterparse(lines)[source]

Yield trees parsed from lines.

Parameters

lines – a string or open file with PENMAN-serialized graphs

Returns

The Tree object described in lines.

Example

>>> import penman
>>> for t in penman.iterparse('(a / alpha) (b / beta)'):
...     print(repr(t))
...
Tree(('a', [('/', 'alpha')]))
Tree(('b', [('/', 'beta')]))
penman.format(tree, indent=- 1, compact=False)[source]

Format tree into a PENMAN string.

Parameters
  • tree – a Tree object

  • indent – how to indent formatted strings

  • compact – if True, put initial attributes on the first line

Returns

the PENMAN-serialized string of the Tree t

Example

>>> import penman
>>> print(penman.format(
...     ('b', [('/', 'bark-01'),
...            (':ARG0', ('d', [('/', 'dog')]))])))
(b / bark-01
   :ARG0 (d / dog))
penman.interpret(t, model=None)[source]

Interpret a graph from the Tree t.

Alias of penman.layout.interpret()

Graphs

penman.decode(s, model=None)

Deserialize PENMAN-serialized s into its Graph object

Parameters
  • s – a string containing a single PENMAN-serialized graph

  • model – the model used for interpreting the graph

Returns

the Graph object described by s

Example

>>> import penman
>>> penman.decode('(b / bark-01 :ARG0 (d / dog))')
<Graph object (top=b) at ...>
penman.iterdecode(lines, model=None)

Yield graphs parsed from lines.

Parameters
  • lines – a string or open file with PENMAN-serialized graphs

  • model – the model used for interpreting the graph

Returns

The Graph objects described in lines.

Example

>>> import penman
>>> for g in penman.iterdecode('(a / alpha) (b / beta)'):
...     print(repr(g))
<Graph object (top=a) at ...>
<Graph object (top=b) at ...>
penman.encode(g, top=None, model=None, indent=- 1, compact=False)

Serialize the graph g from top to PENMAN notation.

Parameters
  • g – the Graph object

  • top – if given, the node to use as the top in serialization

  • model – the model used for interpreting the graph

  • indent – how to indent formatted strings

  • compact – if True, put initial attributes on the first line

Returns

the PENMAN-serialized string of the Graph g

Example

>>> import penman
>>> from penman.graph import Graph
>>> penman.encode(Graph([('h', 'instance', 'hi')]))
'(h / hi)'
penman.configure(g, top=None, model=None)[source]

Configure a tree from the Graph g.

Alias of penman.layout.configure()

Corpus Files

penman.loads(string, model=None)

Deserialize a list of PENMAN-encoded graphs from string.

Parameters
  • string – a string containing graph data

  • model – the model used for interpreting the graph

Returns

a list of Graph objects

penman.load(source, model=None)

Deserialize a list of PENMAN-encoded graphs from source.

Parameters
  • source – a filename or file-like object to read from

  • model – the model used for interpreting the graph

Returns

a list of Graph objects

penman.dumps(graphs, model=None, indent=- 1, compact=False)

Serialize each graph in graphs to the PENMAN format.

Parameters
  • graphs – an iterable of Graph objects

  • model – the model used for interpreting the graph

  • indent – how to indent formatted strings

  • compact – if True, put initial attributes on the first line

Returns

the string of serialized graphs

penman.dump(graphs, file, model=None, indent=- 1, compact=False)

Serialize each graph in graphs to PENMAN and write to file.

Parameters
  • graphs – an iterable of Graph objects

  • file – a filename or file-like object to write to

  • model – the model used for interpreting the graph

  • indent – how to indent formatted strings

  • compact – if True, put initial attributes on the first line

Triple Conjunctions

penman.parse_triples(s)[source]

Parse a triple conjunction from s.

Example

>>> import penman
>>> for triple in penman.parse_triples('''
...         instance(b, bark) ^
...         ARG0(b, d) ^
...         instance(d, dog)'''):
...     print(triple)
('b', ':instance', 'bark')
('b', ':ARG0', 'd')
('d', ':instance', 'dog')
penman.format_triples(triples, indent=True)[source]

Return the formatted triple conjunction of triples.

Parameters
  • triples – an iterable of triples

  • indent – how to indent formatted strings

Returns

the serialized triple conjunction of triples

Example

>>> import penman
>>> g = penman.decode('(b / bark-01 :ARG0 (d / dog))')
>>> print(penman.format_triples(g.triples))
instance(b, bark-01) ^
ARG0(b, d) ^
instance(d, dog)

Exceptions

exception penman.PenmanError[source]

Alias of penman.exceptions.PenmanError.

exception penman.DecodeError[source]

Alias of penman.exceptions.DecodeError.

Submodules