U
    e.v                     @   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dddg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re  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r4|| _ntd||jf t|trbt	 
|| _n&t|tjrv|| _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&   N/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/nltk/sem/glue.py__init__%   s*    


zGlueFormula.__init__c              
   C   s   | j |j @ r&td|  d| dn| j |j B }zt| j|j|j }W nF tjk
r } z&td|   d|  d|W 5 d}~X Y nX |j}|r| j jjddd D ]}| 	t
d| |}q| 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   ?   s8      

 zGlueFormula.applytoc                 C   s   t |S N)r
   r%   namer&   r&   r'   make_VariableExpression`   s    z#GlueFormula.make_VariableExpressionc                 C   s
   t ||S r5   )r   r%   variabletermr&   r&   r'   r0   c   s    z!GlueFormula.make_LambdaExpressionc                 C   sD   t |tstt |jtst| | |jj| jt	|j
| j
S r5   )r   r   AssertionErrorr   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__   s    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t| j d| j }| jrN|dddd t| jD  d 7 }|S )N : z : {z, c                 s   s   | ]}t |V  qd S r5   rG   ).0indexr&   r&   r'   	<genexpr>   s     z&GlueFormula.__str__.<locals>.<genexpr>})r   r#   r   r<   r   r"   joinsorted)r%   accumr&   r&   r'   __str__   s     zGlueFormula.__str__c                 C   s   d|  S )N%sr&   rD   r&   r&   r'   __repr__   s    zGlueFormula.__repr__)N)N)__name__
__module____qualname__r(   r1   r8   r0   r@   rC   r-   rE   rF   rH   rQ   rS   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%   rX   encodingr&   r&   r'   r(      s    zGlueDict.__init__Tc                 C   st  |r|    ztjj| jd| jd}W nZ tk
r } z<ztjjd| j d| jd}W n tk
rn   |Y nX W 5 d }~X Y nX | }|D ]}| }t	|sq|d dkrq|
dd}g }d}d}	d}
d }t	|dkrt|d D ]\}}|d	kr|dkr|d }	|d7 }q|d
krl|d8 }|dkr|d |	|
 }|d |
d | }|||g q|dkr|dkr|}
q|dkr|dkrtd|  qqt	|dkr|d dd }|d d}||krt }n$tdd |d || 
dD }zH|d d	}|d d
}|d d |  }|d |d | }W n   |d  }d }Y nX || kri | |< |d kr"|r| | D ]P}|| | krg | | |< | | | }| | | | | | | | qn,d | | krg | | d < | | d  | q|| | kr<g | | |< |r\| | | | | |  | | | | qd S )Ntext)formatr[   zfile:r   #rI         (),z&Formula syntax is incorrect for entry []c                 s   s   | ]}|  V  qd S r5   )strip)rJ   rr&   r&   r'   rL      s    z%GlueDict.read_file.<locals>.<genexpr>)clearnltkdataloadrX   rY   LookupError
splitlinesrf   lensplit	enumerateappendr   rK   	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'   rZ      s      
  

 




 




zGlueDict.read_filec                 C   s   d}| D ]}d| }| | D ]}d}| | | D ]n}|dkrJ||d 7 }n|dt |d  7 }|d| 7 }|r|t | | | kr|d| 7 }|d7 }|d7 }q0qq|S )	N rR   r`   z:  r_   z : %s
)rn   )r%   rP   posZstr_posZrelsetry   gfr&   r&   r'   rQ     s    zGlueDict.__str__Fc              	   C   s   |d krH|j d }tt|d  }|j |d  }| ||t |S | |||}t|d  D ]$}	|j |	 }
|| ||
|| qh|S )Nr   deps)	nodeslistr   from_iterablevaluesto_glueformula_listr   lookuprs   )r%   depgraphnoderB   verbosetopZdepListrootglueformulasZdep_idxr4   r&   r&   r'   r   &  s    

zGlueDict.to_glueformula_listc                 C   s   |  |}d }|D ]}|| kr| | } q,q|d kr8g S | || | |||}t|sxt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_optionrn   KeyError#get_glueformulas_from_semtype_entry)r%   r   r   rB   Zsemtype_namessemtyper7   r   r&   r&   r'   r   7  s.    
    zGlueDict.lookupc                 C   sb   |d   }|dkr^|j|d  }| d||}|d }|d |g  |d | |d  d S )Nr   mainheadsubjr   address)lowerr   lookup_unique
setdefaultrq   )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 nj tk
r   t  }t|d h D ] }t|t|krT||k rT|}qT|sd |krd }nY d S || }Y nX |S )Nc                 3   s6   | ].} j | d   tkr j | d   V  qdS )r   N)r   r   OPTIONAL_RELATIONSHIPSrJ   r4   r   r&   r'   rL   ]  s   z2GlueDict._lookup_semtype_option.<locals>.<genexpr>r   )rr   r   r   r   r   r   rn   )r%   r   r   r   rx   r   
best_matchZrelset_optionr&   r   r'   r   \  s&    zGlueDict._lookup_semtype_optionc                 C   s`   |d   }|d   }|dkr>|tkr2t| gS td gS n|dkrR|d |gS |d gS dS )zj
        Based on the node, return a list of plausible semtypes in order of
        plausibility.
        r   r   specr   )r   r   r   N)r   SPEC_SEMTYPES)r%   r   r   r   r&   r&   r'   r   z  s    
zGlueDict.get_semtypesc                 C   sx   g }|   }|D ]b\}}	|| |||	}
t|s:||
_n| t|d  |
_| |
j||| |
_||
 q|S )Nr`   )get_GlueFormula_factoryget_meaning_formularn   r   initialize_labelsr"   rA   rq   )r%   r   r   r   r   rB   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   sp   t |tjrD| |j |||}|d  r8t|S t|S n(t	| 
|j|||| 
|j|||S d 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   sd  zl| d}|d | }||d d  }|dkrL| ||j|d  ||W S | || |||||W S W  n tk
r^   | |}|dkr| Y S |dkrd|  Y S |dkrd	|  Y S |dkr| |j|d   Y S |d
k r|  |  Y S |dkr | | d|| Y S |dkrB| | d|| Y S | | ||| Y S Y nX d S )Nr   r`   superr   fvz%svrg   z%srvarr   ZconjabZconjb)rK   r   r   r   
ValueError	get_labelupper)	r%   r7   r   r   r   dotZ
before_dotZ	after_dotZlblr&   r&   r'   r     sD    
   



zGlueDict.find_label_namec                 C   sp   |d }dddddddd	d
dddddddddddddddddg|d  }t |d }|dkrh|t| S |S d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hry   jklmnopqrg   stur   wxyzr   r   rz   dr3   r`      r   N)intr   )r%   r   valueletternumr&   r&   r'   r     sD    zGlueDict.get_labelc                    sr    fddt |d  D }t|dkrDtd|d n*t|dkrftd|d n|d S 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   r`   z&'{}' should only have one feature '{}'N)r   r   r   rn   r   r]   )r%   r   r   r   r   r&   r   r'   r     s    zGlueDict.lookup_uniquec                 C   s   t S r5   )r   rD   r&   r&   r'   r     s    z GlueDict.get_GlueFormula_factory)N)T)NNF)rT   rU   rV   r(   rZ   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   rW      s   

u
	$+rW   c                   @   sh   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   sH   || _ || _|| _ddlm} | | _|r2|| _ntj	ddd| _d S )Nr   )Prover9grammarssample_grammarszglue.semtype)
r   remove_duplicates	depparserri   r   proversemtype_fileospathrN   )r%   r   r   r   r   r   r&   r&   r'   r(     s      zGlue.__init__c              	   C   s6   |r| j | n | j tjtjddd d S )Nr   r   zglue_train.conll)	r   trainZtrain_from_fileri   rj   findr   r   rN   )r%   Z	depgraphsr&   r&   r'   train_depparser/  s    zGlue.train_depparserc                 C   s(   g }|  |D ]}|| | q|S r5   )parse_to_compiledrs   get_readings)r%   sentencereadingsagendar&   r&   r'   parse_to_meaning9  s    zGlue.parse_to_meaningc              
   C   s`  g }t |}t }t }|r| }|j }t|tjr|D ]}zxt|jtjr`|jj	}	nt
 }	|j||	 || D ]<}
|j|
j@ s~z|||
 W q~ tjk
r   Y q~X q~W qB tjk
r   Y qBX qBz||j | W n" tk
r   |g||j< Y nX q|D ]}|| D ]}znt|jtjrB|jj	}	nt
 }	|||	 |j|j@ sz||| W n tjk
r   Y nX W n tjk
r   Y nX q"qz|| | W q tk
r   |g||< Y qX q|D ]2}|| D ]"}t |j|kr| || qq|D ]2}|| D ]"}t |j|kr4| || q4q(|S r5   )rn   dictpopr"   r-   r   r   r=   r,   bindingsZBindingDictr.   Zunifyr#   rq   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   ?  sz    
 

 


zGlue.get_readingsc                 C   st   d}| j r`|D ]P}z||j| jr.d}W  q`W q tk
r\ } ztd| W 5 d }~X Y qX q|rp||j d S )NTFz2Error when checking logical equality of statements)r   equivr   r   	Exceptionprintrq   )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                    s   g | ]}  |qS r&   )depgraph_to_glue)rJ   dgrD   r&   r'   r     s     z*Glue.parse_to_compiled.<locals>.<listcomp>c                    s   g | ]}  |qS r&   )gfl_to_compiled)rJ   gflrD   r&   r'   r     s     )	dep_parse)r%   r   Zgflsr&   rD   r'   r     s    zGlue.parse_to_compiledc                 C   sH   | j dkr&ddlm} ||  d| _ | j js6|   | 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   s
   t | jS r5   )rW   r   rD   r&   r&   r'   r     s    zGlue.get_glue_dictc                 C   sH   t  }g }|D ]}||| q| jrDtd |D ]}t| q6|S )NzCompiled Glue Premises:)r   rs   rC   r   r   )r%   r   index_counterZreturn_listr   Zcgfr&   r&   r'   r     s    
zGlue.gfl_to_compiledc              
   C   sj   ddl m} tddddddd	d
dg	}|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)NFNF)N)rT   rU   rV   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r8|| _ntd||jf t|trft	
 || _n&t|t	jrz|| _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     s    z&DrtGlueFormula.make_VariableExpressionc                 C   s   t ||S r5   )r   ZDrtLambdaExpressionr9   r&   r&   r'   r0     s    z$DrtGlueFormula.make_LambdaExpression)N)rT   rU   rV   r(   r8   r0   r&   r&   r&   r'   r     s   
r   c                   @   s   e Zd Zdd ZdS )DrtGlueDictc                 C   s   t S r5   )r   rD   r&   r&   r'   r     s    z#DrtGlueDict.get_GlueFormula_factoryN)rT   rU   rV   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   rN   r   r(   )r%   r   r   r   r   r&   r&   r'   r(     s      zDrtGlue.__init__c                 C   s
   t | jS r5   )r  r   rD   r&   r&   r'   r     s    zDrtGlue.get_glue_dict)NFNF)rT   rU   rV   r(   r   r&   r&   r&   r'   r    s          
	r  r*   c           	   	   C   s   ddl m} ddddddg}td	 td
dddddddg}||d}t|dd}t|D ]T\}}|| ksr| dkrZtd| d|  || D ]}t|  qtd qZd 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   rp   r   ro   r-   )	Zshow_exampler   Zexamplesr   r   r"   ry   r   r   r&   r&   r'   demo  s8    
r  __main__)r*   )r   	itertoolsr   ri   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   rW   r   r   r  r  r  rT   r&   r&   r&   r'   <module>	   s6   	
u    @"
2