o
    rZhr                     @   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_quantZdef_artZno_quant)aZanZeveryZ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&   </var/www/auris/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%   argZreturn_indicesZreturn_glueeZarg_meaning_abstracteddepZreturn_meaningr&   r&   r'   r1   ?   s6   zGlueFormula.applytoc                 C   s   t |S N)r
   r%   namer&   r&   r'   make_VariableExpression`      z#GlueFormula.make_VariableExpressionc                 C   s
   t ||S r5   )r   r%   variabletermr&   r&   r'   r0   c      
z!GlueFormula.make_LambdaExpressionc                 C   sD   t |tsJ t |jtsJ | | |jj| jt|j	| j	S r5   )
r   r   r   r   r   r0   r;   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"   r-   Zcompile_posr   r   get)r%   counterZcompiled_glueZ	new_formsr&   r&   r'   compilen   s   
zGlueFormula.compilec                 C   s   |  | j | j | jS r5   )r   r   r-   r"   r#   r%   r&   r&   r'   r-   y   s   zGlueFormula.simplifyc                 C   s$   | j |j ko| j|jko| j|jkS r5   )r   r   r"   r?   r&   r&   r'   __eq__~   s
   

zGlueFormula.__eq__c                 C   s
   | |k S r5   r&   r?   r&   r&   r'   __ne__   r=   zGlueFormula.__ne__c                 C   s   t | t |k S r5   r   r?   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 r5   rH   ).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&   rE   r&   r&   r'   __repr__   r9   zGlueFormula.__repr__r5   )__name__
__module____qualname__r(   r1   r8   r0   rA   rD   r-   rF   rG   rI   rR   rT   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 r5   )filenamefile_encoding	read_file)r%   rY   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)formatr\   zfile:r   #rJ         (),z&Formula syntax is incorrect for entry []c                 s   s    | ]}|  V  qd S r5   )strip)rK   rr&   r&   r'   rM      s    
z%GlueDict.read_file.<locals>.<genexpr>)clearnltkdataloadrY   rZ   LookupError
splitlinesrg   lensplit	enumerateappendr   rL   	frozensetextend)r%   Zempty_firstcontentsr3   lineslinepartsZglue_formulasZparen_countZtuple_startZtuple_commarelationshipsicZmeaning_termZ	glue_termZ	rel_startZrel_endZstart_inheritanceZend_inheritanceZsemZ	supertypeZrelsr"   r&   r&   r'   r[      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 rS   ra   z:  r`   z : %s
)ro   )r%   rQ   posZstr_posZrelsetrz   gfr&   r&   r'   rR     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   lookuprt   )r%   depgraphnoderC   verbosetopZdepListrootglueformulasZdep_idxr4   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_optionro   KeyError#get_glueformulas_from_semtype_entry)r%   r   r   rC   Zsemtype_namessemtyper7   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
setdefaultrr   )r%   r   r   r   Zheadnoder   Z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rK   r4   r   r&   r'   rM   ]  s    z2GlueDict._lookup_semtype_option.<locals>.<genexpr>r   )rs   r   r   r   r   r   ro   )r%   r   r   r   ry   r   
best_matchZ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 )Nra   )get_GlueFormula_factoryget_meaning_formularo   r   initialize_labelsr"   rB   rr   )r%   r   r   r   r   rC   r   Z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%   Z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   ZAtomicExpressionfind_label_namer7   r   isupperr
   ZConstantExpressionr>   r   r.   Z
consequent)r%   exprr   r   unique_indexr7   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   ra   superr   fvz%svrh   z%srvarr   ZconjabZconjb)rL   r   r   r   
ValueError	get_labelupper)	r%   r7   r   r   r   dotZ
before_dotZ	after_dotZ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hrz   jklmnopqrh   stur   wxyzr   r   r{   dr3   ra      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   ra   z&'{}' should only have one feature '{}')r   r   r   ro   r   r^   )r%   r   r   r   r   r&   r   r'   r     s   zGlueDict.lookup_uniquec                 C      t S r5   )r   rE   r&   r&   r'   r        z GlueDict.get_GlueFormula_factoryr5   )T)NNF)rU   rV   rW   r(   r[   rR   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   rX      s     

u
	$+rX   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	depparserrj   r   proversemtype_fileospathrO   )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   trainZtrain_from_filerj   rk   findr   r   rO   )r%   Z	depgraphsr&   r&   r'   train_depparser/  s   zGlue.train_depparserc                 C   s(   g }|  |D ]
}|| | q|S r5   )parse_to_compiledrt   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 r5   )ro   dictpopr"   r-   r   r   r>   r,   bindingsZBindingDictr.   Zunifyr#   rr   r1   r+   ZUnificationExceptionr   _add_to_reading_list)r%   r   r   Zagenda_lengthZatomicsZ
nonatomicscurZ	glue_simpkeyr   ZatomicZ	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printrr   )r%   ZglueformulaZreading_listZadd_readingreadingr3   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)rK   dgrE   r&   r'   r         z*Glue.parse_to_compiled.<locals>.<listcomp>c                    r   r&   )gfl_to_compiled)rK   gflrE   r&   r'   r     r   )	dep_parse)r%   r   Zgflsr&   rE   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.parser   get_pos_taggerZ_trainedr   r!   r   )r%   r   r   r&   r&   r'   r     s   

zGlue.dep_parsec                 C   s   |   |S r5   )get_glue_dictr   )r%   r   r&   r&   r'   r     s   zGlue.depgraph_to_gluec                 C   
   t | jS r5   )rX   r   rE   r&   r&   r'   r     r=   zGlue.get_glue_dictc                 C   sH   t  }g }|D ]
}||| q| jr"td |D ]}t| q|S )NzCompiled Glue Premises:)r   rt   rD   r   r   )r%   r   index_counterZreturn_listr   Z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]+)?$ZCD)z(The|the|A|a|An|an)$AT)z.*able$JJ)z.*ness$NN)z.*ly$ZRB)z.*s$ZNNS)z.*ing$ZVBG)z.*ed$ZVBD)z.*r  news)
categories)backoff)z(A|a|An|an)$r   )z(Every|every|All|all)$r   )Znltk.corpusr   r   Ztagged_sentsr   r   r   )r%   r   Zregexp_taggerZbrown_trainZunigram_taggerZbigram_taggerZtrigram_taggerZmain_taggerr&   r&   r'   r     s   zGlue.get_pos_taggerNFNFr5   )rU   rV   rW   r(   r   r   r   r   r   r   r   r   r   r   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   ZDrtExpressionr   r   r   r   r   r    r!   r"   r   r#   r$   r&   r&   r'   r(     s*   


zDrtGlueFormula.__init__c                 C   s
   t |S r5   )r   ZDrtVariableExpressionr6   r&   r&   r'   r8     r=   z&DrtGlueFormula.make_VariableExpressionc                 C   s   t ||S r5   )r   ZDrtLambdaExpressionr:   r&   r&   r'   r0     s   z$DrtGlueFormula.make_LambdaExpressionr5   )rU   rV   rW   r(   r8   r0   r&   r&   r&   r'   r    s    
r  c                   @   s   e Zd Zdd ZdS )DrtGlueDictc                 C   r   r5   )r  rE   r&   r&   r'   r     r   z#DrtGlueDict.get_GlueFormula_factoryN)rU   rV   rW   r   r&   r&   r&   r'   r    s    r  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   rO   r   r(   )r%   r   r   r   r   r&   r&   r'   r(     s
   zDrtGlue.__init__c                 C   r   r5   )r  r   rE   r&   r&   r'   r     r=   zDrtGlue.get_glue_dictr  )rU   rV   rW   r(   r   r&   r&   r&   r'   r	    s    
	r	  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   r   )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)$ZNNP)zN^(sees|eats|chases|believes|gives|sleeps|chases|persuades|tries|seems|leaves)$VB)z!^(go|order|vanish|find|approach)$r
  )z^(a)$r   )z	^(every)$r   )z.^(sandwich|man|dog|pizza|unicorn|cat|senator)$r  )z^(big|gray|former)$r  )z^(him|himself)$ZPRPr   F)r   r   r*   z[[[Example z]]]  r|   )	r   r   r   r   r   rq   r   rp   r-   )	Zshow_exampler   Zexamplesr   r   r"   rz   r   r   r&   r&   r'   demo  s    
r  __main__)r*   )r   	itertoolsr   rj   Znltk.internalsr   Znltk.semr   r   Znltk.sem.logicr   r   r   r	   r
   Znltk.tagr   r   r   r   r   r   r   r   rX   r   r  r  r	  r  rU   r&   r&   r&   r'   <module>   s:   	u    @"
2
