o
    ir                     @   s  d dl Z d dlmZ d dlZd dlmZ d dlmZmZ d dl	m
Z
mZmZmZmZ d dlmZmZmZmZ dddd	d
ddZg dZG dd dZG dd de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ddZedkre  dS dS )    N)chain)Counter)drtlinearlogic)AbstractVariableExpression
ExpressionLambdaExpressionVariableVariableExpression)BigramTaggerRegexpTaggerTrigramTaggerUnigramTaggerex_quant
univ_quantdef_artno_quant)aaneverythenodefault)nmodvmodpunctc                   @   sp   e Zd Zd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
dd Zdd Zdd Zdd ZdS )GlueFormulaNc                 C   s   |st  }t|trt|| _nt|tr|| _n	td||jf t|tr1t	 
|| _nt|tjr;|| _n	td||jf || _d S Nz1Meaning term neither string or expression: %s, %sz.Glue term neither string or expression: %s, %s)set
isinstancestrr   
fromstringmeaningRuntimeError	__class__r   LinearLogicParserparseglueindicesselfr"   r'   r(    r+   H/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/nltk/sem/glue.py__init__%   s*   



zGlueFormula.__init__c              
   C   s   | j |j @ rtd|  d| d| j |j B }zt| j|j|j }W n tjyB } ztd|   d|  d|d}~ww |j}|ra| j jjddd D ]}| 	t
d| |}qT| j|}| |||S )zyself = (\x.(walk x), (subj -o f))
        arg  = (john        ,  subj)
        returns ((walk john),          f)
        'z' applied to 'z'.  Indices are not disjoint.Nzv%s)r(   r   LinearLogicApplicationExceptionApplicationExpressionr'   simplifyr"   
antecedentdependenciesmake_LambdaExpressionr	   applytor$   )r*   argreturn_indicesreturn_glueearg_meaning_abstracteddepreturn_meaningr+   r+   r,   r6   ?   s6   zGlueFormula.applytoc                 C   s   t |S N)r
   r*   namer+   r+   r,   make_VariableExpression`      z#GlueFormula.make_VariableExpressionc                 C   s
   t ||S r>   )r   r*   variabletermr+   r+   r,   r5   c      
z!GlueFormula.make_LambdaExpressionc                 C   sD   t |tsJ t |jtsJ | | |jj| jt|j	| j	S r>   )
r   r   r"   r   r$   r5   rD   r   ImpExpressionr'   r*   otherr+   r+   r,   lambda_abstractf   s   zGlueFormula.lambda_abstractc                 C   s>   |st  }| j || j\}}|| | j|| hg S )z)From Iddo Lev's PhD Dissertation p108-109)r   r'   r2   compile_posr$   r"   get)r*   countercompiled_glue	new_formsr+   r+   r,   compilen   s   
zGlueFormula.compilec                 C   s   |  | j | j | jS r>   )r$   r"   r2   r'   r(   r*   r+   r+   r,   r2   y   s   zGlueFormula.simplifyc                 C   s$   | j |j ko| j|jko| j|jkS r>   )r$   r"   r'   rH   r+   r+   r,   __eq__~   s
   

zGlueFormula.__eq__c                 C   s
   | |k S r>   r+   rH   r+   r+   r,   __ne__   rF   zGlueFormula.__ne__c                 C   s   t | t |k S r>   r    rH   r+   r+   r,   __lt__   s   zGlueFormula.__lt__c                 C   sR   t | jtsJ | j d| j }| jr'|dddd t| jD  d 7 }|S )N : z : {z, c                 s   s    | ]}t |V  qd S r>   rT   ).0indexr+   r+   r,   	<genexpr>   s    z&GlueFormula.__str__.<locals>.<genexpr>})r   r(   r   r"   r'   joinsorted)r*   accumr+   r+   r,   __str__   s    zGlueFormula.__str__c                 C   s   d|  S )N%sr+   rQ   r+   r+   r,   __repr__   rB   zGlueFormula.__repr__r>   )__name__
__module____qualname__r-   r6   rA   r5   rJ   rP   r2   rR   rS   rU   r^   r`   r+   r+   r+   r,   r   $   s    
!
	r   c                   @   s   e Zd Zd"ddZd#ddZdd Zd$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dS )%GlueDictNc                 C   s   || _ || _|   d S r>   )filenamefile_encoding	read_file)r*   re   encodingr+   r+   r,   r-      s   zGlueDict.__init__Tc                 C   sV  |r|    ztjj| jd| jd}W n+ ty> } zztjjd| j d| jd}W n	 ty3   |w W Y d }~nd }~ww | }|D ]b}| }t	|sQqE|d dkrXqE|
dd}g }d}d}	d}
d }t	|dkrt|d D ]V\}}|d	kr|dkr|d }	|d7 }qt|d
kr|d8 }|dkr|d |	|
 }|d |
d | }|||g qt|dkr|dkr|}
qt|dkr|dkrtd|  nqtt	|dkr|d dd }|d d}||krt }ntdd |d || 
dD }z$|d d	}|d d
}|d d |  }|d |d | }W n   |d  }d }Y || vr5i | |< |d u r|rk| | D ](}|| | vrPg | | |< | | | }| | | | | | | | qAqEd | | vrxg | | d < | | d  | qE|| | vrg | | |< |r| | | | | |  | | | | qEd S )Ntext)formatrh   zfile:r   #rV         (),z&Formula syntax is incorrect for entry []c                 s   s    | ]}|  V  qd S r>   )strip)rW   rr+   r+   r,   rY      s    
z%GlueDict.read_file.<locals>.<genexpr>)clearnltkdataloadre   rf   LookupError
splitlinesrs   lensplit	enumerateappendr#   rX   	frozensetextend)r*   empty_firstcontentsr:   lineslinepartsglue_formulasparen_counttuple_starttuple_commarelationshipsicmeaning_term	glue_term	rel_startrel_endstart_inheritanceend_inheritancesem	supertyperelsr'   r+   r+   r,   rg      s   




	

	zGlueDict.read_filec                 C   s   d}| D ]M}d| }| | D ]B}d}| | | D ]7}|dkr%||d 7 }n
|dt |d  7 }|d| 7 }|rG|t | | | krG|d| 7 }|d7 }|d7 }qqq|S )	N r_   rm   z:  rl   z : %s
)r{   )r*   r]   posstr_posrelsetr   gfr+   r+   r,   r^     s"   
zGlueDict.__str__Fc              	   C   s   |d u r$|j d }tt|d  }|j |d  }| ||t |S | |||}t|d  D ]}	|j |	 }
|| ||
|| q4|S )Nr   deps)	nodeslistr   from_iterablevaluesto_glueformula_listr   lookupr   )r*   depgraphnoderM   verbosetopdepListrootglueformulasdep_idxr<   r+   r+   r,   r   &  s   

zGlueDict.to_glueformula_listc                 C   s   |  |}d }|D ]}|| v r| | } nq	|d u rg S | || | |||}t|s<td|d |d |d f | ||d |||S )NzKThere is no GlueDict entry for sem type of '%s' with tag '%s', and rel '%s'wordtagrel)get_semtypesadd_missing_dependencies_lookup_semtype_optionr{   KeyError#get_glueformulas_from_semtype_entry)r*   r   r   rM   semtype_namessemtyper@   r   r+   r+   r,   r   7  s(   
zGlueDict.lookupc                 C   sf   |d   }|dkr1|j|d  }| d||}|d }|d |g  |d | |d  d S d S )Nr   mainheadsubjr   address)lowerr   lookup_unique
setdefaultr~   )r*   r   r   r   headnoder   relationr+   r+   r,   r   Q  s   z!GlueDict.add_missing_dependenciesc                    s   t  fddt|d  D }z|| }W |S  tyN   t  }t|d h D ]}t|t|kr:||k r:|}q*|sGd |v rDd }nY d S || }Y |S w )Nc                 3   s8    | ]} j | d   tvr j | d   V  qdS )r   N)r   r   OPTIONAL_RELATIONSHIPSrW   r<   r   r+   r,   rY   ]  s    z2GlueDict._lookup_semtype_option.<locals>.<genexpr>r   )r   r   r   r   r   r   r{   )r*   r   r   r   r   r   
best_matchrelset_optionr+   r   r,   r   \  s(   

zGlueDict._lookup_semtype_optionc                 C   sZ   |d   }|d   }|dkr|tv rt| gS td gS |dv r(|d |gS |d gS )zj
        Based on the node, return a list of plausible semtypes in order of
        plausibility.
        r   r   specr   )r   r   r   )r   SPEC_SEMTYPES)r*   r   r   r   r+   r+   r,   r   z  s   


zGlueDict.get_semtypesc                 C   sx   g }|   }|D ]1\}}	|| |||	}
t|s||
_n| t|d  |
_| |
j||| |
_||
 q|S )Nrm   )get_GlueFormula_factoryget_meaning_formular{   r   initialize_labelsr'   rL   r~   )r*   r   r   r   r   rM   r   glueFormulaFactoryr"   r'   r   r+   r+   r,   r     s   z,GlueDict.get_glueformulas_from_semtype_entryc                 C   s   | dd}| d|S )z
        :param generic: A meaning formula string containing the
            parameter "<word>"
        :param word: The actual word to be replace "<word>"
        .r   z<word>)replace)r*   genericr   r+   r+   r,   r     s   zGlueDict.get_meaning_formulac              	   C   sj   t |tjr!| |j |||}|d  rt|S t|S t	| 
|j|||| 
|j|||S )Nr   )r   r   AtomicExpressionfind_label_namer@   r   isupperr
   ConstantExpressionrG   r   r3   
consequent)r*   exprr   r   unique_indexr@   r+   r+   r,   r     s   

zGlueDict.initialize_labelsc           	   
   C   sL  z3| d}|d | }||d d  }|dkr&| ||j|d  ||W S | || |||||W S  ty   | |}|dkrG| Y S |dkrQd|  Y S |dkr[d	|  Y S |dkrk| |j|d   Y S |d
kry|  |  Y S |dkr| | d|| Y S |dkr| | d|| Y S | | ||| Y S w )Nr   rm   superr   fvz%svrt   z%srvarr   conjabconjb)rX   r   r   r   
ValueError	get_labelupper)	r*   r@   r   r   r   dot
before_dot	after_dotlblr+   r+   r,   r     s@   

zGlueDict.find_label_namec                 C   s<   |d }g d|d  }t |d }|dkr|t| S |S )z
        Pick an alphabetic character as identifier for an entity in the model.

        :param value: where to index into the list of characters
        :type value: int
        r   )r   ghr   jklmnopqrt   stur   wxyzr   r   r   dr:   rm      r   )intr    )r*   r   valueletternumr+   r+   r,   r     s   zGlueDict.get_labelc                    sj    fddt |d  D }t|dkr!td|d t|dkr1td|d |d S )	z\
        Lookup 'key'. There should be exactly one item in the associated relation.
        c                    s0   g | ]} j | d    kr j | qS )r   )r   r   r   r   r   r+   r,   
<listcomp>  s
    z*GlueDict.lookup_unique.<locals>.<listcomp>r   r   z#'{}' doesn't contain a feature '{}'r   rm   z&'{}' should only have one feature '{}')r   r   r   r{   r   rj   )r*   r   r   r   r   r+   r   r,   r     s   zGlueDict.lookup_uniquec                 C      t S r>   )r   rQ   r+   r+   r,   r        z GlueDict.get_GlueFormula_factoryr>   )T)NNF)ra   rb   rc   r-   rg   r^   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   rd      s     

u
	$+rd   c                   @   sj   e Zd Z	dddZd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S )GlueNFc                 C   sJ   || _ || _|| _ddlm} | | _|r|| _d S tj	ddd| _d S )Nr   )Prover9grammarssample_grammarszglue.semtype)
r   remove_duplicates	depparserrv   r   proversemtype_fileospathr[   )r*   r  r  r  r   r   r+   r+   r,   r-     s   

zGlue.__init__c              	   C   s8   |r
| j | d S | j tjtjddd d S )Nr   r   zglue_train.conll)	r  traintrain_from_filerv   rw   findr  r  r[   )r*   	depgraphsr+   r+   r,   train_depparser/  s   zGlue.train_depparserc                 C   s(   g }|  |D ]
}|| | q|S r>   )parse_to_compiledr   get_readings)r*   sentencereadingsagendar+   r+   r,   parse_to_meaning9  s   zGlue.parse_to_meaningc              
   C   s4  g }t |}t }t }|r| }|j }t|tjr|D ]G}z;t|jtjr.|jj	}	nt
 }	|j||	 || D ]}
|j|
j@ sZz
|||
 W q= tjyY   Y q=w q=W q tjyf   Y qw z
||j | W np ty   |g||j< Y nbw |D ]F}|| D ]?}z3t|jtjr|jj	}	nt
 }	|||	 |j|j@ sz
||| W n
 tjy   Y nw W q tjy   Y qw qz	|| | W n ty   |g||< Y nw |s|D ]}|| D ]}t |j|kr| || qq|D ]}|| D ]}t |j|kr| || qq|S r>   )r{   dictpopr'   r2   r   r   rG   r1   bindingsBindingDictr3   unifyr(   r~   r6   r0   UnificationExceptionr   _add_to_reading_list)r*   r  r  agenda_lengthatomics
nonatomicscur	glue_simpkeyr  atomic	nonatomicentryr   r+   r+   r,   r  ?  s   




5zGlue.get_readingsc                 C   sx   d}| j r0|D ](}z||j| jrd}W  nW q ty/ } ztd| W Y d }~qd }~ww |r:||j d S d S )NTFz2Error when checking logical equality of statements)r  equivr"   r  	Exceptionprintr~   )r*   glueformulareading_listadd_readingreadingr:   r+   r+   r,   r    s   zGlue._add_to_reading_listc                    s*    fdd  |D } fdd|D S )Nc                       g | ]}  |qS r+   )depgraph_to_glue)rW   dgrQ   r+   r,   r         z*Glue.parse_to_compiled.<locals>.<listcomp>c                    r)  r+   )gfl_to_compiled)rW   gflrQ   r+   r,   r     r,  )	dep_parse)r*   r  gflsr+   rQ   r,   r    s   zGlue.parse_to_compiledc                 C   sH   | j du rddlm} ||  d| _ | j js|   | j j|| jdS )z
        Return a dependency graph for the sentence.

        :param sentence: the sentence to be parsed
        :type sentence: list(str)
        :rtype: DependencyGraph
        Nr   
MaltParsertagger)r   )r  
nltk.parser2  get_pos_tagger_trainedr  r&   r   )r*   r  r2  r+   r+   r,   r/    s   

zGlue.dep_parsec                 C   s   |   |S r>   )get_glue_dictr   )r*   r   r+   r+   r,   r*    s   zGlue.depgraph_to_gluec                 C   
   t | jS r>   )rd   r  rQ   r+   r+   r,   r8    rF   zGlue.get_glue_dictc                 C   sH   t  }g }|D ]
}||| q| jr"td |D ]}t| q|S )NzCompiled Glue Premises:)r   r   rP   r   r$  )r*   r.  index_counterreturn_listr   cgfr+   r+   r,   r-    s   
zGlue.gfl_to_compiledc                 C   s\   ddl m} tg d}|jdd}t||d}t||d}t||d}tddg|d}|S )	Nr   )brown)	)z^-?[0-9]+(\.[0-9]+)?$CD)z(The|the|A|a|An|an)$AT)z.*able$JJ)z.*ness$NN)z.*ly$RB)z.*s$NNS)z.*ing$VBG)z.*ed$VBD)z.*rA  news)
categories)backoff)z(A|a|An|an)$r   )z(Every|every|All|all)$r   )nltk.corpusr=  r   tagged_sentsr   r   r   )r*   r=  regexp_taggerbrown_trainunigram_taggerbigram_taggertrigram_taggermain_taggerr+   r+   r,   r6    s   zGlue.get_pos_taggerNFNFr>   )ra   rb   rc   r-   r  r  r  r  r  r/  r*  r8  r-  r6  r+   r+   r+   r,   r     s    


Dr   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	DrtGlueFormulaNc                 C   s   |st  }t|trtj|| _nt|tjr|| _n	td||jf t|tr3t	
 || _nt|t	jr=|| _n	td||jf || _d S r   )r   r   r    r   DrtExpressionr!   r"   r#   r$   r   r%   r&   r'   r   r(   r)   r+   r+   r,   r-     s*   


zDrtGlueFormula.__init__c                 C   s
   t |S r>   )r   DrtVariableExpressionr?   r+   r+   r,   rA     rF   z&DrtGlueFormula.make_VariableExpressionc                 C   s   t ||S r>   )r   DrtLambdaExpressionrC   r+   r+   r,   r5     s   z$DrtGlueFormula.make_LambdaExpressionr>   )ra   rb   rc   r-   rA   r5   r+   r+   r+   r,   rR    s    
rR  c                   @   s   e Zd Zdd ZdS )DrtGlueDictc                 C   r   r>   )rR  rQ   r+   r+   r,   r     r   z#DrtGlueDict.get_GlueFormula_factoryN)ra   rb   rc   r   r+   r+   r+   r,   rV    s    rV  c                   @   s    e Zd Z	dddZdd ZdS )DrtGlueNFc                 C   s*   |s
t jddd}t| |||| d S )Nr   r   zdrt_glue.semtype)r  r  r[   r   r-   )r*   r  r  r  r   r+   r+   r,   r-     s
   zDrtGlue.__init__c                 C   r9  r>   )rV  r  rQ   r+   r+   r,   r8    rF   zDrtGlue.get_glue_dictrQ  )ra   rb   rc   r-   r8  r+   r+   r+   r,   rW    s    
	rW  r/   c           	      C   s   ddl m} g d}td tg d}||d}t|dd}t|D ]*\}}|| ks/| d	krMtd
| d|  || D ]}t|  q@td q#d S )Nr   r1  )zDavid sees MaryzDavid eats a sandwichzevery man chases a dogzevery man believes a dog sleepszJohn gives David a sandwichzJohn chases himselfz"============== DEMO ==============))z^(David|Mary|John)$NNP)zN^(sees|eats|chases|believes|gives|sleeps|chases|persuades|tries|seems|leaves)$VB)z!^(go|order|vanish|find|approach)$rY  )z^(a)$r   )z	^(every)$r   )z.^(sandwich|man|dog|pizza|unicorn|cat|senator)$rA  )z^(big|gray|former)$r@  )z^(him|himself)$PRPr3  F)r  r   r/   z[[[Example z]]]  r   )	r5  r2  r$  r   r   r}   r  r|   r2   )	show_exampler2  examplesr4  r  r'   r   r  r(  r+   r+   r,   demo  s    
r]  __main__)r/   )r  	itertoolsr   rv   nltk.internalsr   nltk.semr   r   nltk.sem.logicr   r   r   r	   r
   nltk.tagr   r   r   r   r   r   r   r  rd   r   rR  rV  rW  r]  ra   r+   r+   r+   r,   <module>   s:   	u    @"
2
