o
    rZh                     @   sF   d dl mZ d dlmZ G dd deZdd Zedkr!e  dS dS )	    )chain)Counterc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdd Z	e
dd Ze
dddZe
dd Zdd Zdd ZdddZdS ) 
FStructurec                 C   s"   || vrg | |< | |  | dS )zo
        Append 'item' to the list at 'key'.  If no list exists for 'key', then
        construct one.
        N)append)selfkeyitem r	   ;/var/www/auris/lib/python3.10/site-packages/nltk/sem/lfg.py
safeappend   s   zFStructure.safeappendc                 C   s   t | | | d S N)dict__setitem__lower)r   r   valuer	   r	   r
   r      s   zFStructure.__setitem__c                 C      t | | S r   )r   __getitem__r   r   r   r	   r	   r
   r         zFStructure.__getitem__c                 C   r   r   )r   __contains__r   r   r	   r	   r
   r      r   zFStructure.__contains__c                 C   s   |   }||S r   )to_depgraphto_glueformula_list)r   Z	glue_dictdepgraphr	   r	   r
   r   !   s   
zFStructure.to_glueformula_listNc           	      C   s   ddl m} | }|j}| |dd | D ]-\}}dd | D D ]}|d |krC|d }|d |g  |d | |d	  q$q|d
 |_|S )Nr   DependencyGraphROOTc                 s   s     | ]}|d  dkr|V  qdS )relZTOPNr	   ).0nr	   r	   r
   	<genexpr>/   s    z)FStructure.to_depgraph.<locals>.<genexpr>headr   depsaddress   )	nltk.parse.dependencygraphr   nodes_to_depgraphitemsvalues
setdefaultr   root)	r   r   r   r   r%   r"   nodeZn2Zrelationr	   r	   r
   r   %   s   
zFStructure.to_depgraphc           	   
   C   s   t |}|| || jd | jd ||d t| D ]J}t| | D ]A}t|tr2|||| q#t|trMt |}|| ||d |d ||d q#t|tr_|D ]	}|||| qTq#t	d| qd S )Nr   r#   )r"   wordtagr    r   0feature %s is not an FStruct, a list, or a tuple)
lenupdatepredsorted
isinstancer   r&   tuplelist	Exception)	r   r%   r    r   indexfeaturer   Z	new_indexr   r	   r	   r
   r&   9   s@   



	zFStructure._to_depgraphc                 C   s   t | j| S r   )r   _read_depgraphr*   r   r	   r	   r
   read_depgraph]   s   zFStructure.read_depgraphc           	   
      s   |st  }| d  dv r| d | d fS t }d |_t| |_||_| d | d }}|d d dkrN|dd dkrE|d	d
 ||d d f|_|jsV||f|_ fddt	
| d  D }|D ]}||d t| || qh|S )Nr   )specpunctr,   r-      ZVB   Dtense)ZPASTrA   c                    s   g | ]} j | qS r	   )r%   )r   idxr:   r	   r
   
<listcomp>z   s    z-FStructure._read_depgraph.<locals>.<listcomp>r!   )r   r   r   r1   _make_labelgetlabelparentr   r   from_iterabler(   r9   )	r+   r   Zlabel_counterrG   Zfstructr,   r-   childrenchildr	   r:   r
   r9   a   s0   

zFStructure._read_depgraphc                 C   s4   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
        )fghijklmr   opqrstuvwxyzabcder#      r   )intstr)r   letternumr	   r	   r
   rD      s   zFStructure._make_labelc                 C   s   |   ddS )N
 )__str__replacer   r	   r	   r
   __repr__   r   zFStructure.__repr__c                 C   s   |   S r   )pretty_formatrm   r	   r	   r
   rk      s   zFStructure.__str__r?   c                 C   s"  zd| j  }W n ty   d}Y nw z|d| jd  7 }W n	 ty'   Y nw t| D ]`}| | D ]Y}t|trU|t| d t| j  }|dd| |||7 }q2t|t	rh|dd| ||d 7 }q2t|t
r|d	d| |d
d|t| d   |7 }q2td| q,|d S )Nz%s:[[z	pred '%s'r   r?   z
{}{} {} z

{}{} '{}'z
{}{} {{{}}}z
%sr>   r.   ])rF   	NameErrorr1   r2   r3   r   r/   formatro   r4   r5   joinr6   )r   indentaccumr8   r   Znext_indentr	   r	   r
   ro      s@   


zFStructure.pretty_formatr   )NN)r?   )__name__
__module____qualname__r   r   r   r   r   r   r&   staticmethodr;   r9   rD   rn   rk   ro   r	   r	   r	   r
   r      s"    	
$
$
)r   c                  C   sT   ddl m}  | d}| d}| d}| d}||||g}|D ]	}tt| qd S )Nr   r   zEsso       NNP     2       SUB
said       VBD     0       ROOT
the        DT      5       NMOD
Whiting    NNP     5       NMOD
field      NN      6       SUB
started    VBD     2       VMOD
production NN      6       OBJ
Tuesday    NNP     6       VMOD
zUJohn    NNP     2       SUB
sees    VBP     0       ROOT
Mary    NNP     2       OBJ
zWa       DT      2       SPEC
man     NN      3       SUBJ
walks   VB      0       ROOT
zevery   DT      2       SPEC
girl    NN      3       SUBJ
chases  VB      0       ROOT
a       DT      5       SPEC
dog     NN      3       OBJ
)r$   r   printr   r;   )r   Zdg1Zdg2Zdg3Zdg4Z	depgraphsdgr	   r	   r
   demo_read_depgraph   s"   
r~   __main__N)	itertoolsr   Znltk.internalsr   r   r   r~   rx   r	   r	   r	   r
   <module>   s    K,
