B
    >?[l                 @   sf   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 e	G dd de
Zdd Zed	krbe  d
S )    )print_functiondivisionunicode_literals)chain)Counter)python_2_unicode_compatiblec               @   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 | |< | |  | 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   +lib/python3.7/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   s   t | | S )N)r   __getitem__r   )r
   r   r   r   r   r      s    zFStructure.__getitem__c             C   s   t | | S )N)r   __contains__r   )r
   r   r   r   r   r   !   s    zFStructure.__contains__c             C   s   |   }||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}| |dd xj| D ]^\}}xTdd | D D ]>}|d |krL|d }|d |g  |d | |d	  qLW q0W |d
 |_|S )Nr   )DependencyGraphZROOTc             s   s   | ]}|d  dkr|V  qdS )relZTOPNr   ).0nr   r   r   	<genexpr>2   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 xt| D ]}xt| | D ]}t|trh|||| qJt|trt |}|| ||d |d ||d qJt|trx(|D ]}|||| 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$   <   s0    




zFStructure._to_depgraphc             C   s   t | j| S )N)r   _read_depgraphr(   )r   r   r   r   read_depgraph`   s    zFStructure.read_depgraphc       	   
      s   |s
t  }| d  dkr*| d | d fS t }d |_t| |_||_| d | d  }}|d d dkr|dd dkr|d	d
 ||d d f|_|js||f|_ fddt	| d 
  D }x(|D ] }||d t| || qW |S d S )Nr   )specpunctr*   r+      ZVB   Dtense)ZPASTr=   c                s   g | ]} j | qS r   )r#   )r   idx)r   r   r   
<listcomp>}   s    z-FStructure._read_depgraph.<locals>.<listcomp>r   )r   r   r   r.   _make_labelgetlabelparentr   r   r&   r6   )	r)   r   Zlabel_counterrC   Zfstructr*   r+   ZchildrenZchildr   )r   r   r6   d   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   ZletterZnumr   r   r   r@      s>    	
zFStructure._make_labelc             C   s   |   ddS )N
 )Z__unicode__replace)r
   r   r   r   __repr__   s    zFStructure.__repr__c             C   s   |   S )N)pretty_format)r
   r   r   r   __str__   s    zFStructure.__str__r;   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d| |||f 7 }qlt|tr|dd| ||d f 7 }qlt|t	r|d	d| |d
d|t| d   
|f 7 }qltd| qlW q^W |d S )Nz%s:[[z	pred '%s'r   r;   z
%s%s %s z

%s%s '%s'z

%s%s {%s}z
%sr:   z0feature %s is not an FStruct, a list, or a tuple])rB   	NameErrorr.   r/   r0   r   r,   rd   r1   r2   joinr3   )r
   indentZaccumr5   r   Znext_indentr   r   r   rd      s4    


&zFStructure.pretty_format)N)NN)r;   )__name__
__module____qualname__r   r   r   r   r   r   r$   staticmethodr7   r6   r@   rc   re   rd   r   r   r   r   r      s   	
$!*r   c              C   sX   ddl m}  | d}| d}| d}| d}||||g}x|D ]}tt| 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   r7   )r   Zdg1Zdg2Zdg3Zdg4Z	depgraphsZdgr   r   r   demo_read_depgraph   s    

rq   __main__N)Z
__future__r   r   r   	itertoolsr   Znltk.internalsr   Znltk.compatr   r   r   rq   rl   r   r   r   r   <module>   s    H,