o
    i                     @   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	   G/var/www/edux/Edux_v2/venv/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   	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 )rel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$   noden2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   	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punctr0   r1      VB   Dtense)PASTrG   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   r5   _make_labelgetlabelparentr   r   from_iterabler*   r>   )	r-   r   label_counterrN   fstructr0   r1   childrenchildr	   r?   r
   r>   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
   rK      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_formatrv   r	   r	   r
   rt      s   zFStructure.__str__rE   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   rE   z
{}{} {} z

{}{} '{}'z
{}{} {{{}}}z
%srC   r2   ])rM   	NameErrorr5   r6   r7   r   r3   formatrx   r8   r9   joinr:   )r   indentaccumr<   r   next_indentr	   r	   r
   rx      s@   


zFStructure.pretty_formatr   )NN)rE   )__name__
__module____qualname__r   r   r   r   r   r   r(   staticmethodr@   r>   rK   rw   rt   rx   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   dg1dg2dg3dg4	depgraphsdgr	   r	   r
   demo_read_depgraph   s"   
r   __main__N)	itertoolsr   nltk.internalsr   r   r   r   r   r	   r	   r	   r
   <module>   s    K,
