Моя проблема немного отличается от простого сходства слов. Вопрос в том, существует ли какой-либо алгоритм для вычисления сходства между почтовым адресом и именем.

    for example:
    mail Abd_tml_1132@gmail.com
    Name Abdullah temel
    levenstein,hamming distance  11
    jaro distance  0.52

Но, скорее всего, этот почтовый адрес принадлежит этому имени.

2
abdullah temel 12 Апр 2019 в 11:01

2 ответа

Лучший ответ

Нет прямого пакета, но это может решить вашу проблему:

Создание идентификатора электронной почты в списке

a = 'Abd_tml_1132@gmail.com'
rest = a.split('@', 1)[0] # Removing @
result = ''.join([i for i in rest if not i.isdigit()]) ## Removing digits as no names contains digits in them
list_of_email_words =result.split('_') # making a list of all the words. The separator can be changed from _ or . w.r.t to email id
list_of_email_words = list(filter(None, list_of_email_words )) # remove any blank values

Создание имени в списке .

b = 'Abdullah temel'
list_of_name_words =b.split(' ')

Примените нечеткое совпадение к обоим спискам.

score =[]
for i in range(len(list_of_email_words)):
    for j in range(len(list_of_name_words)):
        d = fuzz.partial_ratio(list_of_email_words[i],list_of_name_words[j])
        score.append(d)

Теперь вам просто нужно проверить, больше ли какой-либо из элементов score превышает пороговое значение, которое вы можете определить. Например:

threshold = 70
if any(x>threshold for x in score):
    print ("matched")
1
Rahul Agarwal 12 Апр 2019 в 10:12

Fuzzywuzzy может помочь вам с требуемым решением. Сначала удалите '@' и имя домена из строки, используя регулярное выражение. После этого у вас будет 2 строки:

from fuzzywuzzy import fuzz as fz
str1 = "Abd_tml_1132"
str2 = "Abdullah temel"

count_ratio = fz.ratio(str1,str2)
print(count_ratio)

Выход -

46
0
Naitik Chandak 16 Апр 2019 в 06:37