【问题标题】:Drop similar word in a tuple list在元组列表中删除相似的单词
【发布时间】:2020-03-19 23:42:12
【问题描述】:

我有一个这样的元组列表(phrase, score) : [('center', 1), ('car center', 2), ('rental car', 1.5), ('car center', 2), ('租车中心', 3), ('天气', 4), ... ...]

我想按规则消除重复的短语:

如果一个短语包含所有出现在另一个短语中的单词,则删除得分最低的单词。 例如,'car center' = set(car, center) 是 'rental car center' = set(rental, car, center) 的子集 如果两个集合只相交而不是另一个的子集,我不会丢弃其中任何一个。

除了运行嵌套的 for 循环并在循环期间弹出项目之外,我想不出更好的方法。我也考虑使用集合和交集,但我需要比较所有两种组合,有什么办法不会错过任何一对组合并有效地做到这一点?

输出是短语分数元组的列表,因此人们不会找到具有两个短语且其中一个是另一个短语的子集的对。

【问题讨论】:

  • 您对该示例的预期输出是什么?您是否删除了另一个中包含的所有内容中最低的?
  • 现在,将这个想法扩展到 3 词和 4 词短语。您如何在“拉瓜迪亚国际机场租车中心”中找到“机场租车中心”?您要求的是开放式算法和设计,这对于 Stack Overflow 问题来说太宽泛了。重新参加介绍之旅。当您准备好询问特定编程问题时,请发布您的minimal, reproducible example,我们会提供帮助。
  • @Prune“机场租车中心”和“拉瓜迪亚国际机场的租车中心”只在“租车中心”相交,但它们不是彼此的子集,所以我不会丢弃其中任何一个。
  • @rasaar 输出将是一个元组列表(短语、分数),但不存在一对帽子有两个短语,其中一个是另一个短语的子集。
  • 您的帖子说“如果一个短语包含所有出现在另一个短语中的单词”。我发布的案例具有该属性。如果这不是你想要的,如果它包含整个短语,那么请更新你的问题以反映它......你应该能够为问题制定一个简单的解决方案。

标签: python string list tuples


【解决方案1】:

沿着这些路线的某个地方:

a=[('center', 1), ('car center', 2), ('rental car', 1.5), ('car center', 2), ('rental car center', 3), ('weather', 4)]

d = {}
keys_to_remove =set()
for i in a:
    keys = d.keys()

    for key in list(d.keys()):
        if (i[0] in key):
            d[key] = max(i[1],d.get(key))
        elif key in i[0]:
            d[i[0]]=max(i[1],d.get(key))
            keys_to_remove.add(key)
        else:
            d[i[0]]=i[1]

    else:
        d[i[0]]=i[1]
{k:v for k,v in d.items() if k not in keys_to_remove}

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2021-08-18
    • 2021-12-24
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多