3
dU                 @   s0   d Z ddlmZ ddlmZ G dd deZdS )a(  
Multi-Word Expression Tokenizer

A ``MWETokenizer`` takes a string which has already been divided into tokens and
retokenizes it, merging multi-word expressions into single tokens, using a lexicon
of MWEs:


    >>> from nltk.tokenize import MWETokenizer

    >>> tokenizer = MWETokenizer([('a', 'little'), ('a', 'little', 'bit'), ('a', 'lot')])
    >>> tokenizer.add_mwe(('in', 'spite', 'of'))

    >>> tokenizer.tokenize('Testing testing testing one two three'.split())
    ['Testing', 'testing', 'testing', 'one', 'two', 'three']

    >>> tokenizer.tokenize('This is a test in spite'.split())
    ['This', 'is', 'a', 'test', 'in', 'spite']

    >>> tokenizer.tokenize('In a little or a little bit or a lot in spite of'.split())
    ['In', 'a_little', 'or', 'a_little_bit', 'or', 'a_lot', 'in_spite_of']

    )
TokenizerI)Triec               @   s*   e Zd ZdZd
ddZdd Zdd	 ZdS )MWETokenizerzhA tokenizer that processes tokenized text and merges multi-word expressions
    into single tokens.
    N_c             C   s   |sg }t || _|| _dS )a  Initialize the multi-word tokenizer with a list of expressions and a
        separator

        :type mwes: list(list(str))
        :param mwes: A sequence of multi-word expressions to be merged, where
            each MWE is a sequence of strings.
        :type separator: str
        :param separator: String that should be inserted between words in a multi-word
            expression token. (Default is '_')

        N)r   _mwes
_separator)selfZmwes	separator r
   1/tmp/pip-build-v9q4h5k9/nltk/nltk/tokenize/mwe.py__init__(   s    
zMWETokenizer.__init__c             C   s   | j j| dS )a  Add a multi-word expression to the lexicon (stored as a word trie)

        We use ``util.Trie`` to represent the trie. Its form is a dict of dicts.
        The key True marks the end of a valid MWE.

        :param mwe: The multi-word expression we're adding into the word trie
        :type mwe: tuple(str) or list(str)

        :Example:

        >>> tokenizer = MWETokenizer()
        >>> tokenizer.add_mwe(('a', 'b'))
        >>> tokenizer.add_mwe(('a', 'b', 'c'))
        >>> tokenizer.add_mwe(('a', 'x'))
        >>> expected = {'a': {'x': {True: None}, 'b': {True: None, 'c': {True: None}}}}
        >>> tokenizer._mwes == expected
        True

        N)r   insert)r   Zmwer
   r
   r   add_mwe9   s    zMWETokenizer.add_mwec             C   s   d}t |}g }x||k r|| | jkr|}| j}d}x||k rp|| |krp|||  }|d }tj|kr8|}q8W |dkr~|}tj|ks|dkr|j| jj|||  |}q|j||  |d7 }q|j||  |d7 }qW |S )a  

        :param text: A list containing tokenized text
        :type text: list(str)
        :return: A list of the tokenized text with multi-words merged together
        :rtype: list(str)

        :Example:

        >>> tokenizer = MWETokenizer([('hors', "d'oeuvre")], separator='+')
        >>> tokenizer.tokenize("An hors d'oeuvre tonight, sir?".split())
        ['An', "hors+d'oeuvre", 'tonight,', 'sir?']

        r      r   r   )lenr   r   ZLEAFappendr   join)r   textinresultjZtrieZ
last_matchr
   r
   r   tokenizeO   s.    


zMWETokenizer.tokenize)Nr   )__name__
__module____qualname____doc__r   r   r   r
   r
   r
   r   r   #   s   
r   N)r   Znltk.tokenize.apir   Z	nltk.utilr   r   r
   r
   r
   r   <module>   s   