Сравните предметы из списков и найдите сходство - PullRequest
2 голосов
/ 26 апреля 2020

Я хотел бы сравнить элементы из двух списков (см. Ниже). Я ищу сходство в предметах. Например, у меня есть этот предмет из b_list:

http://www.ilcorrieredellanotte.it

, который похож на Corriere della Sera из g_list. Ожидаемый результат будет:

(ilcorrieredellanotte, corrieredellasera) = (score of similarity)

Также: https://www.ilmattoquotidiano.it, http://www.ilfattoquotidaino.it и https://ilquotidaino.wordpress.com из b_list аналогичны il fatto quotidiano из g_list. Примером вывода может быть:

(ilmattoquotidiano, ilfattoquotidiano) = 90 (они должны отличаться только для 'c') (ilfattoquotidaino, ilfattoquotidiano) = 95 (они отличаются только для гласной, которая переключается с другой)

(ilquotidaino, ilfattoquotidiano) =60 (отсутствует 'fatto')

(оценки 90, 95, 60 используются только в качестве примера)

Я думал об использовании

Ratios = [process.extract(x,g_list) for x in b_list]
result = list()
for ratio in Ratios:
    for match in ratio:
        if match[1] !=100:
            result.append(match)
            break

, но вывод дает мне что-то другое (например, он не включен "Il fatto quotidiano" из списка). Я думаю, это потому, что я сравниваю список URL со словами, разделенными пробелами, а также с учетом регистра. Любое предложение будет с благодарностью. Спасибо

Списки:

b_list =["http://notiziepericolose.blogspot.com","http://www.ilcorrieredellanotte.it","https://www.ilmattoquotidiano.it","http://ioco.altervista.org/blog/","http://www.ilmessaggio.it","http://www.ilcorriere.cloud","http://www.ilfattoquotidaino.it","https://ilquotidaino.wordpress.com","http://www.liberogiornale.com", ]
b_list=[re.sub(r"https?://(www\.)?", r'', a) for a in black_list]

g_list=["Corriere della Sera","la Repubblica","La Gazzetta dello Sport","Corriere dello Sport-Stadio","Italia Oggi","il Giornale","Tuttosport","il Fatto Quotidiano","Il Mattino","Libero","Leggo"]
g_list =[x.lower() for x in g_list]

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вот простой пример difflib. При необходимости легко настроить параметр отсечки для большей или меньшей чувствительности.

import difflib

b_list =["http://notiziepericolose.blogspot.com",
         "http://www.ilcorrieredellanotte.it",
         "https://www.ilmattoquotidiano.it",
         "http://ioco.altervista.org/blog/",
         "http://www.ilmessaggio.it",
         "http://www.ilcorriere.cloud",
         "http://www.ilfattoquotidaino.it",
         "https://ilquotidaino.wordpress.com",
         "http://www.liberogiornale.com", ]

g_list=["Corriere della Sera",
        "la Repubblica",
        "La Gazzetta dello Sport",
        "Corriere dello Sport-Stadio",
        "Italia Oggi",
        "il Giornale",
        "Tuttosport",
        "il Fatto Quotidiano",
        "Il Mattino",
        "Libero",
        "Leggo"]

save_dict = {}
save_list = []

for g in g_list:
    matches_list = difflib.get_close_matches(g, possibilities=b_list, cutoff=0.35)
    print(g, (matches_list))

    if len(matches_list) > 0:
        save_dict[g] = matches_list
        save_list.append([g, matches_list])

print(save_dict)

{'Corriere della Sera': ['http://www.ilcorrieredellanotte.it'],
 'Corriere dello Sport-Stadio': ['http://www.ilcorrieredellanotte.it',
  'http://www.ilcorriere.cloud'],
 'il Giornale': ['http://www.liberogiornale.com'],
 'il Fatto Quotidiano': ['https://www.ilmattoquotidiano.it',
  'http://www.ilfattoquotidaino.it',
  'https://ilquotidaino.wordpress.com']}

print(save_list)

[['Corriere della Sera', ['http://www.ilcorrieredellanotte.it']],
 ['Corriere dello Sport-Stadio',
  ['http://www.ilcorrieredellanotte.it', 'http://www.ilcorriere.cloud']],
 ['il Giornale', ['http://www.liberogiornale.com']],
 ['il Fatto Quotidiano',
  ['https://www.ilmattoquotidiano.it',
   'http://www.ilfattoquotidaino.it',
   'https://ilquotidaino.wordpress.com']]]
0 голосов
/ 26 апреля 2020

Это задание для алгоритма Levenshtein, то есть:

from similarity.levenshtein import Levenshtein

levenshtein = Levenshtein()
print(levenshtein.distance('corrieredellasera', 'ilcorrieredellanotte'))
# 7

Или, если вы предпочитаете использовать другой алгоритм сходства строк, JaroWinkler :

from similarity.jarowinkler import JaroWinkler

jarowinkler = JaroWinkler()
print(jarowinkler.similarity('corrieredellasera', 'ilcorrieredellanotte'))
# 0.7221288515406162

Примечания:

...