3
d$                 @   sB   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 )	    )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"   || krg | |< | | j | 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	   ,/tmp/pip-build-v9q4h5k9/nltk/nltk/sem/lfg.py
safeappend   s    zFStructure.safeappendc             C   s   t j| |j | d S )N)dict__setitem__lower)r   r   valuer	   r	   r
   r      s    zFStructure.__setitem__c             C   s   t j| |j S )N)r   __getitem__r   )r   r   r	   r	   r
   r      s    zFStructure.__getitem__c             C   s   t j| |j S )N)r   __contains__r   )r   r   r	   r	   r
   r      s    zFStructure.__contains__c             C   s   | j  }|j|S )N)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}| j|dd xj|j D ]^\}}xTdd |j D D ]>}|d |krL|d }|d j|g  |d | j|d	  qLW q0W |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|| jd | jd ||d xt| D ]}xt| | D ]}t|trh|j||| qJt|trt |}|| j||d |d ||d qJt|trx(|D ]}|j||| qW qJt	d| qJW q8W d S )Nr   r   )r   wordtagr   r   z0feature %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   s0    




zFStructure._to_depgraphc             C   s   t j| j| S )N)r   _read_depgraphr%   )r   r	   r	   r
   read_depgraph]   s    zFStructure.read_depgraphc       	         s   |s
t  }| d j dkr*| d | d fS t }d |_tj|j |_||_| d | d  }}|d d dkr|dd d	kr|jd
d ||d d f|_|js||f|_ fddt	j
| d j D }x(|D ] }|j|d tj| || qW |S d S )Nr   specpunctr'   r(      ZVB   DtensePASTc                s   g | ]} j | qS r	   )r    )r   idx)r   r	   r
   
<listcomp>{   s   z-FStructure._read_depgraph.<locals>.<listcomp>r   )r5   r6   )r;   r:   )r   r   r   r+   _make_labelgetlabelparentr   r   from_iterabler#   r3   )	r&   r   Zlabel_counterrA   Zfstructr'   r(   childrenchildr	   )r   r
   r3   a   s,    


zFStructure._read_depgraphc             C   sh   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r`|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
        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   N)intstr)r   letternumr	   r	   r
   r>      s>    	
zFStructure._make_labelc             C   s   | j  jddS )N
 )__str__replace)r   r	   r	   r
   __repr__   s    zFStructure.__repr__c             C   s   | j  S )N)pretty_format)r   r	   r	   r
   re      s    zFStructure.__str__r8   c             C   s2  yd| j  }W n tk
r&   d}Y nX y|d| jd  7 }W n tk
rR   Y nX xt| D ]}x| | D ]}t|tr|t| d t| j  }|djd| ||j|7 }qlt|t	r|djd| ||d 7 }qlt|t
r|d	jd| |d
d|t| d   j|7 }qltd| qlW q^W |d S )Nz%s:[[z	pred '%s'r   r8   z
{}{} {} z

{}{} '{}'z
{}{} {{{}}}z
%sr7   z0feature %s is not an FStruct, a list, or a tuple])r@   	NameErrorr+   r,   r-   r   r)   formatrh   r.   r/   joinr0   )r   indentaccumr2   r   Znext_indentr	   r	   r
   rh      s4    


$zFStructure.pretty_format)N)NN)r8   )__name__
__module____qualname__r   r   r   r   r   r   r!   staticmethodr4   r3   r>   rg   re   rh   r	   r	   r	   r
   r      s   	
$$*r   c              C   sX   ddl m}  | d}| d}| d}| d}||||g}x|D ]}ttj| q>W 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   r4   )r   Zdg1Zdg2Zdg3Zdg4Z	depgraphsZdgr	   r	   r
   demo_read_depgraph   s    

rv   __main__N)	itertoolsr   Znltk.internalsr   r   r   rv   rq   r	   r	   r	   r
   <module>	   s    K,