o
    ॵi                     @   s   d dl mZmZmZ d dlZd dlmZmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ ejejejd
G dd deZdS )    )AnyDictUnionN)	PipelinesPreprocessors)Model)!MachineReadingComprehensionOutput
OutputKeys)Pipeline)	PIPELINES)Preprocessor)FieldsTasks)module_namec                	       s   e Zd ZdZ				ddeeef dededef fd	d
Zdee	ee
f ef fddZdee	ee
f ef de	ee
f fddZ  ZS ))MachineReadingComprehensionForNERPipelinea  
    Pipeline for Pretrained Machine Reader (PMR) finetuned on Named Entity Recognition (NER)

    Examples:

    >>> from modelscope.pipelines import pipeline
    >>> pipeline_ins = pipeline(
    >>>        task=Tasks.machine_reading_comprehension,
    >>>        model='damo/nlp_roberta_machine-reading-comprehension_for-ner')
    >>> pipeline_ins('Soccer - Japan get lucky win , China in surprise defeat .')
    >>> {'ORG': [], 'PER': [], 'LOC': [' Japan', ' China'], 'MISC': []}
    NgpuTmodelpreprocessorconfig_filedevicec                    st   t  j|||||d t| jtsJ dtj |d u r)tj| jj	fi || _
dd | j
jD | _| j  d S )N)r   r   r   r   auto_collatez,please check whether model config exists in c                 S   s   g | ]}|qS  r   .0labelr   r   s/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/nlp/machine_reading_comprehension_pipeline.py
<listcomp>3   s    zFMachineReadingComprehensionForNERPipeline.__init__.<locals>.<listcomp>)super__init__
isinstancer   r   	ModelFileCONFIGURATIONr   from_pretrained	model_dirr   label2querylabelseval)selfr   r   r   r   r   kwargs	__class__r   r   r      s$   
z2MachineReadingComprehensionForNERPipeline.__init__returnc                 K   sP   t   | jdi |}W d    n1 sw   Y  |d }t||d dS )Nspan_logits	input_ids)r,   r-   r   )torchno_gradr   r   )r'   inputsforward_paramsoutputsr,   r   r   r   forward7   s   
z1MachineReadingComprehensionForNERPipeline.forwardr0   c                 C   s   |d dk}t | }dd | jD }|D ]-}| j|d  }|d }|d d }|d |d ||f }	| jj|	}
|| |
 q|S )Nr,   r   c                 S   s   i | ]}|g qS r   r   r   r   r   r   
<dictcomp>J   s    zIMachineReadingComprehensionForNERPipeline.postprocess.<locals>.<dictcomp>      r-   )r.   nonzerolongr%   r   	tokenizerdecodeappend)r'   r0   
span_predsextracted_indicesresultindexr   startendidsentityr   r   r   postprocessC   s   z5MachineReadingComprehensionForNERPipeline.postprocess)NNr   T)__name__
__module____qualname____doc__r   r   strr   r   r   r   r   r3   rD   __classcell__r   r   r)   r   r      s.    


r   )typingr   r   r   r.   modelscope.metainfor   r   modelscope.models.baser   modelscope.outputsr   r	   modelscope.pipelines.baser
   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.constantr   r   register_modulemachine_reading_comprehension%machine_reading_comprehension_for_nerr   r   r   r   r   <module>   s    