a
    v5`                     @   s   d dl mZ d dlmZ ddlmZmZ zd dlm	Z	 W n e
yV   d dlmZ	 Y n0 zd dlZW n e
yz   dZY n0 g dZG d	d
 d
eZG dd deZe Ze ZdS )    )defaultdict)groupby   )BaseBaseSimilarity)zip_longest)izip_longestN)MRAEditexmraeditexc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r	   zWestern Airlines Surname Match Rating Algorithm comparison rating
    https://en.wikipedia.org/wiki/Match_rating_approach
    https://github.com/Yomguithereal/talisman/blob/master/src/metrics/distance/mra.js
    c                    s     fdd|D }t tt|S )Nc                    s   g | ]}t  |qS  list	_calc_mra.0sselfr   ?lib/python3.9/site-packages/textdistance/algorithms/phonetic.py
<listcomp>        zMRA.maximum.<locals>.<listcomp>)maxmaplenr   	sequencesr   r   r   maximum   s    zMRA.maximumc                 C   st   |s|S |  }|d ddd |dd  D  }ddd t|D }t|dkrp|d d |d	d   S |S )
Nr    c                 s   s   | ]}|d vr|V  qdS )ZAEIOUNr   )r   cr   r   r   	<genexpr>'   r   z MRA._calc_mra.<locals>.<genexpr>r   c                 s   s   | ]\}}|V  qd S Nr   )r   char_r   r   r   r!   )   r         )upperjoinr   r   )r   Zwordr   r   r   r   #   s    $zMRA._calc_mrac           	         s   t |sdS fdd|D }ttt|}t|}t|}t|t| |krTdS t|D ]p}g }t| t| D ]}j	| st|
| qtttt| }t||t d} fdd|D }ttt|}q\|s|S |t| S )Nr   c                    s   g | ]}t  |qS r   r   r   r   r   r   r   1   r   z MRA.__call__.<locals>.<listcomp>)	fillvaluec                    s    g | ]\}}|| d   qS r"   r   )r   s1s2)minlenr   r   r   A   r   )allr   r   r   r   absminrangezip_identappendr   )	r   r   ZlengthscountZ
max_lengthr$   Znew_sequencescharsssr   )r-   r   r   __call__.   s*    
zMRA.__call__N)__name__
__module____qualname____doc__r   r   r8   r   r   r   r   r	      s   r	   c                   @   s   e Zd ZdZedededededededed	ed
edf
ZedZdddZdd Zdd Z	dd Z
dd ZdS )r
   al  
    https://anhaidgroup.github.io/py_stringmatching/v0.3.x/Editex.html
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.3856&rep=rep1&type=pdf
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.18.2138&rep=rep1&type=pdf
    https://github.com/chrislit/blob/master/abydos/distance/_editex.py
    https://habr.com/ru/post/331174/ (RUS)
    ZAEIOUYZBPZCKQZDTZLRZMNZGJZFPVZSXZZCSZZHWFr   r      NTc                 C   sf   || _ || _|| _|| _|| _|d urB|d u r6td|| _|| _tj	| j | _
t| drb| j| _d S )Nz+`ungrouped` argument required with `groups`letter_groups)
match_cost
group_costmismatch_costlocalexternal
ValueErrorgroups	ungrouped	frozensetuniongroupedhasattrr>   )r   rB   r?   r@   rA   rE   rF   rC   r   r   r   __init__`   s    
zEditex.__init__c                 G   s   t tt|| j S r"   )r   r   r   rA   r   r   r   r   r   s   s    zEditex.maximumc                    s^   j | rjS ttfdd|r,jS jD ]$ tt fdd|r2j  S q2jS )Nc                    s
   |  j vS r"   )rI   xr   r   r   <lambda>y   r   zEditex.r_cost.<locals>.<lambda>c                    s   |  v S r"   r   rL   )groupr   r   rN   |   r   )r3   r?   anyr   rA   rE   r.   r@   r   elementsr   )rO   r   r   r_costv   s    

zEditex.r_costc                 G   s(   | j | s|d | jv r| jS | j| S )Nr   )r3   rF   r@   rS   rQ   r   r   r   d_cost   s    zEditex.d_costc              
   C   s  |  ||}|d ur|S d|  }d|  }t|d }t|d }trjtj|d |d ftjd}ntdd }| jstd|d D ]4}||d  d | 	||d  ||  || d< qtd|d D ]4}|d |d  | 	||d  ||  |d |< qt
t||dd  ddD ]\}\}	}
t
t||dd  ddD ]n\}\}}t||d  | | 	|	|
 || |d  | 	|| ||d  |d  | |
| || |< qDq|| | S )N r   )Zdtypec                   S   s   t tS r"   )r   intr   r   r   r   rN      r   z!Editex.__call__.<locals>.<lambda>r   )start)Zquick_answerr(   r   numpyZzerosrV   r   rB   r1   rT   	enumerater2   r0   rS   )r   r+   r,   resultZlen_s1Zlen_s2Zd_matijZcs1_prevZcs1_currZcs2_prevZcs2_currr   r   r   r8      s.    22&&zEditex.__call__)Fr   r   r=   NNT)r9   r:   r;   r<   rG   rE   rF   rK   r   rS   rT   r8   r   r   r   r   r
   J   s(     

r
   )collectionsr   	itertoolsr   baser   Z_Baser   Z_BaseSimilarityr   ImportErrorr   rX   __all__r	   r
   r   r   r   r   r   r   <module>   s   
1\