In [2]:
import string
import random
from keras.models import Sequential
from keras.layers.recurrent import LSTM
from keras.layers.core import TimeDistributedDense, Activation, Dropout
from keras.preprocessing.sequence import pad_sequences
from keras.layers.embeddings import Embedding
from sklearn.cross_validation import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, precision_recall_fscore_support
import os
from theano.tensor.shared_randomstreams import RandomStreams
srng = RandomStreams(seed=234)
import numpy as np
from keras.utils import np_utils
from matplotlib import pyplot
from tempfile import mkdtemp
import numpy as np
import matplotlib.pyplot as plt
import os.path as path
import matplotlib.pyplot as plt
import theano
from keras.layers.wrappers import TimeDistributed
import keras
from  keras.optimizers import Adadelta
from scipy.misc import toimage
from keras.models import Sequential
from keras.layers.core import Flatten, Dense, Dropout,Activation , initializations, regularizers, constraints
from keras.layers.convolutional import Convolution1D,Convolution2D, MaxPooling2D, ZeroPadding2D, MaxPooling1D
from keras.optimizers import SGD
from keras.utils.np_utils import to_categorical
%matplotlib inline
from keras import backend as K
from keras.layers import Merge
from sklearn.metrics import confusion_matrix, accuracy_score, precision_recall_fscore_support
from keras.utils import np_utils
from keras.engine.topology import Layer
from keras.layers.core import Dense, Activation, TimeDistributedDense, Dropout, Reshape, Flatten
from keras.layers.recurrent import LSTM
import traceback
import re
import sys
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
%matplotlib inline

In [ ]:
stringSize = 100 # defining string size
maxWordLength = 100

In [3]:
# lets consider 63 basic character, those occur the most
# character to integer mapping dictionary
charToInt = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'a':11,'B':12,'b':13,'C':14,'c':15,'D':16,'d':17,'E':18,'e':19,'F':20,'f':21,'G':22,'g':23,'H':24,'h':25,'I':26,'i':27,'J':28,'j':29,'K':30,'k':31,'L':32,'l':33,'M':34,'m':35,'N':36,'n':37,'O':38,'o':39,'P':40,'p':41,'Q':42,'q':43,'R':44,'r':45,'S':46,'s':47,'T':48,'t':49,'U':50,'u':51,'V':52,'v':53,'W':54,'w':55,'X':56,'x':57,'Y':58,'y':59,'Z':60,'z':61 ,' ':62,'.':63}

In [4]:
# integer to character maping dictionary 
intToChar = {v: k for k, v in charToInt.iteritems()}

In [5]:
def string_generator(size=stringSize, chars=string.ascii_uppercase + string.digits):
    """
    will generate random string
    """
    return ''.join(random.choice(chars) for _ in range(size))

In [6]:
def mutator(originalString, percentageMutation):
    """
    will take a string and mutate it as per percentage specified
    """
    originalStringArray = list(originalString)
    for i in range(percentageMutation):
        # print originalStringArray
        randomPlace = random.randint(0,len(originalString)-1)
        randomLetter = random.choice(string.letters)
        originalStringArray[randomPlace] = randomLetter
    return "".join(originalStringArray)

In [7]:
def giveWordmatrix(word):
    """
    will generate 2d matrix of the string, which will be an input to convolutional network
    word : is a string given to function
    """
    #2d matrix of size 100*63 initilaized with all cell having value "false"
    tempMatrix = np.zeros((maxWordLength, 63),dtype=bool)
    charNo=0
    for charNo in range (0,len(word)):
        if charNo<maxWordLength:
            try:
                try:
                    # for above defined 63 character, if character exists then "true" is placed in place 
                    characterToIndex = int(word[charNo])
                    tempMatrix[charNo][characterToIndex]=True
                    charNo += 1
                except:
                    characterToIndex = charToInt[word[charNo]]
                    tempMatrix[charNo][characterToIndex]=True
                    charNo += 1
            except:
                tempMatrix[charNo][0]=False
    
    return tempMatrix

In [10]:
# lets do little visualization

# generating new string
originalString = string_generator()
# print originalString
# mutating the same string randomly
prcentageMutation = random.randint(0,100)
mutatedString = mutator(originalString,prcentageMutation)

# genearting 2d matrix for original string
originalStringMatrix = giveWordmatrix(originalString)
# genearting 2d matrix for mutated string
mutatedStringMatrix = giveWordmatrix(mutatedString)

In [11]:
# visualizing original and muataed string
print ("Original String")
pyplot.imshow(toimage(originalStringMatrix)) #showing first image
pyplot.show()
print ("Mutated String")
pyplot.imshow(toimage(mutatedStringMatrix)) #showing first image
pyplot.show()


Original String
Mutated String

In [15]:
# defining model

# model2 will take original string
model2 = Sequential()
model2.add(Convolution1D(64, 3, border_mode='same', input_shape=(100, 63,)))
model2.add(MaxPooling1D(pool_length=2))
model2.add(Convolution1D(nb_filter=128,filter_length=3,border_mode='valid',activation='relu'))
model2.add(Flatten())
model2.add(Dense(64, activation='relu'))
model2.add(Dropout(0.5))
model2.add(Dense(32, activation='sigmoid'))
# model2.summary()

# model1 will take mutated string
model1 = Sequential()
model1.add(Convolution1D(64, 3, border_mode='same', input_shape=(100, 63,)))
model1.add(MaxPooling1D(pool_length=2))
model1.add(Convolution1D(nb_filter=128,filter_length=3,border_mode='valid',activation='relu'))
model1.add(Flatten())
model1.add(Dense(64, activation='relu'))
model1.add(Dropout(0.5))
model1.add(Dense(32, activation='sigmoid'))

# both model merges 
merged = Merge([model1, model2], mode='concat')
# final model will decide final result
final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(64))
final_model.add(Activation('tanh'))
final_model.add(Dense(64))
final_model.add(Activation('tanh'))

final_model.add(Dense(100, activation='sigmoid'))
final_model.summary()


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution1d_7 (Convolution1D)  (None, 100, 64)       12160       convolution1d_input_4[0][0]      
____________________________________________________________________________________________________
maxpooling1d_4 (MaxPooling1D)    (None, 50, 64)        0           convolution1d_7[0][0]            
____________________________________________________________________________________________________
convolution1d_8 (Convolution1D)  (None, 48, 128)       24704       maxpooling1d_4[0][0]             
____________________________________________________________________________________________________
flatten_4 (Flatten)              (None, 6144)          0           convolution1d_8[0][0]            
____________________________________________________________________________________________________
dense_10 (Dense)                 (None, 64)            393280      flatten_4[0][0]                  
____________________________________________________________________________________________________
dropout_4 (Dropout)              (None, 64)            0           dense_10[0][0]                   
____________________________________________________________________________________________________
dense_11 (Dense)                 (None, 32)            2080        dropout_4[0][0]                  
____________________________________________________________________________________________________
convolution1d_5 (Convolution1D)  (None, 100, 64)       12160       convolution1d_input_3[0][0]      
____________________________________________________________________________________________________
maxpooling1d_3 (MaxPooling1D)    (None, 50, 64)        0           convolution1d_5[0][0]            
____________________________________________________________________________________________________
convolution1d_6 (Convolution1D)  (None, 48, 128)       24704       maxpooling1d_3[0][0]             
____________________________________________________________________________________________________
flatten_3 (Flatten)              (None, 6144)          0           convolution1d_6[0][0]            
____________________________________________________________________________________________________
dense_8 (Dense)                  (None, 64)            393280      flatten_3[0][0]                  
____________________________________________________________________________________________________
dropout_3 (Dropout)              (None, 64)            0           dense_8[0][0]                    
____________________________________________________________________________________________________
dense_9 (Dense)                  (None, 32)            2080        dropout_3[0][0]                  
____________________________________________________________________________________________________
dense_12 (Dense)                 (None, 64)            4160        merge_2[0][0]                    
____________________________________________________________________________________________________
activation_3 (Activation)        (None, 64)            0           dense_12[0][0]                   
____________________________________________________________________________________________________
dense_13 (Dense)                 (None, 64)            4160        activation_3[0][0]               
____________________________________________________________________________________________________
activation_4 (Activation)        (None, 64)            0           dense_13[0][0]                   
____________________________________________________________________________________________________
dense_14 (Dense)                 (None, 100)           6500        activation_4[0][0]               
====================================================================================================
Total params: 879,268
Trainable params: 879,268
Non-trainable params: 0
____________________________________________________________________________________________________

In [9]:
# compiling model
final_model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['mse'])

In [13]:
# file to watch intermediate results
testFileOut = open("intermediate_results.txt","w") 

# repeate for 5000 iterations, you may change this
for times in range(10000):
    originalStringArray  = [] # to keep original strings
    mutatedStringArray = [] # to keep mutated strings
    percentageSameArray = []
    response = [] # to keep percentage simillarity between original and mutated strings
    print times
    
    # every time new 10000 strings and their mutated strings are generated and kept in RAM
    for batchOf in range(10000):
        # generating origianl string
        originalString = string_generator()
        #randomly deciding percentage mutation
        prcentageMutation = random.randint(1,100)
        #100(stringSize) - mutation = percentage simillarity between original and muatated string
        percentageSame = 100-prcentageMutation
        percentageSameArray.append(percentageSame)
        #generating mutated string
        mutatedString = mutator(originalString,prcentageMutation)
        
        #generating original string matrix
        originalStringMatrix = giveWordmatrix(originalString)
        #appending original string matrix to originalStringArray
        #after 10000 loops, originalStringArray will be having marix for 10000 original strings
        originalStringArray.append(originalStringMatrix)
        
        #generating mutated string matrix
        mutatedStringMatrix = giveWordmatrix(mutatedString)
        #appending mutated string matrix to mutatedStringArray
        #after 10000 loops, mutatedStringArray will be having marix for 10000 muated strings
        mutatedStringArray.append(mutatedStringMatrix)
        
        #response vector is having %simillarity  between original and muatated string
        #after 10000 loops, response will be having % for above geenrated 10000 original and 
        #corrosponding mutated strings
        response.append(percentageSame)
        
    if times%1000 == 0:
        # at every 1000 iteration it will dump output to testFileOut; this is to see progress of learning
        #converting originalStringArray having 10000 strings to numpy boolean array
        originalStringArray =  np.asarray(originalStringArray,dtype = 'bool')
        # changed nothing in reshape; precautionary 
        originalStringArray = originalStringArray.reshape(originalStringArray.shape[0],originalStringArray.shape[1],originalStringArray.shape[2])
        
        #converting mutatedStringArray having 10000 mutated strings to numpy boolean array
        mutatedStringArray =  np.asarray(mutatedStringArray,dtype = 'bool')
        # changed nothing in reshape; precautionary 
        mutatedStringArray = mutatedStringArray.reshape(mutatedStringArray.shape[0], mutatedStringArray.shape[1],mutatedStringArray.shape[2])
        
        #converting respose vector to categorical "one hot encoding" 
        #when we use categorical_crossentropy as loss function, converting to "one hot encoding" is must.
        response = np_utils.to_categorical(response,100)
        
        # training
        final_model.fit([originalStringArray,mutatedStringArray],response,batch_size=10000,nb_epoch=1, verbose=2,validation_split=0.2)
        # getting probability for intermediate inspection
        prob =  final_model.predict_classes([originalStringArray,mutatedStringArray],verbose=0)
        
        # writting to file
        for eachNo in range(0,len(list(prob))):
            testFileOut.write(str(prob[eachNo])+"\t"+str(percentageSameArray[eachNo])+"\n")
        testFileOut.flush()
    else:
        # When in pection is not required
        #converting originalStringArray having 10000 strings to numpy boolean array
        originalStringArray =  np.asarray(originalStringArray,dtype = 'bool')
        # changed nothing in reshape; precautionary 
        originalStringArray = originalStringArray.reshape(originalStringArray.shape[0],originalStringArray.shape[1],originalStringArray.shape[2])
        #converting mutatedStringArray having 10000 mutated strings to numpy boolean array
        mutatedStringArray =  np.asarray(mutatedStringArray,dtype = 'bool')
        # changed nothing in reshape; precautionary 
        mutatedStringArray = mutatedStringArray.reshape(mutatedStringArray.shape[0], mutatedStringArray.shape[1],mutatedStringArray.shape[2])
        
        #converting respose vector to categorical "one hot encoding" 
        #when we use categorical_crossentropy as loss function, converting to "one hot encoding" is must.
        response = np_utils.to_categorical(response,100)
        # training
        final_model.fit([originalStringArray,mutatedStringArray],response,batch_size=10000,nb_epoch=1, verbose=1,validation_split=0.2)

In [ ]:
# to save model
# final_model.save_weights("string_matching_refined.h5")

In [18]:
# to load model
final_model.load_weights("string_matching.h5")

In [35]:
# testing on random 100 strings
for i in range(100):
    # gerate new original string
    originalString = string_generator()
    # generated mutated string
    prcentageMutation = random.randint(0,99)
    percentageSame = 100-prcentageMutation
    mutatedString = mutator(originalString,prcentageMutation)
    
    #Get numpy matrrix for original And muuated string
    originalStringMatrix_test = giveWordmatrix(originalString)
    mutatedStringMatrix_test = giveWordmatrix(mutatedString)

    # reshaping to meet dimension requirement
    originalStringArray = originalStringMatrix_test.reshape(1,originalStringMatrix_test.shape[0],originalStringMatrix_test.shape[1])
    mutatedStringArray = mutatedStringMatrix_test.reshape(1, mutatedStringMatrix_test.shape[0],mutatedStringMatrix_test.shape[1])
#     print "Original String :",originalString
#     print "Mutated String :",mutatedString
#     # printing 
    print originalString,"\t",mutatedString,"\t","Predicted:\t",final_model.predict_classes([originalStringArray,mutatedStringArray],verbose=0)[0],"\tOriginal\t",percentageSame,"\t Levenshtein Distance\t", fuzz.token_sort_ratio(originalString,mutatedString)


PQSPUK8N2U23QI6TIC0QA6OQ61SKT8Q5GFCYZM9LXJD7CFPTOTFRB59Z8SKTCXFLNXZ5P7U0ZR5EAUAKC3R4DY48RWOB8GFWIMKI 	PQSPPK8X2Uo3QI6nQS0aA6OP61SKT8Q5tCunvt9LvJD7CFPTOTJRB59B8SKuCYFLNXe5PnUZZR5EAUGbC3R4DYwlReOB8GFWKMKI 	Predicted:	67 	Original	64 	 Levenshtein Distance	73
8TWTZZGHOPV2BMVI0MOTDPYSYQ0WRVADDY60PDLDNORA6NF4TXE9QY0SPXPXD37A5I3PH7NTVLQQGETNK27ZVSD2UJC3P8HU0Z8V 	8TWTZZGHOPV2BMVI0MOTDPYSuQ0ARVbDDY60PDLDNORA6Nj4TXE9QY0SoaPXJ37Q5I3PH7NKVLcaZETvK27ZVSD2lJCHP8HU0F8V 	Predicted:	77 	Original	84 	 Levenshtein Distance	82
6HBQFWZUOAI536CS30H7CRVGXAV4OGFQGZBN80AFXONABMQTPDIMPYTBSX209EXHXBTXXIKSLNO6LX1WJ97L4JC4UC18I4ACWL2N 	IeBTFWZUyRI536CSg0H7KRVGhAVdOGfQFZBN80dqXgUATMtSPfhMlYTBoX2s9IXHXBgzXIgSONPaLX1WJI7L4wC4UCPYI4AoJL2N 	Predicted:	57 	Original	50 	 Levenshtein Distance	63
FHGOE4MR7U2PLVUWMSIHX3NAA4M9YQJ12RN97LQFSJGCWGPVLMZIHFL30SEWBB50M608TOYRW0DJJHMJDZSFPA8ADGYAKTMX4UGM 	FiGOE4MtsObPLVlWMSIdXhRAA4M9oYJWxyN9crQtSJNCrDPVYpPwHFL30RhWnCE0LVk8WuYRG0DJJHYHGZSFmA8iVGZAKMFXPUGt 	Predicted:	45 	Original	30 	 Levenshtein Distance	55
J1D9IVKK96L7T7BSKWEQPMH6SW3WJVLK62RIZOF6BCGX4B40QNX6AK341PPNY6FT9JXYTF56MAHQDRAXRCXWA4F3ODLMAGDC8FAS 	J1D9IVKK96L7T7BSKhEQPMH6SW3WJRLK62RIZOF6BCGX4B4VQNXRAK341kPNY6FT9JXYTF56MAHQDRdXRCXzA4FpODLMAGDC8FAS 	Predicted:	81 	Original	92 	 Levenshtein Distance	92
LPNWRRRJJNVD7R18J1QIC2ONY8P6XVC8NQ2VCF7ZL3FBJ1B8TA3IPTEN6DOSIB0R01YLG9YGXN3A01TRDJUAC3XAD8VWY2II7JKP 	LPNWRRRJJcIART18JPQIC2ONV8PiXVs8NQ2VCF7ZL3FBJ1B8TA3ILTPN6DOeIB0R01YLG9YGXN3rZ1TRDJUAC3XAD8VWY2II7JKP 	Predicted:	80 	Original	82 	 Levenshtein Distance	87
ZS3GZ8YIRQ9EROA72VWT8SXIOWAX8XY8ZOIEYFNQ8VF2VFKZ0NYOIVI9ZDZLLWR8ZLY1RZGKOUR4VPSKK49EE2VYFT645CS6PTM3 	ZS3Pc8YfIQ9EROz72VWT8rXIOWAktXK8ZOJVpFyQ8VFqymKZ0NYHIKl9qUZLLHa8ZLY1RqfKOUR4VVSKKJiEE2VHFT64YCs6PTM3 	Predicted:	60 	Original	57 	 Levenshtein Distance	71
3ISB3ETECAJPNSH8RE0LD9FWEU3ZTGDDCYJW6Z9NSMP7LBPFBKZ0PP84YXZYGRYP87EDT5XJ4MJJRYPE66V2YDJZWWL2ARZCUE5S 	3xSB3ETECAJPNSH8RE0LD9FWEU3ZTGDDCYJW6Z9NSMP7LBPFuKZ0PP84YXZYGRYPg7EDT5XJ4MJJRYPE66V2YDJZWWL2ARZCUE5S 	Predicted:	89 	Original	97 	 Levenshtein Distance	97
IDV3DVC0V1N9BQAZ9KZX6I7PGK0H7NAAZE4MBSNMU2R7NR8UCVLITNK32RPV8OF6XH2BOZPHUCJ9Z64DTZFWBIAHWWI7C4UDPO0J 	IDVMDRaOQ1N9BEJktKQX6IyJGT0Q7geAxVmMBLNZURMCNR8UCVOITVKI2RPu8sy6XH2BOZPHUCGLZ64DTaFWeMAHWxI7CgNhYO0i 	Predicted:	57 	Original	42 	 Levenshtein Distance	58
FF6QQW9F0MZ9WYFOFXAT67X1M95KGCSEBN3A9NSRPRVB9WVPCL6222GJ4U8YM8JLFCDR64JFC5A9E3L748JF0N0GWRKHD2Y1X1YE 	cQ6KbW9O0MZEWNFoFXAwK7z1W9mUgvvuuGDP9uSMDRjUBWtCCLG2laGJ4CweT8mJfxDF6yJFBpArdVLgiQJO0I0GzRKYDIoFXLYG 	Predicted:	26 	Original	11 	 Levenshtein Distance	33
29SQAMPYYT1BAD5XV60R42L8X6JSZO3BC4PAOEW3SCCRANZS8MCF7B1KQP1GV7HP49Q7IQ9WZFYYNB1SXWF96SEJMV4S17USL72O 	O9hQpwPYYTOSAD5XTwwb42izGHltZy3qCPMBOHo3SCCRANal8fUr7xqEjP1GztNO4Ci7IY9fZFiYJsZTXaH9bKErMdxS17UchKlF 	Predicted:	26 	Original	2 	 Levenshtein Distance	44
BP627INOTB0EX2T82M83N0U8N9NYDHLO3IU7UJR6J1UL7KPNF002GMP0DQ47USNCXBPWTAY0T8R8BF6C47XT572Q6DHUE1R8M34U 	Bb6U7KuOml0EOktuTx83N0RbV9JYDDLOSlbXYiR6JzeL7SPNi0nLgMP0dQ4PUSNCXKPFPAYtaCW8xF6W47sA572kLDCUEblqMq4R 	Predicted:	42 	Original	25 	 Levenshtein Distance	52
TCMWQPKDPV9CU3H6OWB7F6ZHOASFY0GO79QDRDOG6Z0DQMHVMQ1GQY1DWR21YULLWQJ6YXCJJZYI39EEH8Z8CEQZ4202RHA6BJNJ 	fCMWoCKbPV9CUCHNOWHCFIvqOASFY0oO7JdzZDOv6Z0WIKHVROxGQYUDWRR1SXLLWQJiYTCJmZfi3YzEomZ8CYQZK202lHCQBJWF 	Predicted:	53 	Original	41 	 Levenshtein Distance	59
Q2CX10WJOJME64QLXMTYE1HFCDKEK41RF7YOZ6VE2X6TLKV6ECA76FF7RYPZI4A4JZ4HERR7SO7Q5MSKG56DNGF58ZNHWZG9DA37 	Q2CX1iKJOJME64VhXMTYE1HFCDKTK41RD7aOZ6VE2X6TIKV6ECA76nF7pYPjI4A4WZ4mEOR7SO7QhMSKGt6DNGFO8ZNHWZGjDA37 	Predicted:	70 	Original	78 	 Levenshtein Distance	82
DFOJGKEG61NLG2U5H42ST1JXFOS3BS2A3KVFX3GSK996Y2XMCW1X7TNV1SW1YCVPFFROAPFMZ8VJ2NH0MNO6IVQGPEJJ35V5BJ3M 	DFOJGKEG6XNLG2UXY4dlT1JXFOS3BS2A3KVFXWGSK99SYdXMCW1X7TNVGSWOYdVPFFROAPFMU8VJ2NH0aNO6DVQGPEJJ35V5OJ3M 	Predicted:	74 	Original	83 	 Levenshtein Distance	85
3OPG6WY2X0JNBVLWIAO4Y6SUKDF61FHATSFG08UIF98K2VJTE2J935R9UAEUB6JHGIZK7ZB2UQMK9RYKIUNRX48W096IYQS0ZJ23 	3lveyWY2XFJNBULfIAB4Y6SgerFJeFHtTHFqxjUCF9mLfVJTE2b93qRiKARUBuJTGIZK7ZB2wnMKiSYKeUNRXnhu0e6IYQS0ZJL3 	Predicted:	38 	Original	53 	 Levenshtein Distance	61
7AFNW6454V68ENHZE5RJ212GM1TVCQOLFAXJSMDXBT6FZFXU6N5JGTKON1K3IVT53C7LUFS8SEFCM3KEMZVJ2HJQU8358092OUN7 	7pFFW645Ixt8ENHuP5RJ212rMYfVWQpdFAXJSMDXBT6FZcXUSNdxGTVJNtKAjVaZ3C7VqFn8bEKCMPKjMZVKXCGYA8sxqw92GUN7 	Predicted:	49 	Original	51 	 Levenshtein Distance	57
AJN1UYKHFM8VSFZ31VL6W78YJ453PR8T3ILELPN9R8RJXY3Z9ZK46BJV211XETXT3LH6E091EBR87K38XHU43JUC50U9BM6CZ0UI 	KONvbBmQFM8VSucE1VUyW78YJ4qQPR8HgfkOUyNvhRRzXNZX9pKW6Bwq2H1XEOXTfLsfEHh1pRY87i38XHU43OUC5XU9Be6nlwUI 	Predicted:	40 	Original	22 	 Levenshtein Distance	49
PLFD17T36T5S52WU63A8N5KIZDIBBDOZGNRE9PPJ4IMP4G1Y5TJ8WCOSAS23ARV53MOLCZ0XO8CVL4O3QPNZRKYOPRKMLC8DWWW7 	gSFD17K3wpcS52WDJ3A8NQKIZDIBBDmBGNRE9ZeJ4TMP4G1H5yJFxCFSMXU3ARYluMOLCt0XsbCZL4OLQzNZlKYXBaKACCUDWWD7 	Predicted:	57 	Original	51 	 Levenshtein Distance	61
MKMYM21SBKUFM4I2FNO65MBOSFZZSBI0HA8RBC7STSKKC66CM5PCCDHNLCPNFK8OV275APDA2SP2U2GKBD1G95BUR0G9YB94A1JB 	aKlYZz1SBKYFV4u2nVOEdMBOfFZZvJc0dACRBrXzUiDaC6oXM5POCiJDmdPNFF8yw2sIQPDg2KAMU2DKtfqG9HlURjO9yrloa1cc 	Predicted:	18 	Original	23 	 Levenshtein Distance	46
DWD90KYW7TVXPVPLWIO5KNX8EBGG7V1AKJRT5TVNQ5GVYYANV44ZGNJE3MRY7LV09O9IS6RJUNDNFPVD9RQ8D0L899AXVLJ0AU3T 	DWY9lUYUwyVHPVPLJIOMbAX8EQGGZQ1AKJRw5TVNQugyYNANj4PMGNJP3MIY7yV09s9IS6RyUrsNxPVD9IQtD0L899AXVLa0XU3T 	Predicted:	63 	Original	63 	 Levenshtein Distance	69
RUMY06KTO04KS2ZW5SO5BZGEBJ8XDX6CBCW4RKL45EYRC1ZX79ZBLVSQDDHJH1IXXCV2851K9SSRF0JX51D4FGEBFRM0Z95VH8IB 	jruyFaNcOD4Km2ZN5loftZGuBdZvDXtCrFWzRcLWwQsTgzrXVhrBLVSQhRHxhyiqZCV2h5kC9JARnRJKpesxCGEgqRWUH95nHaGB 	Predicted:	0 	Original	8 	 Levenshtein Distance	44
4BDLIQCR540J13J1I4IRAF4WUZX2NENTMKNPW6RPB7QTU03IVK8STMZAOT6IAZ09AX3ZWZIMZBZ4BPHRY03VMUARZ6AKUILAP3G1 	jBSLIMCeRg0J13jEI4dRAjKWpqX2zEqTMkNPWORPB7QTU03IVp8SYUaAzwMIUZJoAXZSWZIMBNeOXPHxEr3hGUtRZ6AKUyOlP3G1 	Predicted:	51 	Original	43 	 Levenshtein Distance	64
VOGLK6U10SXNB9TANXWX0XE1CXNAM4C2Q4QJSN8J2NCP4HDSAAZFDSW0M3WJS0YJAG5YKNQXC9B2DR3FTQ82K0SHTIPQF717VL9B 	VLELd6UTBSZEBETJNBMp0WECCXNnR4DWQZYMSNaO2KqkJRDSoAAFDvWTO3WJS0YegG5YjuQXRlBlCM3FjO82K0SHTMPWK71jyLfX 	Predicted:	57 	Original	25 	 Levenshtein Distance	48
8BT6BC24WKN3LZC51ECPGL4NY5OBTB63IK1UYODFMUUA8E9YJWCW78KAL1S4N65P2L362ROYNI0OM9K9V5GOZIA0XRW6VH0K5DGP 	8hT6BC2XWKNMLZXBCEaPGL4NB5OBTB6pIK1UYONFMUUJGEUZJWCW78KAL1S4N65P2L362ZOYNI0Og9K9V5pOzIA0XsW6VH0K5DEP 	Predicted:	73 	Original	78 	 Levenshtein Distance	82
D43F6EEBEKCAHAK6IVS13O520GCE61L3I4HQC6EUQLYL55GKE7INJOC9YYBA02WUAV12U88HOJIVCEO2ECO667A094XFZY2EHBLS 	Du3AHFXhteKJLZK6ZhIM3W5I0WMR61ntinQQMQcRQLmL5ZGVEoIWpOf9UYSA02TqNNn2UjKHOJOVfZC2EhO667NE9TXFJDoxbhgS 	Predicted:	45 	Original	1 	 Levenshtein Distance	47
3P9U58G54E8QHXIMRWRI26ZQRLWTRIZDOAUVW5J0TOATSDNQ8U2AL06C8OIZJRV2TBWD9FBLCFPOICOP2LBNIK4LTQBDLFT6LOKE 	3YhyEFGZLN8QHbzgRREIyTxGDNwTRKZXMHUVhDyrmuATCqCQVUEAruxy8BBZPswwTSWDqqILkFPOeCOTELBSIrLZTQLPLFn6LzKE 	Predicted:	0 	Original	11 	 Levenshtein Distance	36
6HMQ5CTZRIMBZLR2I3MOOOTFC016GTL1DHQ0N7G6IOK8S1OZXRZ0W6N2SF7EBBWYY9QOEKEITZU1FSRLG5OYMU84BXAJ706SOJ39 	6HMs5CTZRIMCZSR2IVMsONTrv016GTLZzHQ0N7k6UQKJSlOZNRZgW6N2oFVEBBWYd9xOEsEITZU1FSRLG5JHMU8kBXAJR06iOJ39 	Predicted:	67 	Original	64 	 Levenshtein Distance	73
BFU2QPG4GS8YHDEXT17W4QYOUIXME9PHY3FRRDJR4EOUJ0JC6NZDW39MMLDH41N18BG5KHN7LIEDIZF94JNHVKUVEEJ7ZKOH8D2B 	BFU2QPG4CSgYHDEXTq7W4QYOUoRME9PHY3QRRDJR4EOLJ0JC6NZDW39MILDH41N18BGeKgN7LIEDIZF94JNHVKjVEEJMQKOH8D2B 	Predicted:	80 	Original	85 	 Levenshtein Distance	87
FMUKTRZHZZXQTEOAS8OMR3DMLG4GZV6ZY8LOOO61SNZNEB4Z0W0EU0ZIQNTOI1ZLIAAR166Z14CPDPEWL7RZBIU7J7XQ21HJABK7 	FMUKTzZvZZXQEEOAHeQMF3ZxLx4Gku6ZeZwKCO6JSNzCExIL0WkEjvZIQCLZr1ZLIIATE66Z14MrtPEWH7QZjIU7JfdQ21OJsBK7 	Predicted:	57 	Original	45 	 Levenshtein Distance	58
CGEGG1SLUOE2X3II53JDN75HCTOO4983NX9T6R0296Z8FVEM0LBQISJ9H3KNP7ZDPN7XII9P3KYTVG6E0HW2JBJTXKPO3TWH4H6R 	CGvzGdcuBJonXMIIsGokFC5yCzOR49eJNkjg6bd2f6o8FVUM0LBQDqd9H3MNZ7ZgkmdGIIRP3rvTmB6Y0HcHJXJSXVrb3WCCZH6R 	Predicted:	31 	Original	17 	 Levenshtein Distance	43
RR5I9995MG3LVT5T33EGOBHGD51OJDYO6FGUY0FCWIPAHGPRVM5VQQGUSCPJO9BBJ6AE1NT7F7NQWK3NYN5WEU56WJQJ9VHLA1P8 	RRWI999ZMGCLVTZTlEfLOBLGgcROTDfKDFGUj0ACuaPADGPRVa5VnQnUdvAmO9BcJ6AEeNNwyhNGWI3xYqRqGUGQWJQJ9jHLAUue 	Predicted:	35 	Original	35 	 Levenshtein Distance	52
AIMGFG18AYDGHU5817MWH26GLUP3HYY0HLNLBKBCYFGHB987X6P5R27OH3GT3Z6GZG4YM6TCR7QD6WAEQ9CM93YSKS1QAM7CRG88 	AIMGFG18AYDGHUHL17MWH26FLUP3HYY0HLNLBKBCYFGHB98cX6P5R27OH3GT3Z6GZG4YM6TCR7QD6WAEQ9Ct93YSZSIsAM7CRG88 	Predicted:	92 	Original	92 	 Levenshtein Distance	92
6Q66RDRQABBVY9160XD88PVQP7G1PCL2A4FE6E0CGT7ORF4J3HL9YSSV9IUWZMDB0U2NULIXMJ0UZ2UNL5FBX8DFXGH56RP8ZXM6 	wP66RDVCAABVTv1ccuMo8sdQj7C1fRL2k4cEaE0kGTIrRSes3Hg9Ytuh9RLWZMDBmoAJUFIYMA0UZ2UUL5QqXXDFXKvwAROOssy6 	Predicted:	38 	Original	12 	 Levenshtein Distance	45
PDF0R39DFQKQUZFXHSDI1TL5V7SROH3WUOT6KJU30K2VEXUIPC0E1QFYO6PAV8NGC0O9KQM9ALGK6CZE0QJZRQQZK4DF8MUMKPAR 	PDFBG39tFQKzUZFXHSDk1TL5S7SsJH3WzOTvKSK30K2CEXUIPCEE1QFYOGPvVXNTC0O9KQKklLGK6qZE0QJZaQQZKagF8bEKKrAF 	Predicted:	64 	Original	63 	 Levenshtein Distance	70
EGF4CEFGP0BM7HQXEKYKW77N8AXP2S44VWKO336BBUW72N87L1CUULFZKQXEKS8VH4RFU4YTIQZ125XFISOZ1F6VL9AWL30WNDKL 	vQxoCXFGV0BS7HwXXKoKW77NzACP2Wt4RdKO336BmUp72N87LpXPiLFzCQksKxKJnuRFf4sTxQZiJ5XFaCZZSF6gLGoxXcfJNwHL 	Predicted:	42 	Original	21 	 Levenshtein Distance	52
SJNTIM6I33T73W96GB92B2KO0QYNAAXOV03XLNECQP7AGVIATMZ6JDFZALL9RZVI1YMFUOBEZAG0OVPRLMOSAOCNNOV3ZVP1ZD1W 	IJNTIM6I33c73W96GB92tSKO0QRNAAXOV03XLNECQP7AaVIATMZ6JTFZALL9RZVIHYMqUOBEEAG0ODHRLMOSAOCNNOV3ZVP1ZD1W 	Predicted:	85 	Original	85 	 Levenshtein Distance	88
E8JVFT1SJSITKF2NX95WTSRRK6IVQL6SNI73C19Q88DE487NJEVPL17J1QBBNQB1XC3AP4Q9AB1FOMCTRUJG7UKV93FA3V2W7VY4 	E8JVFT1SJSIZKF2NX95WTlRRK6IVQL6SNI7qC1XO88DE487NJEVPL17JmQBBNQB1XC3AP4Q9AB1FOMCTRUJG7UKV93FA3V2W7VY4 	Predicted:	93 	Original	93 	 Levenshtein Distance	94
Q3S4L09J5341BCZPUG6KQTUZ9E9VGBU3EFHEHJQ011PBNXJJ1244IWQFSIT8G8N2ZNE1MAZ4XVGYJLT4AX9XIS0YP23SUL164UOV 	Q3S4v09J5341nCZPUG6KtTUZ9E9VdBK3EWHEHJQ011PBNnJJ1244IWQFSIT8G8NSZNE1MAZ4XVvYJLT4HX9XIS0YP23SUL164UOV 	Predicted:	85 	Original	87 	 Levenshtein Distance	90
1UB1QONKK9L956ICGAJLXRLM6YN88RIBUHWLTW132PJ21C28ZOWMJ0SLAI49FAKM5XJAZ8HUJBVMH0M4AUEGVEG4QUMZBTDXZUBV 	VUF1OONKY9L95saCvEJeXDjM6Ks88IIBTgWzHW132IJ2Eob8fwYBtTSrAI49FANv5XJAZRHWJCzNH0C4AUEGeEc4QSMZBTPlZUtX 	Predicted:	58 	Original	46 	 Levenshtein Distance	56
8BBZOP76MXF7O2VXF0BHME2IMCSB8MQR1YM4VGMEY43I8I20FO65UH01TFIHKZD6RSVHSILJ970X1EZOAD4GO0TGSSQN0GR7LF61 	8GIZaV7QMXF7h2SlFVydMcgIrCJwxMQd1YyxVeMEvJ3Z8Y20qSgCtmjwTRlHpKD6RSVHCTLJ970X1EZcUXALs0ydSSQk0GRjLD6q 	Predicted:	38 	Original	32 	 Levenshtein Distance	43
930R6L5SF6HOUFVKRGM915C6SQ9VDLQP3GABPLLWF2CRK0D7MU3K4517YSSIITXGY4OQXGNFP7V0ZD8UCBBEMJ0V9AX3Y62D4NDN 	930RBLxfF6HOUFVKRbW915S6SQ9VDLQP3GhBPLLWFJCRK0D7MUfK451EYRSIITXGY4OQXGNFP7VWZJ8sCBBEMJ0V9AX3c62D4LDN 	Predicted:	73 	Original	81 	 Levenshtein Distance	84
DBGLKXJ9NS2X4SU62E02SLT0RRZBB9CV39QFNLCK40EZYOS6A6D8YYR4C1O77075T5OYVINCXH03X5PFTCAMQ5GFY1BF8QJAUZY2 	LBQdKdI9NzdXnSg62EkMrLj0RTZFGuAS3AQjNLCPU0EZDOT6AWASIYaiCFOw7w75x5IXgIQCbH03NtwFTCAZZFGFbypF8IrAUEs2 	Predicted:	45 	Original	19 	 Levenshtein Distance	47
LXEUL24SRW0WA2H1VTQH6WHV7WPVD37G28GN4XRPRIU4DCX7PW5ZQA1GZECKKWTCO7JP7LIDE3LGMR3F0Y1HV8FX7RZ068OE9TGQ 	OnYULnTnRW0WA2H1VaQHwWHVnWPxD37aJ8SN4XdPHpr4HCX7PZ5ZQAtGIhCKKWTJgmJP7LIxE3LbMR3mnYaHVTij7RU0c8OZ9TGK 	Predicted:	51 	Original	50 	 Levenshtein Distance	64
BCF3A7GRQ95ZJPFQWJ177VIXD90Q9WI2VUZCISBK2JE3ZBXLXSGN0DV88BO427NO3GV61AGCJ90OJAUB66MQ428HT2KG4EOG777K 	BCB3A7GRL95ZJMuQWJW7mVHXt90Q9WI2VyZCxfBK2JEkZaXLgPGNPFV8tBR4OiNf3fVnFTGMJ90OJczB6lxf4CEHT2KG4NOGU77Y 	Predicted:	51 	Original	59 	 Levenshtein Distance	62
DOIUH99EQ3H71MVRXV0X5XBEOV1QD1H156WT211ODAYYWQFE9J8413XUREFSJWLFZPO1HREJ2MDW1BOEKPELYC3OAQG53IZMT1H7 	DaSUH99EQ3HV1MqRDV0X5wBEOV1QD1EwmeWsf1GOLAYYWLdE9J8T13XtRmFSJqGFZPO1cRvJ2MDWSBOuKPvLYGKOASGs3IpMT1Ht 	Predicted:	53 	Original	63 	 Levenshtein Distance	67
5PENR2W0KIW8146QQGSTLZ5U2TH5CC9RJ2N8PE388QNWG24DEV6WN83HYLVC7255DDZFJ0EPFL7BCVMN8KUAHY262YYFP4F5FG91 	5bEJn2W0RIY81O6hQGSToZTU2TW5ZC9RJ2NdPE388QzWGC4DlmdWN8UHILsS7255DDZbJ0EPFL7BCiMaVKkQHY2U2YYFP4FoFGW1 	Predicted:	63 	Original	60 	 Levenshtein Distance	71
XDLOXVYJNSU1OPDC98FCJFI9AZLAZGWKFOLOOYZ461N03NM9OCB9SE82WIB1GRA573LPYH1RBNXDEZZRKML7JKGNLZCISTXON37S 	XDLOXVYJNFU1OADC98FCEeI9QZKAnGWuVLmoUYE461NH3UrqtgB9TE82WIB1tBW573Ledi1lBNNDEZZRKszSJKnNkWHzSTVON37s 	Predicted:	61 	Original	50 	 Levenshtein Distance	63
T83OLHQHIFZENSVL5INSWTKTHR46LJC7K87J1QXHQSR7IJKQP7DPISGID11CEE4CG814M2VQT34GMGC3VR0KJBCBFK6MRUD24T1L 	kW3VIuQHIFZENfrhbFPSWTKlHPr6LqC7KDakMXXHQYo7IxYQP7KPbSSIDZCCEE4nZ81GMPVQH34NMGg3VC0KGBWhFY6MJUD2gH1L 	Predicted:	57 	Original	39 	 Levenshtein Distance	57
UC46KAJFJPR674QO270UD0F4CPSP148UQGX11YZDJ4727KRBPM60TQD0ZNXGJHLGTQAWMGFMH01L0L3IV0LUJFZYK4EVM5BR1OJE 	UCWTNAJTJiR6twQE27YUD0z4CPSPNXtUQGGY1LZgs4NgBKRBVA60GQD0qipGwULeWQiiMPBMHcpL0L3IlHBUWPZYF4EgM5ds1OJE 	Predicted:	49 	Original	41 	 Levenshtein Distance	55
BKQBGL0VR0JUPMGHCO1QFWNZ6AV6EB08BLBFWUEI0QO43BHTCY5KZMTS2AFI46LL5A2ZRCTSGR29Z3PMT8MJQ5LMI727QG64Q4EN 	BzQBGL0VR0JUPggHCo1QeWNZ6AV6EBP8BZBFTUJIlQO43BHTCk5LZMTs2Yaqz6LC5AfZRqLSGR29Z3PMTQdJQhLMI727QG64QSEN 	Predicted:	67 	Original	70 	 Levenshtein Distance	76
70HQTCSE0BVOE3N1HQSPN81SYGJI1CKZ0I7RYK6GBQ3S5QA1IGOKS5EOLPGVZJNDQX0Y93RQIPOX7U0YX55VMOWG2WAOHTPUIZ2H 	fQwQTWNE0PbCEUN1HQkPD81nYGJiiuHG0QzoYKDGBn3SuQV1yGOFr5SJVRxVZeIDQX0vZepQIPOX7UQxX5VqzwxGiWKORTPElNSH 	Predicted:	42 	Original	34 	 Levenshtein Distance	49
9FQBHJD97LM8C1DOOUEC8OI0VFYWYB7MNE31P06MTHEBT3KVLCGPG0FJERG7MDQIUUM9O18FYHIE8A3XKOA2YN0HWTZFIQLSE8A9 	9LQBHJLMFLkcCFWOOUwJ8gILsFRJYB7MNEueP0qMQjEBT3KTLdGPG0FJEaGGMzQIUHM9b1QFYHIEjA3XKOAwAs0HcGyXdQLSE8wj 	Predicted:	51 	Original	52 	 Levenshtein Distance	62
9LHIKP4T7YKEYZTBZYMJHPUA4ASKCHOWQFDUAYO1ZB68XRFNNG13YQQKUZ7TDQYLDSD5YQULD8MOJFUXHVT3YF18FMCI0O9QKNTP 	ILaaDPaTjYKEgZTBZrGJHRrAwzSKaDiWQnNUAVO1ZBW8XRFNNG1AYQJKwZzTDMGLDoDcYNUCDtMGJkUXGiTlYK18FmCI0l9GKNTP 	Predicted:	49 	Original	46 	 Levenshtein Distance	44
R849MVEQRRUPA7URP0IXI320DXR42YV05GEDC8DG2AEBFWY6ZTZVQ1GZI76E43ZTIRPHNCFO4GL5ZUM557M3H70V165QQCBSEE7D 	IGc9haEtRMUmA7UIP0JXI32MDXcLCptI5XBMH8DG2AEatsYFeqdkMcGHIArEnmiTXlPHNtFO4qL5ZWYX5BR3HD0WZ6amQloWQS7J 	Predicted:	38 	Original	19 	 Levenshtein Distance	36
776ASSRSFPOTWLAO8T3EFI58X9R9OUNCTS5X1DWX45WE8FDILG7NX8ZEKVPW7LZUPJZAF2HVPCKUCUZ5889WLR74H380B3P4WAIF 	Y7sATStSToeTULVO8TaESLqYXTR9OUDKTS5n1lCX45WE8FDDLr7eX8ZEZVPW7LZUPJZgniHAdEKspUZ58PiuxR7At380POd4hAIv 	Predicted:	51 	Original	48 	 Levenshtein Distance	59
WUGVHOU6GQFN5XN5Y1SZJPBY101HRAVOO7HEUL0P4THGHJCJTQI86O214AG19UWN92JVFOM52RM4ITRVP8VM7R90L4I99T1P5QM9 	WUGVHOMsGbKstXN5YHSZJPBe1p1HIuIdOPyjULRyXiHGHEtJpQIL6rXH4bGkyJMIyAMSNLMu2RQfIFRGtcOMxR9MD4IqgTOzRtRC 	Predicted:	0 	Original	18 	 Levenshtein Distance	39
WOH8NT0CQ403FSJFJJ42O1A7KQ5HJQLXVE0YV9Z8B7E6JX8NHURA9JBGFRD1CE7V93I7M15R2UI3LZRO5WUDYW1J6VHUSBT1LFYM 	WoCvNT0CQf03qBJFJJZOMaAESQ5HJQLXVE0YarjDBbE6JXzAVURR9JILFRyyLE7Xsxo7Mb5RzqNMazgO5WUDyWpL6VChSBZeDFYi 	Predicted:	38 	Original	43 	 Levenshtein Distance	58
XMESC4GO529WB52U9YZ6E7WGAHOLQ2VWQOCRHRDYSHSFEF7KD5WX1UJR7J8NZB76CF6UJUOATIYOZC1TC9X1FG6YVIG1M1HEMIY0 	XMjSD4kYH29eB5UT9Yu6jeKkAHOsI2pWQiMRuwAYdQSfEF7KG5WLwUSv7lNmfEE6CBnUbhmCnvQFxSbTP9c1WZ6YDTUcM1ZeyPLA 	Predicted:	42 	Original	12 	 Levenshtein Distance	44
55VM0ECNKUXMEYVRUNS2ZWDV23WQHS6IXDK3WA265CYMMQTKMR3D32BWHKOG2DDX2NXMCM8M5MC5PAQDXBS30VWNO6H2RBNDJ4RE 	MBUMrNrhKUXnhmUscASwFWMRmgAfISLeXsK3WAelLviMJKFpgD3DivuWGKBGPVYL2YWDNM8f5MG5PsQDiHZ30VWNP6Q2RBBny4xu 	Predicted:	26 	Original	2 	 Levenshtein Distance	39
UYBP9ZRZS6Y0DIOUJNLNQ9FZZW6I7KUE1RFI64TBUPNXEIH2E2J45JTOICG7VSBZT57V0YQIP1E9F165XT9XVKFPF039SUK65EW2 	UYOccZRwZvz0gIOUJNLDQ9EZec6I7KUEZvFIi4TBUPNnEujcE2bR5JTOIuGCVSBZv57V0eQIP1l9q1Z5RTUuVKyPKO39qUb65vW2 	Predicted:	51 	Original	56 	 Levenshtein Distance	57
ZJUJDGRBHQNRF4BNKWCMBWL8SZOOGCK04BAKR4PYXJO77G2UGJGX8ZGKQH0QYKKM8855DASZ228ALZF87F4TDOAGCQ7Z2DABP787 	ZJZJDGRnHPBRd4BNKxoMyWnmSjOCGCm04NAwh4PYXJJ7eIIUGJMXFZQoQgbpYsKFXvP5DANZN2MALZp87FpTwulGCQ7ZRthuPOd7 	Predicted:	38 	Original	33 	 Levenshtein Distance	48
V58EVPN0UTNFMJSK5AVZLDNYL2Y26TGGIL7ZNR5PT87XIW7QT9VAROCLYIIYIWUKVQ9G0044VJ36KPBZM09LJ705CSOU708VIXVX 	V58EVCwVdTNlMyrHgHVZLOkRv2Y2JBCiIL7ZfRQPvNgsaWkQq9VAjCskYeIYoWstXHVn004LyJHATPUrud9VJO05CSOlx0oTIQVX 	Predicted:	26 	Original	12 	 Levenshtein Distance	44
HCIBZ5O2C7QRK8K7RBEH4D8SAPBY9T1E1VIDMOSHDEV8Q719ISL7BQEJBO44JVA2PRB2C5ZH9X1NSKI6KOPLCEUTK8MR0YTT31C5 	ErIBmoVnSSIGd8KvnBUK4DuSAhBpyzrELVSDMfBHtbn8h7WLYSNmBQZJBy4TxVTyKRXkH5NuOXlNQKI6qOPLhEaTTQMNaYTaonCt 	Predicted:	0 	Original	8 	 Levenshtein Distance	29
1816MARW57XEBCFS475CTRHJBPU08IP1J011FYNU4AK08FD2J3VHMQ4AA227UFPQ1HZ2XPK2UZ29AOF1AV4D867FBWMT0D81YT9Y 	hmzrMARFA7BanLFS4rLoTucCBbK08IPeJ0ClFONU4zvg8FZsdusANl4AA227MaeQuHSWXLvvUZL9AjS1AntY86GFuWMFdD8OYT9U 	Predicted:	26 	Original	16 	 Levenshtein Distance	43
NL2ZZIAIW21YS1X3I0RR4ILQIHRR25T49YMH7V51GRGU1J2JRSGX0SGIXAEPN4WA7Q2R3ZWDOUWX7PV0OVTV60HHLVF7EYEUEJVY 	UL2LpmIIW2FYk1X3h0RR4IAQxHRR25TuhYTZ7Va1GRGU1GLJRSjX0SGIXAEEA4WAiQ2w3YWDSUWP7LV0OqTYjuHHLVFzEbEUEJVT 	Predicted:	63 	Original	58 	 Levenshtein Distance	68
TH6M4DRABJF3TEN3ER51GFA0XLEB42QSGV6KONJOHGX0UFD49XNEITKSK8LBMUBJW02N8AVG5URPK8Q7PJ04214LH8L8A8JMCC8O 	TB6M4DMAoNFcTEN3ERO1xhA0ILEBR2chGVcKOBsOHVXktuD4SXNbIFKEKQLRMUBJd02NKAVGVURQKIQTci042R4LHHL8AVYMCp8y 	Predicted:	53 	Original	40 	 Levenshtein Distance	48
TGN29V6I4UC6ABONHXQ037B6M2WYL8SMUANDWPX25XKBZQXXZA2MMPT7EU26XDHGTFKZ6QP4PEG4KWDYT5BXMNIVCDSLYQ7YBDKT 	TGN29V6I4UCUABONHXQ037BTM2AYL8SMUANDWPX25XKBZQXXZA2MMPT7EU26XDHGTFKZ6QP4PEG4KWDYT5BXMNIVCDSLYQ7YBDKT 	Predicted:	94 	Original	97 	 Levenshtein Distance	97
U5NCTIDPL0RZBE9Q2F0ZL7XQ15XSJSRAFMWR1QRDVGHG9CF7BVIQDXNK07B52RJMNDVO87TU9XS264P1OY6UI601420KYCXS5AMT 	U5NkTIDPL0RZBa9QOFoZR7XGj5XrJSkAbMWo1QuDHGHekxHQBVdxDfNK07L52RprNuVvfURy9XS264S1OVgUs60VXcojcCoS5kkW 	Predicted:	42 	Original	45 	 Levenshtein Distance	58
EVX8TN3VD1Y7S52OBN038L6TN5L3RUBCNTD3Y0K1HP0HXEWXUFED5LCY0GNTLNDUXND7SDH92PO3VXIOTZ621COGRP6JUGY5I4ZM 	Zuk8TN3VD1j7u52YAN038v6TKqL3RUBCqTD3Y0K1HP0HXEWXUFEshLCYcwNTLNDUXND7vDHhgPO3rXIfTZXD1mOGRPhJzrYdI4ZM 	Predicted:	53 	Original	67 	 Levenshtein Distance	73
KHACNNTTSMSLCRQKPF5K6RGCC3FF1DKOILJS9A6UP5MKKTLQZGFY2UZCYFLPM8PDGKR644YXD55G59R4TTI0NJSUKMHF1E6SEN2Y 	KfACKNTgSMSLCRtKkF5K6RKCC3FKTDKOIKJS9ACgP5UJKTLQZkFYkUkCYFLKM8PDGKh64fYXDa5P59R4TTIXNJSSsMHF1EXDfWvY 	Predicted:	61 	Original	68 	 Levenshtein Distance	71
8IA3E711D59OCQ901HRH1PDEYFGZN04EP8FD0B4218PV2EB56LMD30Z7J8WG1NJFYPD4G5TBBX8VH0UCD1DL456CN59PT1TOHYUQ 	8IAir7Z1D59OCQfW1HRHOxACYUGBN04LP8LD0u421PPV2GBf6LMp30W7DcWG1AJtWPDeG5TBBX8VHPtCDaDL45lCJZjTh1TOHCUQ 	Predicted:	58 	Original	57 	 Levenshtein Distance	42
5TNZSBF2GP1VKA27WAO77NO23QKPB3GO9HNHM05TLRMLQ3ZPU8WB066G79U9O8NGM84X3MPLQ9AB9A8DW6DJ9FKS7M0W43O29LPX 	5mdESIv2GP1VKA27WAp7wbK23QLPBjsOlUHHMk5TLRSMm3ZkZxJk066GosUCc8NGMfIX3MPLQ9kn9AADWQDJ9FKImM0RAJO2vYrX 	Predicted:	45 	Original	50 	 Levenshtein Distance	60
UIW0HEO46DG9UTOE9PBHBZV3TFNQGGDFJBZ56EDJSR1LRI8K60DM88UN3LCMYM4WR93RTVN0723LIZPTZ2O1RLH3TL64I4ZYNNKK 	UIW0HEO46DG9KTOkJPBHBkV3TFNQGGDFJBZ56EDJSR1LRp8K60sO88UNKLCMYM4iR93RTpN0723LIPPTZMOGRLH3TL6RI4ZYoNKK 	Predicted:	75 	Original	83 	 Levenshtein Distance	85
SAGCGNT43OIZNVF5GKWS40CUKFH23ESTLOUKG2TB6H3TOSZDNT4440SEVMTH0QDZ8Q0YSB7ERK0XATLA4VW0PZNCENOG8EJ8FL2V 	RPkWGNoAPOIZNsF5GKePmpCUiFp23ESTDOqKaovPlG3NOSZEjTe44BSxVMwHDQsYcQ0BSl7zRKXXmJLA4VWFZZRCEiOGyBJZFT2V 	Predicted:	42 	Original	41 	 Levenshtein Distance	53
5QKH3D3XBI4B2S30S479654YS7NS3R59KTZHWUEQPZZ1YYDWN4OT27HPLOZ8TM9QB5TT0RPYB5MDKAF94Y0N2RI053SYRASB4X49 	wQKMNDoaDIVB2S3vCMr9X5uSOvNS3R5SKdZHuwTQsYZ1CPDQN4WTOyHPNCZATo9QBEVc0LPEy5eHKsF94kEg2DIM53ShRzaBpuhv 	Predicted:	40 	Original	27 	 Levenshtein Distance	44
U599RV9D3QAYMNIHZO2G30432R6IOM1DQR63DKHIXK8WZOF3BFI18VU4QJA53V5UNRP73C4EPQ6ZD8VJD33SHBS09WF8KSRN8NZ3 	ReI9HZ9D3cAYKNIHUOLGeo43bRYpTOzDQRVFpFPusKubROC3BZIn8VU4QJA5dVQZbaWeZVpSPQgZV8DJD3IsixMK9WjiKvij8NZJ 	Predicted:	26 	Original	12 	 Levenshtein Distance	47
EXTV67EIZ6LZM7N68A5JUVILU841PG6ZR21NGJLGCKS4HKEI2CQY4NJV4CF9SVZRZVKP022TQTJPIU8GOSKQNE6FMYRVMQD0F52K 	lXTV6PEIZ6LkM7NP8LyjUVQLU841PGEZR21NTJLGCKf4ZKEI2jQY4NKV4CFxSVZRGVUP02ATQTNPIU8GOSKtNEjUMYRVMQD0Fixw 	Predicted:	68 	Original	68 	 Levenshtein Distance	76
B8NE7E8JNPH71SAKXAORORIYSM0LIXAJPU6LIV6PQPXX2DBPICBP8CRR0SQ4SBZW649MYQTFR6G5UEQWHUQGH1PS89VU1FV9EIKF 	B8DE7MOJNPJVsNAKwAORGFIYSQCLIXAWPUZLIa6PQPXXrdBPXCMOPTRR0hQ4MBgWQ49rDaTFUPG5iRQWdNQaJaWSA9VUBfV9RIKF 	Predicted:	58 	Original	43 	 Levenshtein Distance	61
W8G23SULP9PHP9DXK8COY1ZOXF1R7YAK63D5KJIBUA1PN2TTSP8BAV300GTAM1Q1XNHQPWDPBK6I8767CE4MFW30KV8PBCQF99ID 	WPG23FRLJDPyPLDXK8KOY1ZSJLnpOIaKS3HCKgXeUrIPNDcTSQ8Mlv3FTGewtkQaXNOvPPQdBF6Iwb6nxnpimo30vVbPaCAb9rIY 	Predicted:	18 	Original	1 	 Levenshtein Distance	47
DOLK72Y8KVG87AVGDEMZ1CZ5HCJWPSWIXEZGR37FTCULVDR0CHQC1URDT8P3RI6VT1XIDX3T2JBJ1MWVN5P1WR6FMME9V94N2R9Z 	DOLK7sY8KVG87AVGDHMd1CZ5HCoWMSWIXUYGRV7FTCrLVDR0CFQCPURDTIPeRt6Vg1sIDXPT2JBJhMoVN5b1WR6FMhEUe94rHcQQ 	Predicted:	60 	Original	65 	 Levenshtein Distance	73
87I307OPY21055FUNEXLRHXLG60VA028LVQ2PPYS8AV9HDAXW6V49BCXIJGFUQHMF36OTMX79KC8C49JNKL6GUQD6BD3QT54R4QF 	87V3POjPYeQB55FiNEXwRHXJKD0VG028LVQiPPPS8AbfNEAXUbbm9BCXIhGFEQHMF36oTYX79KCUxB9SzKjGGuQD6BD3HTw4R4UF 	Predicted:	53 	Original	53 	 Levenshtein Distance	65
LVCS83UVQN27MOGSZXWLII28CJGJFPTIQ53A5437A9E2HES5UQRJ262HIEU66GJNLFHEMFFRS1KUMEOW5TQS0E33L7XF6YSC72R5 	EVeS83UVCNupoFGFZoWLzbM8aJGFFPMIQpEAHx37ASENHESdUZRvBs2HIEz66GJNxBHRizFRSCKKWEOWFSvSgg33L7XFskSh72r5 	Predicted:	45 	Original	32 	 Levenshtein Distance	58
LA3DQITISLV39H2Y5HK8X08SX1KFSWH78C0OAWEVXX0PZYKEISF4945OECPUVLALM67MFV83JU8UQ7CXA701XG4HZG43Y59YQLWW 	gA3ljILySFV3QN2YZHJFXN8vXswEoWH7GCmOAPNVXX0yZYLEKSFG9S5OECPUULALM67MFV8sSv8UQEiXAZ01XG4HLs43YC9YQLWj 	Predicted:	57 	Original	56 	 Levenshtein Distance	63
QC8JVY6IXK0F46YBNLJXJ44P4GZHWCW882Q4QARKGRC5LOHXNP3YJT8SK0MIAY10ULVQ3L596RWXIV1MABCQYTRTJCP65NPP7094 	wCjvVYlIeP0FFBZsbtJbz4KPXbZOoCWD82QKQAyKGLe5yfJXaPoDAXzocxMIHY10JLKQ3fMXGqbCIVQuTqWNYTRTJxb6ibPMAFso 	Predicted:	0 	Original	14 	 Levenshtein Distance	36
4TCOZ9R29TJJCUHICD69XO48QWAI2WW58H31388R70YQJFJLHU535Q9UD19L6OOJMZWUXS47SBEC9W7GVB06U58TA4TEUJPC90FZ 	4TCwZ9R29TJJCUHICD69ZO4RQWAI2HW5ZH31388R70YQJFJLHU5M5QQUD19I6OOJMZWUXS47XBEx9W7yVO06Zu8TANvEUJPC90FZ 	Predicted:	84 	Original	81 	 Levenshtein Distance	85
MU2TQ1EJOJ7G35NFSFCSWAHHNKZMNGXMKCZB9OLM16V32B1SA4GJTW0RI0C4RG2G7RYIKXY3SPBSZH8ECLYPER6KJVYOOLY5BTF9 	MUFDQFFJipHogtNFSTnSvbqSRKmMNGIaKCgXXnRRHpV32LISAFZITW0eI0dYIGoJ7IOwsXxhSaySZe8SVLYYEP6jmKBalLeyBTFa 	Predicted:	0 	Original	12 	 Levenshtein Distance	20
W2CS0PCAIM4V4R7GCEFHLJGQF4AQTYX2Y97BNNIMI11UF854OHJ0I7KB78OGRMSYA2SZ1O4W1ONF0R83A43LP2PDOZLG6EZKMNW2 	W2CS0PCAIM4V4d7GVxFHLhGIF4AQTYX2Y97BNNXMI11UF854OHD0I7Ks78OGRMSYA2SZ1O4W1ONF0R83A43LP2PDOZnG6ESKMNW2 	Predicted:	89 	Original	90 	 Levenshtein Distance	90
Y05ZJP092O8WH861TDZ16A6CGANEP4044RF5HCQGQI0C8GUFW74667LVROSC4UU9IT5GLNXUWS8OBYPI9XL6FAR3466N2PVAG67K 	Y05ZPAqt2O8PM8X1AJkP6ITMGsNjR4d44Re5eCQWtPLobyUkQtVfN7MVqISaUUU9ye5IwNXdPSWOBYgD9XH6XUW34WPIaPbAu6ya 	Predicted:	40 	Original	20 	 Levenshtein Distance	33
VAA8SPFAP053VH3S24OV5Q6R5SDPABGOA35YK2YLQ80E1CN4ZSACUNCZWCWD6SJY8VM8X44OYS8DXTU2QZCW3SRNMUWT4G9GR6HT 	bWY8SAFiP053OHDS24LNeQNwsSSaABGKt3lfl2miQRXMrGWFZXACUSaZWUWs6SmYkmunXk4OGU8MnTUMoECWJSRbMfQTfGqHugcV 	Predicted:	18 	Original	7 	 Levenshtein Distance	33
DRQM1JSC06R447DZFOGYJSL3T1ZATOOCTHD3HCT9RYFWQ2UDEMHJQ50LNX6B6KP119TXZ3O9DQW8E7DW8NZPFQXWE1RO4CJGX820 	DRQM1NSu0hR447DZFDGYkWL3T1hAtOOBTfD3JCTFRYFWQ2HBEMLAG50jNX6B6KPCr9nXZ3O9DQWjE7DW8orEFQXWlvRZ4iJOXG20 	Predicted:	67 	Original	65 	 Levenshtein Distance	66
G7EVR3NU0BTIOV8BUWOM4MHOVKLVC39UH1ZLL9EZAQ1TOLL12B5H5QVHTMT4YOKMUA8T0DBGB10TEK8QD5NMPASUJ7WYNDGMWKK7 	W7iVRYNU0BTIOgpBoWOM4MHOVKLVC39UH1DLL9EZAQQTGLL12X5HXQVHVMQ4tOKMWA8T0DBGB10TEK8wD5NMxweUJ7WYQDGMWEK7 	Predicted:	74 	Original	75 	 Levenshtein Distance	78
3SMGAOYW3GPN81ET58IZXOVRRT23MZZCWSCA7Q89M9279CGZPNAE6QOBT1X7D8C6C3I6ZEKPWXUZWL7J9BC1EHLP02IDXT8IXIAW 	3SEGIOCWsGbNGdJz58xZXOzRRaDKqZZCeSyAqQXBM9u79TWZIqAE6DOBT1XPV8C6CSa6iEhhWvjZcL7O9BC1pHDKz2IDhTXIyIGP 	Predicted:	45 	Original	28 	 Levenshtein Distance	52
D0N8AV4MNHG90C1RTH5GPN2KH9YMERCQDKVPUM6CA3D8YJHAXSDFX70JN0CSJ43K1ZQCPTBC1K2QN4JDLKRMRKHTK5RIB6KKYD81 	DzV8AV4MNHG9QCjzTf5CUN2IH9mMvRCQDSVPUMvCA3D8tJHGXSEFX7JJN0dSA43p1ZQCPiBC1U2kn4JDWARMFKHTKVRIB6KKYDh1 	Predicted:	67 	Original	64 	 Levenshtein Distance	72
S28F954O422VQRJFDGNZXT76DAC83W10PVU812V9BYDF8VF5ICML243OH9RZWWIZLFCYI0X4KEONHYIZYCJOX5UYTBED7NL14D5K 	Sy8FgI4O4rtetWJFDGfkXBp6DAS83WdjWMUy1FECZzDFmVe5ACMF243OS9RZdWIZEzCmINX4KEONYYIZYCSay5UumfEx7NR14F5O 	Predicted:	45 	Original	32 	 Levenshtein Distance	56
Y64DCSU4W2ZHGFKLA4F8OVTVIZUG33BSOAEYPW0NZ13NVZ78WEE6YPGHYWSTLI85IWXRQH7VE16PP8PGHFB0AVA34V4HNYFP49D5 	Y64DCSLHbXZHNFFLIjFQfVTrIWGG33BiOHSGBWyNgx3dLlOwCmt6EIGpYosbgILJDoRDQHLVEREMLmWuzFMFAVAG4K4kXZrP4Idg 	Predicted:	26 	Original	7 	 Levenshtein Distance	38
BYP18HJ362SA4BER82KY3Q4BINTDH0UCFS8JMBX266U111VBBL4FVZP0TV8PDJXVU64G2A6OKLPFRBI5VAOEXF713J3JL8GSIZBC 	BYPI8HnYhoSAFBER82KYCQ4FBNTDH0UCXrhJAzX2UrU1p1VBTLmjNeHFTXkJGJnxW6VG2I6OGBPyvjIhVAODXWg13JWJL8USIdMC 	Predicted:	49 	Original	46 	 Levenshtein Distance	54
S6LLCAWYIEYZJUADAR1MDZX7IB03HVAUJ3D1HO06YUUX979UPEGN2HZ7LYZAI1Z7ED01VEIE8J7Y9YFL5FQ3BYS3XI6YMUMB5KVO 	SpLpCDWYINDZZUADep1SDSX7IB0VAVAGF3DoHsNvDUUX97GUPEGN2Hh7xYZQnhZ7EDe1pOIE8JpYTYWL5FV3BVSbXT6YMUNvIzuh 	Predicted:	53 	Original	41 	 Levenshtein Distance	60
BIJ71F988PQ6211N9QMEESCYPWY1R1MPIN4PJDH8YYFOVIFVOY54NOY3XPYN2W14SZIW9RVOD2PGWB4ECYIKFATVOQEZZFEC0ED1 	BIbl1F9t8PFPJodN9QMEESCRdWYlR1MGIN4PLDH8ztfOsIJuOrF4NOY3XPYN2M14SZIb9TVOY2PeQg4EXYRKFiqVOcJDgDEc0EDO 	Predicted:	57 	Original	51 	 Levenshtein Distance	58
1C6KGRFN2VTYG0P15PRNSQLZABWUZXVM8CD60VCLSGJLWYE6JY13GS4S3UFD21F56406OC4JM8M88S6BFNA8912HFRABRWBLAMR0 	fMIKaDFGOaTYa0X15PjVSQLZAGWeZXVP8CDdpVCLMGYLbYE6Ju13GD4S3UFDu1FHv406OCQJZ8Mq8S6BFNPZ912HjMABkNBVQMR0 	Predicted:	63 	Original	49 	 Levenshtein Distance	64

In [27]:



39

In [ ]:


In [ ]:


In [ ]: