o
    38i%                  	   @   sp  d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ej
dd zddlZW n ey6   ddlmZ Y nw G dd	 d	Zed
kre ZdZdZede  eedZed eD ]Zeded  ded  ded  d q\eedZed eD ]Zeded  ded  d qeedZed eD ]	Zede  qeedZede  dS dS )z]
Term Extractor Module
=====================
spaCy ile POS tagging ve Noun Phrase extraction
    N)ListDictTupleSetOptional)defaultdictz..   )configc                
   @   s   e Zd ZdZddedefddZdd Zdd
ededee fddZ	dd
ededee fddZ
			dd
edededee fddZdee dededee fddZdd
ededeeef fddZdS )TermExtractorui   
    spaCy tabanlı terim çıkarma sınıfı.
    Noun Phrase'leri ve teknik terimleri tespit eder.
    Nen_modeltr_modelc                 C   s.   |pt j| _|p
t j| _d| _d| _d| _dS )uy   
        Args:
            en_model: İngilizce spaCy model adı
            tr_model: Türkçe spaCy model adı
        NF)r	   SPACY_EN_MODELen_model_nameSPACY_TR_MODELtr_model_namenlp_ennlp_tr_initialized)selfr   r    r   B/var/www/html/PEPCVSON/terminology-extractor/src/term_extractor.py__init__   s
   
zTermExtractor.__init__c                 C   s  | j rdS ddl}ztd| j  || j| _td W n  ty>   td| j d |j| j || j| _Y nw ztd| j	  || j	| _
td W n' ty{   td	 z|d
| _
W n tyx   td | j| _
Y nw Y nw d| _ dS )u'   spaCy modellerini yükle (lazy loading)Nr   u"   🔄 Loading spaCy English model: u   ✅ English model loadedu$   ⚠️ Model not found. Downloading z...u"   🔄 Loading spaCy Turkish model: u   ✅ Turkish model loadedu4   ⚠️ Model not found. Trying multilingual model...xx_ent_wiki_smu9   ⚠️ Using English model for Turkish (limited accuracy)T)r   spacyprintr   loadr   OSErrorclidownloadr   r   )r   r   r   r   r   
initialize%   s6   
	zTermExtractor.initializeentextlangreturnc              
   C   s~   | j s|   |dkr| jn| j}||}g }|jD ]"}t|j }|tj	kr)q|
|j|jj|jj|j|j|d q|S )u   
        Metinden Noun Phrase'leri çıkar.
        
        Args:
            text: İşlenecek metin
            lang: Dil ('en' veya 'tr')
            
        Returns:
            List of noun phrases with metadata
        r    )r!   rootroot_posstartend
word_count)r   r   r   r   noun_chunkslenr!   splitr	   MAX_TERM_WORDSappendr$   pos_r&   r'   )r   r!   r"   nlpdocphraseschunkr(   r   r   r   extract_noun_phrasesF   s$   


	z"TermExtractor.extract_noun_phrasesc                 C   s   | j s|   |dkr| jn| j}||}g }|D ]1}|jtjv rJ|j tj	v r*q|j tj
v r3qt|jtjk r<q||j|j|j|jd q|S )u   
        Metinden teknik terimleri çıkar (NOUN, ADJ).
        
        Args:
            text: İşlenecek metin
            lang: Dil ('en' veya 'tr')
            
        Returns:
            List of technical terms with POS info
        r    )r!   lemmaposidx)r   r   r   r   r.   r	   ALLOWED_POS_TAGSr!   lowerENGLISH_STOP_WORDSTURKISH_STOP_WORDSr*   MIN_TERM_LENGTHr-   lemma_i)r   r!   r"   r/   r0   termstokenr   r   r   extract_technical_termsk   s*   z%TermExtractor.extract_technical_terms	max_wordsc                 C   s  | j s|   |ptj}|dkr| jn| j}||}g }g }|D ];}|jtjv r/||j	 q |r[dt
|  kr=|krYn nd|}	dd |D }
tdd |
D sY||	 g }q |rdt
|  krj|krn |S d|}	dd |D }
td	d |
D s||	 |S )
u6  
        Ardışık isim/sıfat kombinasyonlarını çıkar.
        Örn: "hydraulic pump", "safety valve"
        
        Args:
            text: İşlenecek metin
            lang: Dil
            max_words: Maksimum kelime sayısı
            
        Returns:
            List of compound terms
        r        c                 S      g | ]}|  qS r   r8   .0wr   r   r   
<listcomp>       z8TermExtractor.extract_compound_terms.<locals>.<listcomp>c                 s   $    | ]}|t jv p|t jv V  qd S Nr	   r9   r:   rF   r   r   r   	<genexpr>       

z7TermExtractor.extract_compound_terms.<locals>.<genexpr>c                 S   rD   r   rE   rF   r   r   r   rI      rJ   c                 s   rK   rL   rM   rF   r   r   r   rN      rO   )r   r   r	   r,   r   r   r.   r7   r-   r!   r*   joinall)r   r!   r"   rA   r/   r0   	compoundscurrent_compoundr?   compound_textwords_lowerr   r   r   extract_compound_terms   s:   




z$TermExtractor.extract_compound_terms
alignmentssource_texttarget_textc                 C   s   | j s|   | |}dd |D }| |}dd |D }g }|D ]8}	|	dd }
|	dd }||
d}|tjv r[|
tjvr[|tj	vr[||	d< ||d|	d	< |
|	 q#|S )
u?  
        Hizalanmış terimleri POS tag'e göre filtrele.
        Sadece NOUN, ADJ içerenleri tut.
        
        Args:
            alignments: Word alignment sonuçları
            source_text: Kaynak metin
            target_text: Hedef metin
            
        Returns:
            Filtered alignments
        c                 S      i | ]	}|j  |jqS r   r!   r8   r.   rG   r?   r   r   r   
<dictcomp>       z/TermExtractor.filter_by_pos.<locals>.<dictcomp>c                 S   rZ   r   r[   r\   r   r   r   r]      r^   src_word tgt_wordXsrc_postgt_pos)r   r   r   r   getr8   r	   r7   r9   r:   r-   )r   rW   rX   rY   doc_enrc   doc_trrd   filteredalignr_   ra   src_tagr   r   r   filter_by_pos   s&   





zTermExtractor.filter_by_posc                 C   sV   | j s|   |dkr| jn| j}||}tt}|D ]}||j  d7  < qt|S )u   
        Metindeki POS dağılımını hesapla.
        
        Args:
            text: İşlenecek metin
            lang: Dil
            
        Returns:
            POS tag counts
        r    rB   )r   r   r   r   r   intr.   dict)r   r!   r"   r/   r0   distributionr?   r   r   r   get_pos_distribution   s   z"TermExtractor.get_pos_distribution)NN)r    )r    N)__name__
__module____qualname____doc__strr   r   r   r   r3   r@   rl   rV   rk   ro   r   r   r   r   r
      s*    !%)

3
$+r
   __main__z?Check the hydraulic pump pressure and replace the safety valve.uI   Hidrolik pompa basıncını kontrol edin ve emniyet valfini değiştirin.z

English: r    z
Noun Phrases:z  r!   z (root: r$   z, POS: r%   )z
Technical Terms:z (r5   z
Compound Terms:z
POS Distribution: ) rs   systypingr   r   r   r   r   collectionsr   pathinsertr	   ImportErrorr`   r
   rp   	extractortext_entext_trr   r3   npsnpr@   r>   trV   rR   cro   distr   r   r   r   <module>   s@     y* 