【问题标题】:Compare items from lists and find similarity比较列表中的项目并找到相似性
【发布时间】:2020-04-25 23:32:04
【问题描述】:

我想比较两个列表中的项目(请参见下文)。我正在寻找有关这些项目的相似性。比如我有这个来自b_list的物品:

http://www.ilcorrieredellanotte.it

类似于g_list 中的Corriere della Sera。预期的输出是:

(ilcorrieredellanotte, corrieredellasera) = (score of similarity)

另外:https://www.ilmattoquotidiano.it, http://www.ilfattoquotidaino.it 和来自b_listhttps://ilquotidaino.wordpress.com 类似于来自g_listil fatto quotidiano。输出示例如下:

(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]

【问题讨论】:

标签: python similarity fuzzywuzzy


【解决方案1】:

这是一个简单的 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']]]

【讨论】:

  • 感谢您的回答@Matthew Borish。请问如何才能将值不为 null 的项目保存在列表中?
  • 当然,如果您想存储您的项目,我添加了 save_dict 和 save_list。
  • 非常感谢@Matthew。真的很感激。
【解决方案2】:

这是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

注意事项:

【讨论】:

  • 谢谢@Pedro Lobito。但是如何迭代列表中的所有项目?问题是第一个列表有 url(但很难应用 url 解析,因为它不是一个 url,而是一个字符串列表),第二个已经提取了 netloc。
  • 不客气,但我不确定我是否完全理解您正在寻找的输出类型。你能用所需输出的样本更新问题吗?
  • 是的,我已经用所需输出的样本更新了问题。
猜你喜欢
  • 2012-12-26
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多