
    v5`                         d dl mZ ddlmZ ddlmZ 	 d dlZn# e	$ r d dl
m
Z
 dZY nw xY wg dZ G d	 d
e          Z G d de          Z G d de          Z e            Z e            Z e            ZdS )    )SequenceMatcher   )find_ngrams   )BaseSimilarityN)array)lcsseqlcsstrratcliff_obershelpLCSSeqLCSStrRatcliffObershelpc                   2    e Zd ZdZd
dZd Zd Zd Zd	 ZdS )r   zplongest common subsequence similarity

    https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
    r   NTc                 >    || _         |p| j        | _        || _        d S N)qval_ident	test_funcexternal)selfr   r   r   s       Flib/python3.11/site-packages/textdistance/algorithms/sequence_based.py__init__zLCSSeq.__init__   s"    	"1dk     c                 ~   t           rCt          j        t          |          dz   t                    dz   ft           j                  }n+fdt	          t          |          dz             D             }t          |          D ]~\  }}t                    D ]i\  }}||k    r!||         |         dz   ||dz            |dz   <   ,t          ||dz            |         ||         |dz                      ||dz            |dz   <   jd}t          |          t                    }}|dk    r|dk    r||         |         ||dz
           |         k    r|dz  }nY||         |         ||         |dz
           k    r|dz  }n2||dz
           |dz
           k    sJ ||dz
           |z   }|dz  }|dz  }|dk    r|dk    |S )z
        https://github.com/chrislit/abydos/blob/master/abydos/distance/_lcsseq.py
        http://www.dis.uniroma1.it/~bonifaci/algo/LCSSEQ.py
        http://rosettacode.org/wiki/Longest_common_subsequence#Dynamic_Programming_8
        r   )dtypec           	      X    g | ]&}t          d dgt                    dz   z            'S )Lr   r   )r   len).0_seq2s     r   
<listcomp>z#LCSSeq._dynamic.<locals>.<listcomp>)   s4    WWWQuS1#TQ"788WWWr    r   )numpyzerosr   intrange	enumeratemax)	r   seq1r!   lengthsichar1jchar2results	     `      r   _dynamiczLCSSeq._dynamic    s     	Xk3t99q=#d))a-"@	RRRGGWWWW%D		TUBVBVWWWG "$ 	V 	VHAu%dOO V V5E>>,3AJqMA,=GAEN1q5)),/Aq0A71:aRSeCT,U,UGAEN1q5))	V 4yy#d))11ffaqz!}Aq 111QA'!*QU"333QAE{d1q5k1111a!ev-QQ 1ffa r   c                    t          |          s t          |d                               S  | j        d |D              r"|d         d         }d |D             } | | |z   S  t          |d                               }t          |          D ]D\  }}|d |         |d d         fz   ||dz   d          z   }t	           | | |gt
                    }E|S )Nr   c                     g | ]
}|d          S ) r   ss     r   r"   z%LCSSeq._recursive.<locals>.<listcomp>E   s    555aAbE555r   r4   c                 "    g | ]}|d d         S )Nr4   r5   r6   s     r   r"   z%LCSSeq._recursive.<locals>.<listcomp>G   s     333A3B3333r   r   key)alltyper   r(   r)   r   )r   	sequencescmr,   r7   sss          r   
_recursivezLCSSeq._recursiveB   s   9~~ 	(%4	!%%'''4>5595556 	(!R A33333I4#a''D1  i(( 	- 	-DAq2A2!CRC&+iA.??BTT2YN,,,AAr   c                 l    |sdS  | j         | }t          |          dk    r
 | j        | S  | j        | S )Nr#   r   )_get_sequencesr   r1   rA   r   r=   s     r   __call__zLCSSeq.__call__O   sM     	2'D'3	y>>Q 4=),,"4?I..r   c                 &    t           | |           S r   r   rD   s     r   
similarityzLCSSeq.similarityX       44#$$$r   )r   NT)	__name__
__module____qualname____doc__r   r1   rA   rE   rH   r5   r   r   r   r      so         ! ! ! !
     D  / / /% % % % %r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )r   z(longest common substring similarity
    c                     t          ||          }|                    dt          |          dt          |                    }||j        |j        |j        z            S )N)abr   )_SequenceMatcherfind_longest_matchr   rP   size)r   s1s2matchermatchs        r   	_standartzLCSStr._standart_   sT    "R2...**1c"ggq#b''BB%'57UZ//00r   c                    t          |t                    }t          |          }t          |dd          D ];}t          ||          D ](}d                    |          }|D ]}||vr n	|c c S )< t          |                      S )Nr9   r   r4   r#   )minr   r'   r   joinr<   )r   r=   shortlengthnsubseqseqs          r   _customzLCSStr._customd   s    I3'''Uvq"%% 	" 	"A%eQ// " "$ " "CS(( ) "MMMMM 	" tE{{}}r   c                    t          |          sdS t          |          }|dk    rdS |dk    r|d         S  | j        | }|dk    r0t          t	          t          |                    dk     r
 | j        | S  | j        | S )Nr#   r   r   r      )r;   r   rC   r)   maprY   rb   )r   r=   r^   s      r   rE   zLCSStr.__call__q   s    9~~ 	2YQ;;2Q;;Q<'D'3	Q;;3s3	2233c99!4>9--t|Y''r   c                 &    t           | |           S r   rG   rD   s     r   rH   zLCSStr.similarity   rI   r   N)rJ   rK   rL   rM   rY   rb   rE   rH   r5   r   r   r   r   \   sZ         1 1 1
  ( ( (% % % % %r   r   c                   $    e Zd ZdZd Zd Zd ZdS )r   a+  Ratcliff-Obershelp similarity
    This follows the Ratcliff-Obershelp algorithm to derive a similarity
    measure:
        1. Find the length of the longest common substring in sequences.
        2. Recurse on the strings to the left & right of each this substring
           in sequences. The base case is a 0 length common substring, in which
           case, return 0. Otherwise, return the sum of the current longest
           common substring and the left & right recursed sums.
        3. Multiply this length by 2 and divide by the sum of the lengths of
           sequences.

    https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching
    https://github.com/Yomguithereal/talisman/blob/master/src/metrics/distance/ratcliff-obershelp.js
    https://xlinux.nist.gov/dads/HTML/ratcliffObershelp.html
    c                     dS )Nr   r5   rD   s     r   maximumzRatcliffObershelp.maximum   s    qr   c                      t                      | t                    dk    rdS fd|D             }fd|D             } | j        | z    | j        | z   S )Nr   c                 J    g | ]}|d |                                         S r   find)r   r7   r`   s     r   r"   z+RatcliffObershelp._find.<locals>.<listcomp>   s,    888!OQVVF^^O$888r   c                 P    g | ]"}||                               z   d          #S r   rl   )r   r7   r^   r`   s     r   r"   z+RatcliffObershelp._find.<locals>.<listcomp>   s3    @@@166&>>F*++,@@@r   )r   r   _find)r   r=   beforeafterr^   r`   s       @@r   ro   zRatcliffObershelp._find   s    9%VQ;;18888i888@@@@@i@@@tz6"V+jdj%.@@@r   c                      | j         | }||S t          |          }t          t          t          |                    } | j        | }| | j        | z  |z  S r   )quick_answerr   sumre   rC   ro   )r   r=   r0   scountecounts        r   rE   zRatcliffObershelp.__call__   sf    ""I.MYSi(())'D'3	

I..77r   N)rJ   rK   rL   rM   ri   ro   rE   r5   r   r   r   r      sN            A A A8 8 8 8 8r   r   )difflibr   rR   utilsr   baser   _BaseSimilarityr$   ImportErrorr   __all__r   r   r   r	   r
   r   r5   r   r   <module>r}      sJ   7 7 7 7 7 7        3 3 3 3 3 3LLLL   EEE
  C% C% C% C% C%_ C% C% C%L$% $% $% $% $%_ $% $% $%N$8 $8 $8 $8 $8 $8 $8 $8N 
	&&((   s    ))