
    g$                     ,    d dl mZmZ  G d de      Zy)    )ABCMetaabstractmethodc                       e Zd ZdZdZdZddZd Zed        Z	d Z
edd       Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zeed               Zy)Featurea  
    An abstract base class for Features. A Feature is a combination of
    a specific property-computing method and a list of relative positions
    to apply that method to.

    The property-computing method, M{extract_property(tokens, index)},
    must be implemented by every subclass. It extracts or computes a specific
    property for the token at the current index. Typical extract_property()
    methods return features such as the token text or tag; but more involved
    methods may consider the entire sequence M{tokens} and
    for instance compute the length of the sentence the token belongs to.

    In addition, the subclass may have a PROPERTY_NAME, which is how
    it will be printed (in Rules and Templates, etc). If not given, defaults
    to the classname.

    znltk.tbl.FeatureNc           
         d| _         |1t        t        |D ch c]  }t        |       c}            | _         n)	 ||kD  rt        t        t        ||dz               | _         | j                  j                  xs | j                  j                  | _	        yc c}w # t        $ r!}t        dj                  ||            |d}~ww xY w)al  
        Construct a Feature which may apply at C{positions}.

        >>> # For instance, importing some concrete subclasses (Feature is abstract)
        >>> from nltk.tag.brill import Word, Pos

        >>> # Feature Word, applying at one of [-2, -1]
        >>> Word([-2,-1])
        Word([-2, -1])

        >>> # Positions need not be contiguous
        >>> Word([-2,-1, 1])
        Word([-2, -1, 1])

        >>> # Contiguous ranges can alternatively be specified giving the
        >>> # two endpoints (inclusive)
        >>> Pos(-3, -1)
        Pos([-3, -2, -1])

        >>> # In two-arg form, start <= end is enforced
        >>> Pos(2, 1)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "nltk/tbl/template.py", line 306, in __init__
            raise TypeError
        ValueError: illegal interval specification: (start=2, end=1)

        :type positions: list of int
        :param positions: the positions at which this features should apply
        :raises ValueError: illegal position specifications

        An alternative calling convention, for contiguous positions only,
        is Feature(start, end):

        :type start: int
        :param start: start of range where this feature should apply
        :type end: int
        :param end: end of range (NOTE: inclusive!) where this feature should apply
        N   z2illegal interval specification: (start={}, end={}))	positionstuplesortedint	TypeErrorrange
ValueErrorformat	__class__PROPERTY_NAME__name__)selfr	   endies        E/var/www/openai/venv/lib/python3.12/site-packages/nltk/tbl/feature.py__init__zFeature.__init__#   s    P ;"69*E9a3q69*E#FGDN
s?#O!&uYa'@!A "^^99TT^^=T=T +F   HOO!3 	s   B(B 	C&CCc                     | j                   S N)r	   r   s    r   encode_json_objzFeature.encode_json_obj^   s    ~~    c                     |} | |      S r    )clsobjr	   s      r   decode_json_objzFeature.decode_json_obja   s    	9~r   c                 `    | j                   j                   dt        | j                        dS )N())r   r   listr	   r   s    r   __repr__zFeature.__repr__f   s*    ..))*!D,@+C1EEr   c                     t        d |D              st        d|       fd|D        }|D cg c]  }|rd|v r
 | |       c}S c c}w )a  
        Return a list of features, one for each start point in starts
        and for each window length in winlen. If excludezero is True,
        no Features containing 0 in its positions will be generated
        (many tbl trainers have a special representation for the
        target feature at [0])

        For instance, importing a concrete subclass (Feature is abstract)

        >>> from nltk.tag.brill import Word

        First argument gives the possible start positions, second the
        possible window lengths

        >>> Word.expand([-3,-2,-1], [1])
        [Word([-3]), Word([-2]), Word([-1])]

        >>> Word.expand([-2,-1], [1])
        [Word([-2]), Word([-1])]

        >>> Word.expand([-3,-2,-1], [1,2])
        [Word([-3]), Word([-2]), Word([-1]), Word([-3, -2]), Word([-2, -1])]

        >>> Word.expand([-2,-1], [1])
        [Word([-2]), Word([-1])]

        A third optional argument excludes all Features whose positions contain zero

        >>> Word.expand([-2,-1,0], [1,2], excludezero=False)
        [Word([-2]), Word([-1]), Word([0]), Word([-2, -1]), Word([-1, 0])]

        >>> Word.expand([-2,-1,0], [1,2], excludezero=True)
        [Word([-2]), Word([-1]), Word([-2, -1])]

        All window lengths must be positive

        >>> Word.expand([-2,-1], [0])
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "nltk/tag/tbl/template.py", line 371, in expand
            :param starts: where to start looking for Feature
        ValueError: non-positive window length in [0]

        :param starts: where to start looking for Feature
        :type starts: list of ints
        :param winlens: window lengths where to look for Feature
        :type starts: list of ints
        :param excludezero: do not output any Feature with 0 in any of its positions.
        :type excludezero: bool
        :returns: list of Features
        :raises ValueError: for non-positive window lengths
        c              3   &   K   | ]	  }|d kD    yw)r   Nr    ).0xs     r   	<genexpr>z!Feature.expand.<locals>.<genexpr>   s     *'Q1q5's   znon-positive window length in c              3   l   K   | ]+  }t        t              |z
  d z         D ]  }|||z      - yw)r   N)r   len)r+   wr   startss      r   r-   z!Feature.expand.<locals>.<genexpr>   s:     UA%FaRS@S:TQfQQ:Ts   14r   )allr   )r!   r1   winlensexcludezeroxsr,   s    `    r   expandzFeature.expandi   sU    l *'**=gYGHHUU "C1;16ACCCs
   A

A
c                     | j                   |j                   u xr+ t        | j                        t        |j                        k\  S )aQ  
        Return True if this Feature always returns True when other does

        More precisely, return True if this feature refers to the same property as other;
        and this Feature looks at all positions that other does (and possibly
        other positions in addition).

        #For instance, importing a concrete subclass (Feature is abstract)
        >>> from nltk.tag.brill import Word, Pos

        >>> Word([-3,-2,-1]).issuperset(Word([-3,-2]))
        True

        >>> Word([-3,-2,-1]).issuperset(Word([-3,-2, 0]))
        False

        #Feature subclasses must agree
        >>> Word([-3,-2,-1]).issuperset(Pos([-3,-2]))
        False

        :param other: feature with which to compare
        :type other: (subclass of) Feature
        :return: True if this feature is superset, otherwise False
        :rtype: bool


        )r   setr	   r   others     r   
issupersetzFeature.issuperset   s=    8 ~~0 
S5HCOOM
 6
 	
r   c                     t        | j                  |j                  u xr+ t        | j                        t        |j                        z        S )a  
        Return True if the positions of this Feature intersects with those of other

        More precisely, return True if this feature refers to the same property as other;
        and there is some overlap in the positions they look at.

        #For instance, importing a concrete subclass (Feature is abstract)
        >>> from nltk.tag.brill import Word, Pos

        >>> Word([-3,-2,-1]).intersects(Word([-3,-2]))
        True

        >>> Word([-3,-2,-1]).intersects(Word([-3,-2, 0]))
        True

        >>> Word([-3,-2,-1]).intersects(Word([0]))
        False

        #Feature subclasses must agree
        >>> Word([-3,-2,-1]).intersects(Pos([-3,-2]))
        False

        :param other: feature with which to compare
        :type other: (subclass of) Feature
        :return: True if feature classes agree and there is some overlap in the positions they look at
        :rtype: bool
        )boolr   r8   r	   r9   s     r   
intersectszFeature.intersects   s@    : NNeoo- ;DNN#c%//&::
 	
r   c                 h    | j                   |j                   u xr | j                  |j                  k(  S r   )r   r	   r9   s     r   __eq__zFeature.__eq__   s'    ~~0VT^^u5VVr   c                     | j                   j                  |j                   j                  k  xs | j                  |j                  k  S r   )r   r   r	   r9   s     r   __lt__zFeature.__lt__   s:    NN##eoo&>&>> - NNU__,		
r   c                     | |k(   S r   r    r9   s     r   __ne__zFeature.__ne__   s    EM""r   c                     || k  S r   r    r9   s     r   __gt__zFeature.__gt__   s    t|r   c                     | |k   S r   r    r9   s     r   __ge__zFeature.__ge__   s    %<r   c                     | |k  xs | |k(  S r   r    r9   s     r   __le__zFeature.__le__   s    e|,tu},r   c                      y)a@  
        Any subclass of Feature must define static method extract_property(tokens, index)

        :param tokens: the sequence of tokens
        :type tokens: list of tokens
        :param index: the current index
        :type index: int
        :return: feature value
        :rtype: any (but usually scalar)
        Nr    )tokensindexs     r   extract_propertyzFeature.extract_property   s    r   r   )F)r   
__module____qualname____doc__json_tagr   r   r   classmethodr#   r(   r6   r;   r>   r@   rB   rD   rF   rH   rJ   staticmethodr   rN   r    r   r   r   r      s    $ "HM9Uv  F 8D 8Dt
@ 
HW
# - 
  
r   r   )	metaclassN)abcr   r   r   r    r   r   <module>rW      s    (~ ~r   