U
    .Rν`35  γ                   @   sR   d dl Z d dlZG dd dZG dd deZG dd deZG dd	 d	eZdS )
ι    Nc                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )ΪClusteringHelperc                 C   s   |j | _ |j| _|j| _d S ©N)ΪnΪunigramsΪbigrams©ΪselfΪcorpus© r
   ϊ9C:\Users\PC\Pytho\Projects\NLP\brownclustering\helpers.pyΪ__init__   s    zClusteringHelper.__init__c                 C   s2   d}|D ]$}|D ]}|| j  ||fd‘7 }qq|S ©Nr   )r   Ϊget)r   Zcluster1Zcluster2Ϊ_countΪw1Ϊw2r
   r
   r   Ϊcount_bigrams   s
    zClusteringHelper.count_bigramsc                 C   s
   t  d S r   ©ΪNotImplementedError©r   Ϊwordsr
   r
   r   Ϊappend_cluster   s    zClusteringHelper.append_clusterc                 C   s
   t  d S r   r   ©r   ΪiΪjr
   r
   r   Ϊmerge_clusters   s    zClusteringHelper.merge_clustersc                 C   s
   t  d S r   r   ©r   r
   r
   r   Ϊget_clusters   s    zClusteringHelper.get_clustersc                 C   s
   t  d S r   r   ©r   r   r
   r
   r   Ϊget_cluster   s    zClusteringHelper.get_clusterc                 C   s
   t  d S r   r   r   r
   r
   r   Ϊcompute_benefit   s    z ClusteringHelper.compute_benefitN)
Ϊ__name__Ϊ
__module__Ϊ__qualname__r   r   r   r   r   r   r    r
   r
   r
   r   r      s   r   c                       st   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Z  ZS )ΪEnhancedClusteringHelperc                    s\   t   |‘ d| _g | _tjdtd| _tjdtd| _tjdtd| _	tjdtd| _
d S ©Nr   ©Ϊdtype)r   r   )Ϊsuperr   ΪmΪclustersΪnpΪzerosΪfloatΪp1Ϊp2Ϊq2Ϊl2r   ©Ϊ	__class__r
   r   r   $   s    z!EnhancedClusteringHelper.__init__c                 C   sΪ  t j| j| jddd| _d}|D ]}|| j| 7 }q || j | j| j< t j| j| jddd| _t j| j| jddd| _t| jD ]L}|  || j	| ‘| j | j| j|f< |  | j	| |‘| j | j|| jf< q|  ||‘| j | j| j| jf< t j| j
| jddd| _
t j| j
| jddd| _
t| jD ]:}|  | j|‘| j
| j|f< |  || j‘| j
|| jf< q(|  | j| j‘| j
| j| jf< t j| j| jddd| _t j| j| jddd| _| jd | _| j	 | ‘ ‘ |  ‘  dS ©z
        O(m (+ n))
        r   ©Ϊaxisι   N)r+   Ϊinsertr.   r)   r   r   r/   Ϊranger   r*   r0   Ϊ_qr1   ΪappendΪcopyΪ_update_deltas©r   r   Ϊ_sumΪwr   r
   r
   r   r   -   s,    $& z'EnhancedClusteringHelper.append_clusterc                 C   s:  t | jd D ]$}|  || jd ‘| j|| jd f< t |d | jd D ]θ}| j||f  | j|| jd f 8  < | j||f  | j|| jd f 8  < | j||f  | j| jd |f 8  < | j||f  | j| jd |f 8  < | j||f  |  ||| jd ‘7  < | j||f  |  | jd ||‘7  < qJqd S )Nr7   )r9   r)   Ϊ_deltar1   r0   Ϊ_q_lΪ_q_rr   r
   r
   r   r=   N   s    "&&&&&z'EnhancedClusteringHelper._update_deltasc                 C   s
   | j  ‘ S r   ©r*   r<   r   r
   r
   r   r   Z   s    z%EnhancedClusteringHelper.get_clustersc                 C   s   | j |  ‘ S r   rD   r   r
   r
   r   r   ]   s    z$EnhancedClusteringHelper.get_clusterc                 C   sͺ  t | jD ]}t |d | jD ]φ}d}||  |||‘7 }||  |||‘7 }||  |||‘7 }||  |||‘7 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }| j||f  |8  < q q
| j|  | j| ‘ | j|= | jd | _| j| | j|  | j|< t	j
| j|dd| _| j|d d f | j|d d f  | j|d d f< | jd d |f | jd d |f  | jd d |f< t	j
| j|dd| _t	j
| j|dd| _t	j
| j|dd| _t	j
| j|dd| _t | jD ]2}|  ||‘| j||f< |  ||‘| j||f< q0|  ||‘| j||f< t	j
| j|dd| _t	j
| j|dd| _t | jD ]€}t |d | jD ]}d}||  |||‘7 }||  |||‘7 }|| j||f 8 }|| j||f 8 }|| j||f 8 }|| j||f 8 }| j||f  |7  < qΐq¬t |D ]}|  ||‘| j||f< qZt |d | jD ]}|  ||‘| j||f< qd S )Nr7   r   r5   )r9   r)   rB   rC   r0   r1   r*   Ϊextendr.   r+   Ϊdeleter/   r:   rA   )r   r   r   Ϊ_iΪ_jΪ_tmpΪ_xΪxr
   r
   r   r   `   s^    22z'EnhancedClusteringHelper.merge_clustersc                 C   s
   | j  ‘ S r   )r1   r<   r   r
   r
   r   r        s    z(EnhancedClusteringHelper.compute_benefitc                 C   sP   | j ||f | j ||f  }| j| | j|  }| j| }|t |||  ‘ S ©z
        O(1)
        ©r/   r.   ΪmathΪlog©r   rG   rH   rJ   ΪpcxΪpcΪpxr
   r
   r   rB   £   s    
zEnhancedClusteringHelper._q_lc                 C   sP   | j ||f | j ||f  }| j| | j|  }| j| }|t |||  ‘ S rL   rM   ©r   rJ   rG   rH   ΪpxcrR   rS   r
   r
   r   rC   ­   s    
zEnhancedClusteringHelper._q_rc                 C   sv   | j ||f | j ||f  | j ||f  | j ||f  }| j| | j|  }| j| | j|  }|t |||  ‘ S rL   rM   ©r   rG   rH   rU   rR   rS   r
   r
   r   Ϊ_q_xΆ   s    8zEnhancedClusteringHelper._q_xc                 C   s8   | j ||f }| j| }| j| }|t |||  ‘ S rL   rM   ©r   rG   rJ   rQ   rR   rS   r
   r
   r   r:   Ώ   s    

zEnhancedClusteringHelper._qc                    sT  j  j   jd d f jd d f  jd d f jd d f    fdd}fdd}d}tjD ]j}|j|f 8 }|j|f 8 }|j|f 8 }|j|f 8 }|ks|krμq|||7 }q|| d 7 }|jf 7 }|jf 7 }|jf 7 }|jf 7 }|S )Nc                    sJ   |  } |  }}j |  }|t |||  ‘ |t |||  ‘  S r   )r.   rN   rO   ©rJ   ΪpijΪpjiΪpiΪpj©Ϊcount_2_new_eΪcount_2_new_sΪcount_i_newr   r
   r   Ϊ_weight_new_1Ο   s
    
z6EnhancedClusteringHelper._delta.<locals>._weight_new_1c                     sp   j f j f  j f  j f  } | } } }| t | ||  ‘ |t |||  ‘  S r   )r/   rN   rO   ©rZ   r[   r\   r]   ©ra   r   r   r   r
   r   Ϊ_weight_new_2Χ   s
    8z6EnhancedClusteringHelper._delta.<locals>._weight_new_2r   ι   )r.   r/   r9   r)   r0   ©r   r   r   rb   re   ΪlossrK   r
   ©r_   r`   ra   r   r   r   r   rA   Ι   s(    $$zEnhancedClusteringHelper._delta)r!   r"   r#   r   r   r=   r   r   r   r    rB   rC   rW   r:   rA   Ϊ__classcell__r
   r
   r2   r   r$   #   s   	!@
		
r$   c                       sV   e Zd Z fddZdd Zdd Zdd Zd	d
 ZdddZdd Z	dd Z
  ZS )ΪRawClusteringHelperc                    s   t   |‘ g | _d S r   )r(   r   r*   r   r2   r
   r   r   ς   s    zRawClusteringHelper.__init__c                 C   s   | j  | ‘ ‘ d S r   )r*   r;   r<   r   r
   r
   r   r   φ   s    z"RawClusteringHelper.append_clusterc                 C   s"   | j |  | j | ‘ | j |= d S r   )r*   rE   r   r
   r
   r   r   ω   s    z"RawClusteringHelper.merge_clustersc                 C   s
   | j  ‘ S r   rD   r   r
   r
   r   r   ύ   s    z RawClusteringHelper.get_clustersc                 C   s   | j |  ‘ S r   rD   r   r
   r
   r   r      s    zRawClusteringHelper.get_clusterNc                 C   sP   d}|d kr&|D ]}|| j | 7 }qn&|D ] }|D ]}|| j||f 7 }q2q*|S r   )r   r   )r   Ϊc1Ϊc2Ϊretr@   r   r   r
   r
   r   Ϊcount  s    zRawClusteringHelper.countc              
      sΘ   t |}t  t|D ]} || ‘ |< qt|D ].}t|D ] } || || ‘ ||f< qBq6d fdd	}d}t|D ]@}t|D ]2}||||t |||||||  ‘ 7 }qq|S )Nc                    s(   |d kr |  j  S  | |f j  S r   )r   )rG   rH   ©Ϊcountsr   r
   r   Ϊ_prob  s    zERawClusteringHelper.compute_average_mutual_information.<locals>._probr   )N)ΪlenΪdictr9   ro   rN   rO   )r   r*   Ϊkr   r   rr   rn   r
   rp   r   Ϊ"compute_average_mutual_information  s     2z6RawClusteringHelper.compute_average_mutual_informationc                 C   s   |   | j‘}t| j}t ||f‘}t|D ]V}t|d |D ]B}dd | jD }||  || ‘ ||= |   |‘| |||f< q>q,|S )Nr7   c                 S   s   g | ]}|  ‘ qS r
   )r<   )Ϊ.0rK   r
   r
   r   Ϊ
<listcomp>+  s     z7RawClusteringHelper.compute_benefit.<locals>.<listcomp>)rv   r*   rs   r+   r,   r9   rE   )r   Ϊtmpru   Ϊ_benefitr   r   Zclusters_candidater
   r
   r   r    "  s    
z#RawClusteringHelper.compute_benefit)N)r!   r"   r#   r   r   r   r   r   ro   rv   r    rj   r
   r
   r2   r   rk   ρ   s   
rk   c                       sl   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z  ZS )ΪModerateClusteringHelperc                    s<   t   |‘ d| _g | _tjdtd| _tjdtd| _d S r%   )	r(   r   r)   r*   r+   r,   r-   Ϊcounts_1Ϊcounts_2r   r2   r
   r   r   3  s
    z!ModerateClusteringHelper.__init__c                 C   sφ   t j| j| jddd| _d}|D ]}|| j| 7 }q || j| j< t j| j| jddd| _t j| j| jddd| _t| jD ]@}|  || j| ‘| j| j|f< |  | j| |‘| j|| jf< qz|  ||‘| j| j| jf< | jd | _| j 	| 
‘ ‘ dS r4   )r+   r8   r|   r)   r   r}   r9   r   r*   r;   r<   r>   r
   r
   r   r   :  s     z'ModerateClusteringHelper.append_clusterc                 C   s
   | j  ‘ S r   rD   r   r
   r
   r   r   O  s    z%ModerateClusteringHelper.get_clustersc                 C   s   | j |  ‘ S r   rD   r   r
   r
   r   r   R  s    z$ModerateClusteringHelper.get_clusterc                 C   sθ   | j | | j |  | j |< tj| j |dd| _ | j|d d f | j|d d f  | j|d d f< | jd d |f | jd d |f  | jd d |f< tj| j|dd| _tj| j|dd| _| j|  | j| ‘ | j|= | jd | _d S )Nr   r5   r7   )r|   r+   rF   r}   r*   rE   r)   r   r
   r
   r   r   U  s    22z'ModerateClusteringHelper.merge_clustersc                 C   sT   t j| j| jftd}t| jD ].}t|d | jD ]}|  ||‘|||f< q4q |S )Nr&   r7   )r+   r,   r)   r-   r9   rA   )r   Ϊdeltasr   r   r
   r
   r   r    b  s
    z(ModerateClusteringHelper.compute_benefitc                 C   sb   | j ||f | j ||f  | j }| j| | j|  | j }| j| | j }|t |||  ‘ S rL   ©r}   r   r|   rN   rO   rP   r
   r
   r   rB   i  s    "zModerateClusteringHelper._q_lc                 C   sb   | j ||f | j ||f  | j }| j| | j|  | j }| j| | j }|t |||  ‘ S rL   r   rT   r
   r
   r   rC   s  s    "zModerateClusteringHelper._q_rc                 C   s   | j ||f | j ||f  | j ||f  | j ||f  | j }| j| | j|  | j }| j| | j|  | j }|t |||  ‘ S rL   r   rV   r
   r
   r   rW   |  s    >zModerateClusteringHelper._q_xc                 C   sJ   | j ||f | j }| j| | j }| j| | j }|t |||  ‘ S rL   r   rX   r
   r
   r   r:     s    zModerateClusteringHelper._qc                    sD  j  j   jddf jddf  jddf jddf    fdd}fdd}d}tjD ]b}| |‘8 }| |‘8 }| |‘8 }| |‘8 }|ks|krδq|||7 }q|| d 7 }| ‘7 }| ‘7 }| ‘7 }| ‘7 }|S )z
        O(m)
        Nc                    sb   |  j  } |  j  }j  }j|  j  }|t |||  ‘ |t |||  ‘  S r   )r   r|   rN   rO   rY   r^   r
   r   rb     s
    
z6ModerateClusteringHelper._delta.<locals>._weight_new_1c                     s   j f j f  j f  j f  j } | } j } j }| t | ||  ‘ |t |||  ‘  S r   )r}   r   rN   rO   rc   rd   r
   r   re   €  s
    >

z6ModerateClusteringHelper._delta.<locals>._weight_new_2r   rf   )r|   r}   r9   r)   r:   rg   r
   ri   r   rA     s(    $$zModerateClusteringHelper._delta)r!   r"   r#   r   r   r   r   r   r    rB   rC   rW   r:   rA   rj   r
   r
   r2   r   r{   2  s   
		
r{   )rN   Ϊnumpyr+   r   r$   rk   r{   r
   r
   r
   r   Ϊ<module>   s    OA