
    Wi                         d dl Z d dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZ  G d de      Z	 	 ddej                   d	ej                   d
ee   dededee   fdZy)    N)ListMappingTuple)
csr_matrix)cosine_similarity)BaseRepresentationc                       e Zd ZdZddedefdZdej                  de	de
eeeeef      f   de
eeeeef      f   fd	Zy
)MaximalMarginalRelevancea  Calculate Maximal Marginal Relevance (MMR)
    between candidate keywords and the document.

    MMR considers the similarity of keywords/keyphrases with the
    document, along with the similarity of already selected
    keywords and keyphrases. This results in a selection of keywords
    that maximize their within diversity with respect to the document.

    Arguments:
        diversity: How diverse the select keywords/keyphrases are.
                    Values range between 0 and 1 with 0 being not diverse at all
                    and 1 being most diverse.
        top_n_words: The number of keywords/keyhprases to return

    Usage:

    ```python
    from bertopic.representation import MaximalMarginalRelevance
    from bertopic import BERTopic

    # Create your representation model
    representation_model = MaximalMarginalRelevance(diversity=0.3)

    # Use the representation model in BERTopic on top of the default pipeline
    topic_model = BERTopic(representation_model=representation_model)
    ```
    	diversitytop_n_wordsc                      || _         || _        y )N)r   r   )selfr   r   s      h/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/bertopic/representation/_mmr.py__init__z!MaximalMarginalRelevance.__init__'   s    "&    	documentsc_tf_idftopicsreturnc                    |j                   t        j                  d       |S i }|j                         D ]  \  }}|D cg c]  }|d   	 }	}|j	                  |	dd      }
|j	                  dj                  |	      dd      j                  dd      }t        ||
|	| j                  | j                        }||   D cg c]  \  }}||v s||f c}}||<    |S c c}w c c}}w )	a7  Extract topic representations.

        Arguments:
            topic_model: The BERTopic model
            documents: Not used
            c_tf_idf: Not used
            topics: The candidate topics as calculated with c-TF-IDF

        Returns:
            updated_topics: Updated topic representations
        zhMaximalMarginalRelevance can only be used BERTopic was instantiatedwith the `embedding_model` parameter.r   wordF)methodverbose    )
embedding_modelwarningswarnitems_extract_embeddingsjoinreshapemmrr   r   )r   topic_modelr   r   r   updated_topicstopictopic_wordsr   wordsword_embeddingstopic_embeddingvalues                r   extract_topicsz'MaximalMarginalRelevance.extract_topics+   s   $ &&.MM8 M"(,,. 	lE;)45T!W5E5)==eF\a=bO)==chhuoV\fk=ltt2O   K GMUm$k{tUW[_jWjdE]$kN5!	l  6 %ls    C C#C#Ng?
   )__name__
__module____qualname____doc__floatintr   pd	DataFramer   r   strr   r   r-    r   r   r
   r
   
   s{    8'% 'C '( <<( 	(
 T%U
"3445( 
d5e,--	.(r   r
   doc_embeddingr*   r)   r   top_nr   c                    t        ||       }t        |      }t        j                  |      g}t        t	        |            D cg c]  }||d   k7  s| }	}t        |dz
        D ]  }
||	ddf   }t        j
                  ||	   dd|f   d      }d|z
  |z  ||j                  dd      z  z
  }|	t        j                  |         }|j                  |       |	j                  |        |D cg c]  }||   	 c}S c c}w c c}w )a  Maximal Marginal Relevance.

    Arguments:
        doc_embedding: The document embeddings
        word_embeddings: The embeddings of the selected candidate keywords/phrases
        words: The selected candidate keywords/keyphrases
        diversity: The diversity of the selected embeddings.
                   Values between 0 and 1.
        top_n: The top n items to return

    Returns:
            List[str]: The selected keywords/keyphrases
    r   r   N)axisr   )	r   npargmaxrangelenmaxr#   appendremove)r:   r*   r)   r   r;   word_doc_similarityword_similaritykeywords_idxicandidates_idx_candidate_similaritiestarget_similaritiesr$   mmr_idxidxs                   r   r$   r$   V   s   * ,O]K'8O II123L!&s5z!2KAa<?6JaKNK519 ' "5^Q5F!G ff_^%DQ_%U\]^ 9} 66EXE`E`acefEg9gg 30 	G$g&' #//3E#J//! L  0s   D D 1Dr.   )r   numpyr>   pandasr6   typingr   r   r   scipy.sparser   sklearn.metrics.pairwiser   bertopic.representation._baser   r
   ndarrayr8   r4   r5   r$   r9   r   r   <module>rV      s       ' ' # 6 <I1 I` *0::*0ZZ*0 9*0 	*0
 *0 
#Y*0r   