【问题标题】:optimizing a nested dictionary result优化嵌套字典结果
【发布时间】:2021-09-07 19:15:06
【问题描述】:

在我的代码中,我想从一个句子中创建一个嵌套字典。在我的字典中,我有一个键,它是句子的一个单词,它的值是一个字典,它使用模糊匹配告诉我它与句子的其他单词的相似性。关键是,如果我们认为我的句子像

my_text = "Have you ever Want" 和我的输出为

{'拥有':{'你':0,'曾经':50,'想要':50},'你':{'拥有':0,'曾经':0,'想要':0 },'曾经':{'拥有':57,'你':0,'想要':33},'想要':{'拥有':50,'你':0,'曾经':33}}

我想删除重复的组合,例如曾经和曾经有过的组合,但我不知道怎么做!这是我的代码: '''

from fuzzywuzzy import fuzz

my_text = "Have you ever wanted"

str_list = my_text.split()

job_dict = {
    k: {}
    for k in str_list
}
# new_lst = []
for key in job_dict.keys():
    job_dict[key] = {}
    for key2 in job_dict.keys():
        #print(key, key2)
        if key == key2:
            continue

        job_dict[key][key2] = fuzz.partial_ratio(key, key2)

print(job_dict)

'''

【问题讨论】:

  • 您提供的示例(拥有/曾经和曾经/拥有)具有不同的值/权重(50 和 57)。什么确定了可移动的候选人?
  • @jarmod 我可以通过在我的代码中使用 token_sort_ratio 而不是 partial_ratio 来解决这个问题。因此它们将具有相同的值,并且必须删除其中之一
  • 顺便问一下,你想在这里实现什么?计算给定句子中的一个词与同一句子中的另一个词的相似度有什么价值?
  • @jarmord 首先我想知道我该怎么做,其次,如果这段代码有效,它不会应用于句子,它将应用于我的 mongodb 集合的字段有很多字符串。这是一个数据清理任务,我们需要知道单词的相似度

标签: python python-3.x dictionary


【解决方案1】:

我建议使用itertools.combinations 生成任意两个单词的所有组合:

import itertools

combz = itertools.combinations(str_list, 2)
print(list(combz))
# [('Have', 'you'), ('Have', 'ever'), ('Have', 'wanted'), ('you', 'ever'), ('you', 'wanted'), ('ever', 'wanted')]

然后你可以继续你的代码:

import itertools

my_text = "Have you ever wanted"
str_list = my_text.split()
job_dict = {}
func = lambda a,b: a+b  # For example purposes
for k1, k2 in itertools.combinations(str_list, 2):
    val = func(k1, k2)  # replace func with fuzz.partial
    if k1 in job_dict:
        job_dict[k1].update({k2: val})
    else:
        job_dict[k1] = {k2: val}

print(job_dict)
# {'Have': {'you': 'Haveyou', 'ever': 'Haveever', 'wanted': 'Havewanted'}, 'you': {'ever': 'youever', 'wanted': 'youwanted'}, 'ever': {'wanted': 'everwanted'}}

【讨论】:

  • 在我的内部字典中,我有从模糊中得到的费率。关键是,我不想对组合进行两次计算,因为对于大数据,这不是有效的例子:我希望在我的输出中只有一次拥有和你的比率,而不是两次或三次
  • 答案没有任何重复。
  • @NagabhushanSN 观察到,上述结构有 0 次重复 (find out more about combinations)
  • @NagabhushanSN '拥有': {'you': 0, 'ever': 50, 'wanted': 50}, 'you': {'Have': 0, 'ever': 0 , 'wanted': 0} here I have , HAVE 和 YOU 然后 YOU 和 Have 是相同的,我希望它只打印一次
  • @KIMIAGhassemzadeh 这不是来自上面的代码(键 you 不包含 Have)。看来您是新来的,但如果您懒得看建议的解决方案,恐怕您找不到您想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多