3
GY^                 @   sx   d dl Zd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ dd Zdd Zd	d
 Zdd Zdd Zdd Zdd ZdS )    N)viterbi_decode)
get_loggertest_nerbio_to_json)input_from_linec       
      C   s`   |\}}}}}| j tj|| jtj|| jtj|| jdi}	|r\tj||	| j< |j|	| j< |	S )z
    :param is_train: Flag, True for train batch
    :param batch: list train/evaluate data
    :return: structured data to feed
    g      ?)	input_idsnpasarray
input_masksegment_idsdropouttargetsdropout_keep_prob)
modelis_trainbatchconfig_r   charsmasktags	feed_dict r   8D:\pycharm\NER-BERT-BiLSTM-CRF--master\train_val_test.pyget_feed_dict   s    
r   c             C   s   g }d}t j|g|j dg g}xxt| |D ]j\}}|d| }|t j|dg }	t j||	gdd} t j|| gdd} t| |\}
}|j|
dd  q.W |S )z
    :param logits: [batch_size, num_steps, num_tags]float32, logits
    :param lengths: [batch_size]int32, real length of each sequence
    :param matrix: transaction matrix for inference
    :return:
    g     @@r   N   )axisg     @)r   r	   num_tagsziponesconcatenater   append)logitslengthsmatrixr   pathssmallstartscorelengthpadpathr   r   r   r   decode   s    r,   c                s  g }|j j }x|j D ]}|d }|d	 }	t|d||}
| j|j|jg|
\}}t||||}xtt	|D ]}g }|| d||  } fdd|	| d||  D } fdd|| d||  D }x0t
|||D ] \}}}|jdj|||g qW |j| qpW qW |S )
z
    :param sess: session  to run the model
    :param data: list of data
    :param id_to_tag: index to tag name
    :return: evaluate result
    r   r   FNc                s   g | ]} t | qS r   )int).0x)	id_to_tagr   r   
<listcomp>G   s    zevaluate_.<locals>.<listcomp>c                s   g | ]} t | qS r   )r-   )r.   r/   )r0   r   r   r1   H   s     )transeval
iter_batchr   runr#   r"   r,   rangelenr   r!   join)sessr   data_managerr0   r   resultsr4   r   stringslabelsr   r#   scoresbatch_pathsiresultstringZgoldpredcharr   )r0   r   	evaluate_5   s"    
""rG   c             C   s   |j dj| t| ||||}t||j}x|D ]}	|j |	 q2W t|d j j d }
|dkr|jj	 }|
|krt
j|j|
j	  |j dj|
 |
|kS d S )Nzevaluate:{}r   devznew best dev f1 score:{:>.3f}r3   )infoformatrG   r   result_pathfloatstripsplitbest_dev_f1r5   tfassign)r;   r   namer<   r0   loggerr   Zner_results
eval_lineslinef1Zbest_test_f1r   r   r   evaluateO   s    

rW   c             C   s  t |j}tjjtj dd}tj }d|j_|j	}tj
|d6}	tjj|j}
|
rtjj|
jr|jd|
j  | jj|	|
j n|jd |	jtj  |jd g }xt|jD ]}x|jddD ]x}t| d||}|	j| j| j| jg|\}}}|j| ||j d	kr|| d
 }|jdj||| |tj| g }qW t |	| d||||}|r|j!|	|j"|d qW W d Q R X d S )N   )max_to_keepT)r   z Reading model parameters from %sz$Created model with fresh parameters.zstart training)shuffler   r   z*iteration:{} step:{}/{}, NER loss:{:>9.6f}rH   )global_step)#r   log_filerP   trainSaverglobal_variablesConfigProtogpu_optionsallow_growthlen_dataSessionget_checkpoint_state	ckpt_pathcheckpoint_existsmodel_checkpoint_pathrI   saverrestorer7   global_variables_initializerr8   epochr6   r   r[   losstrain_opr!   print_per_batchrJ   r   meanrW   savecheckpoint_path)r   r   train_managerdev_managerr0   rS   ri   	tf_configsteps_per_epochr;   ckptrm   rB   r   r   r[   Z
batch_lossr   	iterationbestr   r   r   r]   _   s6    



r]   c       	      C   s   t |j}tj }d|j_tj|d~}tjj|j	}|j
tj  |j
tj  tjj }|rtjj|jr|jd|j  |j||j t|| d|||| W d Q R X d S )NT)r   z Reading model parameters from %stest)r   r\   rP   r`   ra   rb   rd   r]   re   rf   r7   rk   local_variables_initializerr^   rg   rh   rI   rj   rW   )	r   r   test_managerr0   rS   ru   r;   rw   ri   r   r   r   rz      s    

rz   c                s0  t |j}tj }d|j_tj|d }tjj|j	}|j
tj  |j
tj  tjj }|rtjj|jr|jd|j  |j||j xtd}	t|	|j|}
| jj|}t| d|
|}|j
| j| jg|\}}t||||} fdd|d D }t|
d |d	d }t|d
  qW W d Q R X d S )NT)r   z Reading model parameters from %szinput sentence, please:Fc                s   g | ]} | qS r   r   )r.   idx)r0   r   r   r1      s    zdemo.<locals>.<listcomp>r   r   entitiesr3   )r   r\   rP   r`   ra   rb   rd   r]   re   rf   r7   rk   r{   r^   rg   rh   rI   rj   inputr   max_seq_lenr4   r5   r   r#   r"   r,   r   print)r   r   r0   	tag_to_idrS   ru   r;   rw   ri   rU   inputsr4   r   r#   r@   rA   r   rC   r   )r0   r   demo   s*    

r   )
tensorflowrP   numpyr   tensorflow.contrib.crfr   utilsr   r   r   data_helperr   r   r,   rG   rW   r]   rz   r   r   r   r   r   <module>   s   #