Source code for sng_parser.parser

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : parser.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 08/21/2018
#
# This file is part of SceneGraphParser.
# Distributed under terms of the MIT license.
# https://github.com/vacancy/SceneGraphParser

__all__ = ['Parser', 'get_default_parser', 'parse']


def _load_backends():
    from . import backends


[docs]class Parser(object): """ The scene graph parser. To instantiate a scene graph parser, you need to specify a backend (default: spacy) and the initialization keyword arguments for the backend (optional). Once the backend has been specified, you can call parser.parse(sentence) to parse a sentence in natural language into a scene graph. Note that, the function `parse` also supports extra keyword arguments which will be passed to the backend for the parsing. To use this feature, you may refer to the implementation of your parser backend. Example:: >>> parser = Parser(backend, **init_kwargs) >>> graph = parser.parse('A woman is playing the piano,') """ def __init__(self, backend=None, **kwargs): _load_backends() self.backend = backend if self.backend is None: self.backend = type(self)._default_backend if self.backend not in type(self)._backend_registry: raise ValueError('Unknown backend: {}.'.format(self.backend)) self._init_kwargs = kwargs self._inst = type(self)._backend_registry[self.backend](**kwargs) @property def init_kwargs(self): """ Get the keyward arguments used for initializing the backend. """ return self._init_kwargs @property def unwrapped(self): """ Get the backend. """ return self._inst
[docs] def parse(self, sentence, **kwargs): """ Parse a sentence into a scene graph. Args: sentence (str): the input sentence. Returns: graph (dict): the parsed scene graph. Please refer to the README file for the specification of the return value. """ return self.unwrapped.parse(sentence, **kwargs)
_default_backend = 'spacy' _backend_registry = dict()
[docs] @classmethod def register_backend(cls, backend): """ Register a class as the backend. The backend should implement a method named `parse` having the following signature: `parse(sentence, <other_keyward_arguments>)`. To register your customized backend as the parser, use this class method as a decorator on your class. Example:: >>> @Parser.register_backend >>> class CustomizedBackend(Backend): >>> # Your implementation follows... >>> pass """ try: cls._backend_registry[backend.__identifier__] = backend except Exception as e: raise ImportError('Unable to register backend: {}.'.format(backend.__name__)) from e
_default_parser = None
[docs]def get_default_parser(): """ Get the default parser. The default parser is a global one (singleton). """ global _default_parser if _default_parser is None: _default_parser = Parser() return _default_parser
[docs]def parse(sentence, **kwargs): """ Parse the sentence using the default parser. This ia an easy-to-use feature for those who do not want to configure their own parsers and want to use the parser at different places in their codes. Please note that the default parser is a singleton. Thus, if you are using a stateful parser, you need to be careful about sharing this parser everywhere. """ return get_default_parser().parse(sentence, **kwargs)