Source code for pororo.tasks.machine_reading_comprehension

"""Reading Comprehension related modeling class"""

from typing import Optional, Tuple

from pororo.tasks.utils.base import PororoBiencoderBase, PororoFactoryBase


[docs]class PororoMrcFactory(PororoFactoryBase): """ Conduct machine reading comprehesion with query and its corresponding context Korean (`brainbert.base.ko.korquad`) - dataset: KorQuAD 1.0 (Lim et al. 2019) - metric: EM (84.33), F1 (93.31) Args: query: (str) query string used as query context: (str) context string used as context Returns: Tuple[str, Tuple[int, int]]: predicted answer span and its indices Examples: >>> mrc = Pororo(task="mrc", lang="ko") >>> mrc( >>> "카카오브레인이 공개한 것은?", >>> "카카오 인공지능(AI) 연구개발 자회사 카카오브레인이 AI 솔루션을 첫 상품화했다. 카카오는 카카오브레인 '포즈(pose·자세분석) API'를 유료 공개한다고 24일 밝혔다. 카카오브레인이 AI 기술을 유료 API를 공개하는 것은 처음이다. 공개하자마자 외부 문의가 쇄도한다. 포즈는 AI 비전(VISION, 영상·화면분석) 분야 중 하나다. 카카오브레인 포즈 API는 이미지나 영상을 분석해 사람 자세를 추출하는 기능을 제공한다." >>> ) ('포즈(pose·자세분석) API', (33, 44)) >>> # when mecab doesn't work well for postprocess, you can set `postprocess` option as `False` >>> mrc("카카오브레인이 공개한 라이브러리 이름은?", "카카오브레인은 자연어 처리와 음성 관련 태스크를 쉽게 수행할 수 있도록 도와 주는 라이브러리 pororo를 공개하였습니다.", postprocess=False) ('pororo', (30, 34)) """ def __init__(self, task: str, lang: str, model: Optional[str]): super().__init__(task, lang, model)
[docs] @staticmethod def get_available_langs(): return ["ko"]
[docs] @staticmethod def get_available_models(): return {"ko": ["brainbert.base.ko.korquad"]}
[docs] def load(self, device: str): """ Load user-selected task-specific model Args: device (str): device information Returns: object: User-selected task-specific model """ if "brainbert" in self.config.n_model: try: import mecab except ModuleNotFoundError as error: raise error.__class__( "Please install python-mecab-ko with: `pip install python-mecab-ko`" ) from pororo.models.brainbert import BrainRobertaModel from pororo.utils import postprocess_span model = (BrainRobertaModel.load_model( f"bert/{self.config.n_model}", self.config.lang, ).eval().to(device)) tagger = mecab.MeCab() return PororoBertMrc(model, tagger, postprocess_span, self.config)
[docs]class PororoBertMrc(PororoBiencoderBase): def __init__(self, model, tagger, callback, config): super().__init__(config) self._model = model self._tagger = tagger self._callback = callback
[docs] def predict( self, query: str, context: str, **kwargs, ) -> Tuple[str, Tuple[int, int]]: """ Conduct machine reading comprehesion with query and its corresponding context Args: query: (str) query string used as query context: (str) context string used as context postprocess: (bool) whether to apply mecab based postprocess Returns: Tuple[str, Tuple[int, int]]: predicted answer span and its indices """ postprocess = kwargs.get("postprocess", True) pair_result = self._model.predict_span(query, context) span = self._callback( self._tagger, pair_result[0], ) if postprocess else pair_result[0] return ( span, pair_result[1], )