3
GY^~'                 @   s   d dl Z d dlZd dlZd dlmZmZ dZG dd deZeddZ	G dd	 d	e
Zd
d Zdd Zd#ddZdd Zdd Zdd Zd$ddZd%ddZdd Zdd Zdd Zd d! Zed"kre jee j dS )&    N)defaultdict
namedtuplez<SPACE>c               @   s   e Zd ZdS )FormatErrorN)__name__
__module____qualname__ r   r   3D:\pycharm\NER-BERT-BiLSTM-CRF--master\conlleval.pyr      s   r   Metricsztp fp fn prec rec fscorec               @   s   e Zd Zdd ZdS )
EvalCountsc             C   s@   d| _ d| _d| _d| _d| _tt| _tt| _tt| _	d S )Nr   )
correct_chunkcorrect_tagsfound_correctfound_guessedtoken_counterr   intt_correct_chunkt_found_correctt_found_guessed)selfr   r   r	   __init__   s    

zEvalCounts.__init__N)r   r   r   r   r   r   r   r	   r      s   r   c             C   sl   dd l }|jd|jd}|j}|dddddd	 |d
ddtdd	 |dddddd	 |ddd d |j| S )Nr   z-evaluate tagging results using CoNLL criteria)descriptionformatter_classz-bz
--boundaryZSTRz-X-zsentence boundary)metavardefaulthelpz-dz--delimiterCHARz#character delimiting items in inputz-oz--otagOzalternative outside tagfile?)nargsr   )argparseArgumentParserArgumentDefaultsHelpFormatteradd_argument	ANY_SPACE
parse_args)argvr!   parserargr   r   r	   r&   (   s    



r&   c             C   s    t jd| }|r|j S | dfS )Nz^([^-]*)-(.*)$ )rematchgroups)tmr   r   r	   	parse_tag9   s    r0   c             C   s  |d krt g }t }d }d}d}d}d}d}x2| D ](}	|	jd}	|jtkrZ|	j }
n|	j|j}
|d krxt|
}n,|t|
krt|
dkrtdt|
|f t|
dks|
d |jkr|jddg}
t|
dk rtd|	 t	|
j
 \}}t	|
j
 \}}|
j
d}||jkrd}t||||}t||||}t||||}t||||}|r|r|r||krd}| jd	7  _|j|  d	7  < n||ks||krd}|r|r||krd
}|r| jd	7  _|j|  d	7  < |r| jd	7  _|j|  d	7  < ||jkrP||krB||krB| jd	7  _| jd	7  _|}|}|}|}q6W |r| jd	7  _|j|  d	7  < |S )NFr   r*   z
r   z&unexpected number of features: %d (%d)   z(unexpected number of features in line %s   T)r&   r   rstrip	delimiterr%   splitlenr   boundaryr0   popend_of_chunkstart_of_chunkr   r   r   r   r   r   r   r   )iterableoptionscountsnum_featuresZ
in_correctZlast_correctZlast_correct_typeZlast_guessedZlast_guessed_typelinefeaturesguessedZguessed_typecorrectZcorrect_typeZ
first_itemZend_correctZend_guessedZstart_correctZstart_guessedr   r   r	   evaluate>   s    





rC   c                s   t    fdd| D S )Nc                s"   g | ]}| kp j |s|qS r   )add).0i)seenr   r	   
<listcomp>   s    zuniq.<locals>.<listcomp>)set)r;   r   )rG   r	   uniq   s    rJ   c       	      C   s   | ||  ||    }}}|| dkr(dnd| ||  }|| dkrHdnd| ||  }|| dkrhdnd| | ||  }t ||||||S )Nr   g      ?   )r
   )	rB   rA   totaltpfpfnprfr   r   r	   calculate_metrics   s
      $rS   c             C   sf   | }t |j|j|j}i }xBtt|jt|j D ]&}t |j| |j| |j| ||< q4W ||fS )N)	rS   r   r   r   rJ   listr   r   r   )r=   coverallby_typer.   r   r   r	   metrics   s    $rX   c             C   s  |d krt j}t| \}}| }|jd|j|jf  |jd|j|jf  |jdkr|jdd|j |j   |jdd|j	   |jdd|j
   |jdd|j   xlt|j D ]\\}}|jd	|  |jdd|j	   |jdd|j
   |jd
d|j |j| f  qW d S )Nz%processed %d tokens with %d phrases; z found: %d phrases; correct: %d.
r   zaccuracy: %6.2f%%; g      Y@zprecision: %6.2f%%; zrecall: %6.2f%%; zFB1: %6.2f
z%17s: zFB1: %6.2f  %d
)sysstdoutrX   writer   r   r   r   r   precrecfscoresorteditemsr   )r=   outrV   rW   rU   rF   r/   r   r   r	   report   s&    
rb   c       	      C   s\  |d krt j}t| \}}| }g }g }|jd|j|jf  |jd|j|jf  |jdj| |jdkrg }|jdd|j	 |j   |jdd|j
   |jdd|j   |jd	d|j   |jdj| xt|j D ]p\}}g }|jd
|  |jdd|j
   |jdd|j   |jdd|j |j| f  |jdj| qW |S )Nz%processed %d tokens with %d phrases; z found: %d phrases; correct: %d.
r*   r   zaccuracy: %6.2f%%; g      Y@zprecision: %6.2f%%; zrecall: %6.2f%%; zFB1: %6.2f
z%17s: zFB1: %6.2f  %d
)rY   rZ   rX   appendr   r   r   r   joinr   r\   r]   r^   r_   r`   r   )	r=   ra   rV   rW   rU   Zfinal_reportr?   rF   r/   r   r   r	   report_notprint   s6    
re   c             C   s   d}| dkrd}| dkrd}| dkr0|dkr0d}| dkrD|dkrDd}| dkrX|dkrXd}| dkrl|dkrld}| dkr|dkrd}| dkr|dkrd}| dkr| dkr||krd}| d	krd}| d
krd}|S )NFETSBr   I.][r   )prev_tagtag	prev_typetype_	chunk_endr   r   r	   r9      s0              r9   c             C   s   d}|dkrd}|dkrd}| dkr0|dkr0d}| dkrD|dkrDd}| dkrX|dkrXd}| dkrl|dkrld}| dkr|dkrd}| dkr|dkrd}|dkr|dkr||krd}|d	krd}|d
krd}|S )NFrh   Trg   rf   ri   r   rj   rl   rk   r   )rm   rn   ro   rp   Zchunk_startr   r   r	   r:      s0              r:   c          	   C   s*   t j| dd}t|}W d Q R X t|S )NrQ   utf8)codecsopenrC   re   )Z
input_filerR   r=   r   r   r	   return_report  s    ru   c          
   C   sT   t | dd  }|jd kr(ttj|}n t|j}t||}W d Q R X t| d S )Nr2   )r&   r   rC   rY   stdinrt   rb   )r'   argsr=   rR   r   r   r	   main  s    
rx   __main__)N)N)N)rY   r+   rs   collectionsr   r   r%   	Exceptionr   r
   objectr   r&   r0   rC   rJ   rS   rX   rb   re   r9   r:   ru   rx   r   exitr'   r   r   r   r	   <module>   s*   

R

"
