o
    wMêia  ã                   @  sæ   d Z ddlmZ ddlmZ ddlmZmZmZ ddl	Z
ddlmZ dZdZd	Zd
ZdZdZdZeddG dd„ dƒƒZeddG dd„ dƒƒZeG dd„ deƒƒZd.dd„Zd/dd„Zd0d!d"„Zeed#œd1d*d+„ZG d,d-„ d-ƒZdS )2ui   ç¾¤èŠè¯é¢˜åˆ’åˆ†ï¼šå‘é‡ä¸Žæ»‘åŠ¨è´¨å¿ƒ + è¿‘æœŸå‘é‡åˆ†æµï¼ˆä¸ä¾èµ– Embedderï¼Œä¾¿äºŽå•æµ‹ï¼‰ã€‚é    )Úannotations)Ú	dataclass)ÚProtocolÚSequenceÚruntime_checkableN)Úloggergš™™™™™á?é   é   gš™™™™™é?gš™™™™™É?g      è?g333333ã?T)Úfrozenc                   @  sF   e Zd ZU dZded< ded< ded< ded< ded	< d
Zded< dS )ÚTopicRecordu<   ç¾¤å†…ä¸€æ¡è¯é¢˜åŠå…¶æ»‘åŠ¨å‘é‡ä¸Žè¿‘æœŸæ¶ˆæ¯å‘é‡ã€‚ÚintÚidÚgroup_idú
np.ndarrayÚcentroidÚmessage_countÚstrÚanchor_preview© ztuple[np.ndarray, ...]Úrecent_embeddingsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   ú7/home/dore/onebot/Bot_Ero/core/group_topic_segmenter.pyr      s   
 r   c                   @  s:   e Zd ZU dZded< ded< ded< ded	< ded
< dS )ÚAssignmentResultu   å•æ¡æ¶ˆæ¯åˆ’åˆ†ç»“æžœã€‚r   Útopic_idÚboolÚis_new_topicÚfloatÚ
similarityr   Útext_previewÚmessage_count_afterN)r   r   r   r   r   r   r   r   r   r   !   s   
 r   c                   @  s8   e Zd Zddd„Zddd„Zd dd„Z	d!d"dd„ZdS )#ÚTopicSegmenterStorer   r   Úreturnúlist[TopicRecord]c                 C  ó   d S ©Nr   )Úselfr   r   r   r   Úlist_topics.   s   zTopicSegmenterStore.list_topicsÚcentroid_blobÚbytesr   r   r   Ú
created_atÚ
updated_atc                 C  r'   r(   r   )r)   r   r+   r   r   r-   r.   r   r   r   Úinsert_topic1   s   	z TopicSegmenterStore.insert_topicr   ÚNonec                 C  r'   r(   r   )r)   r   r+   r   r   r.   r   r   r   Úupdate_topic_centroid<   s   z)TopicSegmenterStore.update_topic_centroidNÚ
message_idÚuser_idÚcontent_previewr!   úfloat | NoneÚmsg_embedding_blobúbytes | Nonec	           	      C  r'   r(   r   )	r)   r   r   r2   r3   r4   r!   r-   r6   r   r   r   Úinsert_message_assignmentF   s   z-TopicSegmenterStore.insert_message_assignment)r   r   r%   r&   )r   r   r+   r,   r   r   r   r   r-   r   r.   r   r%   r   )r   r   r+   r,   r   r   r   r   r.   r   r%   r0   r(   )r   r   r   r   r2   r   r3   r   r4   r   r!   r5   r-   r   r6   r7   r%   r0   )r   r   r   r*   r/   r1   r8   r   r   r   r   r$   ,   s    


÷r$   Úvecr   r%   c                 C  s8   t j| t jd ¡ }tt j |¡ƒ}|dkr|S || S )N©Údtypeg        )ÚnpÚasarrayÚfloat64Úravelr    ÚlinalgÚnorm)r9   ÚvÚnr   r   r   Ú
_normalizeT   s
   rD   ÚembúSequence[float] | np.ndarrayr,   c                 C  s   t j| t jd ¡ }| ¡ S ©Nr:   )r<   r=   Úfloat32r?   Útobytes)rE   Úarrr   r   r   Úembedding_to_f32_blob\   s   rK   Úblobc                 C  s$   t j| t jd t j¡ ¡ }t|ƒS rG   )r<   Ú
frombufferrH   Úastyper>   r?   rD   )rL   rB   r   r   r   Úblob_to_normalized_centroida   s   rO   ©Úsim_recent_minÚsim_last_minÚmsg_vecÚtopicrQ   r    rR   r   c          	        s‚   |j }|sdS tj| tjd ¡ ‰ |t d… }‡ fdd„|D ƒ}t|ƒ}|t|ƒk r-dS |d }tt ˆ |¡ƒt|ƒk r?dS dS )ud   åœ¨å·²é€šè¿‡æ»‘åŠ¨å‘é‡ centroid é—¨æ§›åŽï¼Œä¾æ®è¿‘æœŸæ¶ˆæ¯å‘é‡åˆ¤æ–­æ˜¯å¦åº”æ–°å¼€ topicã€‚Fr:   Nc                   s   g | ]
}t t ˆ |¡ƒ‘qS r   )r    r<   Údot)Ú.0rB   ©Údr   r   Ú
<listcomp>s   s    z+should_create_new_topic.<locals>.<listcomp>Téÿÿÿÿ)	r   r<   r=   r>   r?   ÚRECENT_EMBEDDING_MAXÚmaxr    rU   )	rS   rT   rQ   rR   ÚrecentÚtailÚsimsÚmax_simÚlast_vecr   rW   r   Úshould_create_new_topicf   s   rb   c                   @  s6   e Zd ZdZedeeeee	dœddd„Z
d dd„ZdS )!ÚGroupTopicSegmenteruF   å¯¹å•æ¡å·²å‘é‡åŒ–çš„æ–‡æœ¬ï¼Œå½’å…¥å·²æœ‰ topic æˆ–æ–°å»º topicã€‚iô  )Úsimilarity_thresholdÚmax_preview_lenÚema_weight_oldÚema_weight_newrQ   rR   Úrecent_embedding_maxÚstorer$   rd   r    re   r   rf   rg   rQ   rR   rh   r%   r0   c          	      C  sP   || _ t|ƒ| _t|ƒ| _t|ƒ| _t|ƒ| _t|ƒ| _t|ƒ| _t|ƒ| _	d S r(   )
Ú_storer    Ú
_thresholdr   Ú_max_previewÚ_ema_oldÚ_ema_newÚ_sim_recent_minÚ_sim_last_minÚ_recent_max)	r)   ri   rd   re   rf   rg   rQ   rR   rh   r   r   r   Ú__init__€   s   





zGroupTopicSegmenter.__init__r   Útextr   Ú	embeddingrF   r2   r3   r-   r   c                C  s‚  |pd  ¡ }t|ƒtk rtdƒ‚ttj|tjd ¡ ƒ}|d | j	… }	t
|ƒ}
| j t|ƒ¡}d }d}d }g }|D ]}tt ||j¡ƒ}| |j|f¡ ||krW|}|j}|}q9|red dd„ |D ƒ¡}nd}d	}|d ur||| jkr|t||| j| jd
}|rƒt|jƒnd}t d|||t|jd ƒ| j||d urš|nd||||	d d… ¡ |r²|d u s²|| jk s²|rî| j t|ƒ|
d|	||¡}|d u rÅdnt|ƒ}| jj|t|ƒt|ƒt|ƒ|	|d u rÝd nt|ƒ||
d t|d||	ddS |d urö|d usøJ ‚t| j|j | j |  ƒ}t|j!ƒd }t
|ƒ}| j "t|ƒ|||	|¡ | jjt|ƒt|ƒt|ƒt|ƒ|	t|ƒ||
d tt|ƒd	t|ƒ|	|dS )NÚ z#text too short for topic assignmentr:   g      ð¿Ú c                 s  s$    | ]\}}|› d |d›V  qdS )ú:z.4fNr   )rV   ÚtidÚsr   r   r   Ú	<genexpr>¶   s   €" z3GroupTopicSegmenter.assign_topic.<locals>.<genexpr>z(no topics)FrP   r   z›[group_topic_embed] group=%s user=%s msg_id=%s dim=%s centroid_th=%.3f | vs_topics: %s | best_topic=%s best_sim=%.4f recent_n=%s should_split=%s preview=%rÚ-éx   é   g      ð?)r6   T)r   r   r!   r"   r#   )#ÚstripÚlenÚMIN_TEXT_LEN_FOR_TOPICÚ
ValueErrorrD   r<   r=   r>   r?   rl   rK   rj   r*   r   r    rU   r   Úappendr   Újoinrk   rb   ro   rp   r   r   ÚdebugÚshaper/   r8   r   rm   rn   r   r1   )r)   r   rs   rt   r2   r3   r-   ÚrawrE   ÚpreviewÚmsg_blobÚtopicsÚbest_idÚbest_simÚbest_recordÚ	sim_pairsÚtÚsimÚsims_fmtÚ	split_newÚrecent_nrx   Úsim_outÚmergedÚ	new_countÚnew_blobr   r   r   Úassign_topic•   sÈ   
€ü
ôúø
ûûø
ûz GroupTopicSegmenter.assign_topicN)ri   r$   rd   r    re   r   rf   r    rg   r    rQ   r    rR   r    rh   r   r%   r0   )r   r   rs   r   rt   rF   r2   r   r3   r   r-   r   r%   r   )r   r   r   r   ÚDEFAULT_SIMILARITY_THRESHOLDÚDEFAULT_EMA_OLDÚDEFAULT_EMA_NEWÚDEFAULT_SIM_RECENT_MINÚDEFAULT_SIM_LAST_MINr[   rr   r—   r   r   r   r   rc   }   s    örc   )r9   r   r%   r   )rE   rF   r%   r,   )rL   r,   r%   r   )
rS   r   rT   r   rQ   r    rR   r    r%   r   )r   Ú
__future__r   Údataclassesr   Útypingr   r   r   Únumpyr<   Úcore.loggerr   r˜   r€   r[   r™   rš   r›   rœ   r   r   r$   rD   rK   rO   rb   rc   r   r   r   r   Ú<module>   s4    

'

	û