§
    šŠtjf  ã                  óŽ   — d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ  G d	„ d
e¦  «        ZdS )é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚIterableÚListÚOptional)ÚCallbackManagerForRetrieverRun©ÚDocument)ÚBaseRetriever)Ú
ConfigDictc                  óØ   — e Zd ZU dZdZded<   	 ded<   	 dZded<   	 dZd	ed
<   	  ed¬¦  «        Z	e
	 	 d)d*d„¦   «         Ze
ddœd+d„¦   «         Zd,d„Z	 d-d.d#„Ze
d$dd%œd/d(„¦   «         ZdS )0ÚTFIDFRetrieverz˜`TF-IDF` retriever.

    Largely based on
    https://github.com/asvskartheek/Text-Retrieval/blob/master/TF-IDF%20Search%20Engine%20(SKLEARN).ipynb
    Nr   Ú
vectorizerúList[Document]ÚdocsÚtfidf_arrayé   ÚintÚkT)Úarbitrary_types_allowedÚtextsúIterable[str]Ú	metadatasúOptional[Iterable[dict]]Útfidf_paramsúOptional[Dict[str, Any]]ÚkwargsÚreturnc                óö   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w|pi } |di |¤Ž}|                     |¦  «        }|pd„ |D ¦   «         }d„ t	          ||¦  «        D ¦   «         } | d|||dœ|¤ŽS )Nr   )ÚTfidfVectorizerzNCould not import scikit-learn, please install with `pip install scikit-learn`.c              3  ó   K  — | ]}i V — Œd S ©N© )Ú.0Ú_s     úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/retrievers/tfidf.pyú	<genexpr>z,TFIDFRetriever.from_texts.<locals>.<genexpr>4   s"   è è € Ð!4Ð!4¨ "Ð!4Ð!4Ð!4Ð!4Ð!4Ð!4ó    c                ó6   — g | ]\  }}t          ||¬ ¦  «        ‘ŒS )©Úpage_contentÚmetadatar   )r&   ÚtÚms      r(   ú
<listcomp>z-TFIDFRetriever.from_texts.<locals>.<listcomp>5   s)   € ÐWÐWÐW¹¸¸A• a°!Ð4Ñ4Ô4ÐWÐWÐWr*   ©r   r   r   r%   )Úsklearn.feature_extraction.textr"   ÚImportErrorÚfit_transformÚzip)	Úclsr   r   r   r   r"   r   r   r   s	            r(   Ú
from_textszTFIDFRetriever.from_texts!   sØ   € ð	ØGÐGÐGÐGÐGÐGÐGøÝð 	ð 	ð 	Ýð!ñô ð ð	øøøð $Ð) rˆØ$�_Ð4Ð4 |Ð4Ð4ˆ
Ø ×.Ò.¨uÑ5Ô5ˆØÐ4Ð!4Ð!4¨eÐ!4Ñ!4Ô!4ˆ	ØWÐWÅÀUÈIÑAVÔAVÐWÑWÔWˆØˆsÐW˜j¨tÀÐWÐWÐPVÐWÐWÐWs   ‚	 ‰#)r   Ú	documentsúIterable[Document]c               óP   — t          d„ |D ¦   «         Ž \  }} | j        d|||dœ|¤ŽS )Nc              3  ó2   K  — | ]}|j         |j        fV — Œd S r$   r,   )r&   Úds     r(   r)   z0TFIDFRetriever.from_documents.<locals>.<genexpr>@   s+   è è € Ð QÐ QÀ! !¤.°!´*Ð!=Ð QÐ QÐ QÐ QÐ QÐ Qr*   )r   r   r   r%   )r6   r8   )r7   r9   r   r   r   r   s         r(   Úfrom_documentszTFIDFRetriever.from_documents8   sQ   € õ Ð QÐ QÀyÐ QÑ QÔ QÐRÑˆˆyØˆsŒ~ð 
Ø l¸ið
ð 
ØKQð
ð 
ð 	
r*   ÚqueryÚstrÚrun_managerr
   c               ó   ‡ — ddl m} ‰ j                             |g¦  «        } |‰ j        |¦  «                             d¦  «        }ˆ fd„|                     ¦   «         ‰ j         d …         d d d…         D ¦   «         }|S )Nr   )Úcosine_similarity)éÿÿÿÿc                ó*   •— g | ]}‰j         |         ‘ŒS r%   )r   )r&   ÚiÚselfs     €r(   r1   z:TFIDFRetriever._get_relevant_documents.<locals>.<listcomp>P   s   ø€ ÐPÐPÐP¨�t”y ”|ÐPÐPÐPr*   rD   )Úsklearn.metrics.pairwiserC   r   Ú	transformr   ÚreshapeÚargsortr   )rG   r?   rA   rC   Ú	query_vecÚresultsÚreturn_docss   `      r(   Ú_get_relevant_documentsz&TFIDFRetriever._get_relevant_documentsE   s¡   ø€ ð 	?Ð>Ð>Ð>Ð>Ð>à”O×-Ò-ØˆGñ
ô 
ˆ	ð $Ð# DÔ$4°iÑ@Ô@×HÒHØñ
ô 
ˆð QÐPÐPÐP¨W¯_ª_Ñ->Ô->ÀÄ¸w¸y¸yÔ-IÈ$È$ÈBÈ$Ô-OÐPÑPÔPˆØÐr*   Útfidf_vectorizerÚfolder_pathÚ	file_nameÚNonec                óz  — 	 dd l }n# t          $ r t          d¦  «        ‚w xY wt          |¦  «        }|                     dd¬¦  «         |                     | j        ||› d�z  ¦  «         t          ||› d�z  d¦  «        5 }t          j        | j        | j	        f|¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr   úBCould not import joblib, please install with `pip install joblib`.T)Úexist_okÚparentsú.joblibú.pklÚwb)
Újoblibr4   r   ÚmkdirÚdumpr   ÚopenÚpickler   r   )rG   rQ   rR   r[   ÚpathÚfs         r(   Ú
save_localzTFIDFRetriever.save_localS   s*  € ð
	ØˆMˆMˆMˆMøÝð 	ð 	ð 	ÝØTñô ð ð	øøøõ
 �KÑ Ô ˆØ�
Š
˜D¨$ˆ
Ñ/Ô/Ð/ð 	�Š�D”O T¨yÐ,AÐ,AÐ,AÑ%AÑBÔBÐBõ �$˜IÐ+Ð+Ð+Ñ+¨TÑ2Ô2ð 	:°aÝŒK˜œ DÔ$4Ð5°qÑ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:s   ‚ ‡!Â"B0Â0B4Â7B4F)Úallow_dangerous_deserializationrR   rc   Úboolc               ód  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|st          d¦  «        ‚t          |¦  «        }|                     ||› d�z  ¦  «        }t          ||› d�z  d¦  «        5 }t          j        |¦  «        \  }}	ddd¦  «         n# 1 swxY w Y    | |||	¬¦  «        S )	aì  Load the retriever from local storage.

        Args:
            folder_path: Folder path to load from.
            allow_dangerous_deserialization: Whether to allow dangerous deserialization.
                Defaults to False.
                The deserialization relies on .joblib and .pkl files, which can be
                modified to deliver a malicious payload that results in execution of
                arbitrary code on your machine. You will need to set this to `True` to
                use deserialization. If you do this, make sure you trust the source of
                the file.
            file_name: File name to load from. Defaults to "tfidf_vectorizer".

        Returns:
            TFIDFRetriever: Loaded retriever.
        r   NrU   a   The de-serialization of this retriever is based on .joblib and .pkl files.Such files can be modified to deliver a malicious payload that results in execution of arbitrary code on your machine.You will need to set `allow_dangerous_deserialization` to `True` to load this retriever. If you do this, make sure you trust the source of the file, and you are responsible for validating the file came from a trusted source.rX   rY   Úrbr2   )r[   r4   Ú
ValueErrorr   Úloadr^   r_   )
r7   rQ   rc   rR   r[   r`   r   ra   r   r   s
             r(   Ú
load_localzTFIDFRetriever.load_locali   s2  € ð0	ØˆMˆMˆMˆMøÝð 	ð 	ð 	ÝØTñô ð ð	øøøð
 /ð 
	Ýð.ñ	ô 	ð 	õ �KÑ Ô ˆð —[’[ ¨9Ð(=Ð(=Ð(=Ñ!=Ñ>Ô>ˆ
õ �$˜IÐ+Ð+Ð+Ñ+¨TÑ2Ô2ð 	/°aõ !'¤¨A¡¤ÑˆD�+ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð
 ˆs˜j¨tÀÐMÑMÔMÐMs   ‚ ‡!Á5BÂBÂ B)NN)
r   r   r   r   r   r   r   r   r    r   )r9   r:   r   r   r   r   r    r   )r?   r@   rA   r
   r    r   )rP   )rQ   r@   rR   r@   r    rS   )rQ   r@   rc   rd   rR   r@   r    r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   Úmodel_configÚclassmethodr8   r>   rO   rb   ri   r%   r*   r(   r   r      sO  € € € € € € ðð ð €JÐÐÐÑØØÐÐÑØØ€KÐÐÐÑØØ€A€J€J€J�JØ(à�:Ø $ðñ ô €Lð ð /3Ø15ð	Xð Xð Xð Xñ „[ðXð, ð
 26ð	

ð 

ð 

ð 

ð 

ñ „[ð

ðð ð ð ð" ,ð:ð :ð :ð :ð :ð, ð
 16Ø+ð5Nð 5Nð 5Nð 5Nð 5Nñ „[ð5Nð 5Nð 5Nr*   r   )Ú
__future__r   r_   Úpathlibr   Útypingr   r   r   r   r	   Úlangchain_core.callbacksr
   Úlangchain_core.documentsr   Úlangchain_core.retrieversr   Úpydanticr   r   r%   r*   r(   ú<module>rx      sì   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à CÐ CÐ CÐ CÐ CÐ CØ -Ð -Ð -Ð -Ð -Ð -Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð ðRNð RNð RNð RNð RN�]ñ RNô RNð RNð RNð RNr*   