在其他内部字典键的每个组合中搜索内部字典键的每个组合,也在外部字典键的每个组合中搜索

问题描述 投票:2回答:1

我不确定标题是否很好地描述了我的问题,但是如果出现问题,我将在以后进行编辑。我检查了很多与此相关的问题,但是由于代码是如此嵌套,因此我在编程方面不是很有经验,因此我需要使用无法处理的combinations

我有一个嵌套的字典,与此类似:

example_dictionary = {'I want to eat peach and egg.':{'apple':3, 'orange':2, 'banana':5},\
                   'Peach juice is so delicious.':{'apple':3, 'orange':5, 'banana':2}, \
'Goddamn monkey ate my banana.':{'rice':4, 'apple':6, 'monkey':2}, \
'They say apple is good for health.':{'grape':10, 'monkey':5, 'peach':5, 'egg':8}}

我正在尝试通过遵循一些规则来构建邻接矩阵。规则是:

[1)如果任何一个内字典中的一个单词存在于任何句子中(外字典键),则在相关句子之间添加一个权重作为该单词的值。

2)如果两个句子中的任何一个具有相同的内部dict键(单词)但值不同,则将单词的值相乘并在相关句子之间添加权重。

额外说明:内部dict可以具有不同的长度,相同的内部dict键(单词)可能具有不同的值。如果它们具有我不想考虑的相同值,我希望它们仅在这种情况下相乘。

示例:

Sentence1(0): I want to eat peach and egg. {'apple':3, 'orange':2, 'banana':5}

Sentence2(1): Peach juice is so delicious. {'apple':3, 'orange':5, 'banana':2}

Sentence3(2): Goddamn monkey ate my banana.{'rice':4, 'apple':6, 'monkey':2}

Sentence4(3): They say apple is good for health. {'grape':10, 'monkey':5, 'peach':5, 'egg':8}

在0和1之间:5 * 2 + 5 * 2 = 20(因为它们的苹果具有相同的值,只需将橙和香蕉的值相乘。任何句子中都不存在任何单词。)

在2和3之间:(2 * 5 = 10(猴子是具有不同值的同一个钥匙)+

6(句子3'apple'的关键字在句子4中存在)+

5(句子3中存在句子4“猴子”的键)= 21

0和3之间:3 + 5 + 8 = 16(句子1中存在句子1键“ apple”,句子1中存在句子4键“ egg”和“ peach”。

我希望这些例子能清楚说明。

我尝试过的(由于嵌套的结构和组合,这让我很困惑):

from itertools import combinations, zip_longest
import networkx as nx

def compare_inner_dicts(d1,d2):
#this is for comparing the inner dict keys and multiplying them
#if they have the same key but different value
    values = []
    inner_values = 0
    for common_key in d1.keys() & d2.keys():
        if d1[common_key]!= d2[common_key]:
            _value = d1[common_key]*d2[common_key]
            values.append(_value)
            inner_values = sum([p for p in values])

    inner_dict_values = inner_values
    del inner_values  

    return inner_dict_values


def build_adj_mat(a_dict):
    gr = nx.Graph()
    for sentence, words in a_dict.items():

        sentences = list(a_dict.keys())
        gr.add_nodes_from(sentences)
        sentence_pairs = combinations(gr.nodes, 2)
        dict_pairs = combinations(a_dict.values(), 2)
        for pair, _pair in zip_longest(sentence_pairs, dict_pairs):
            numbers = []
            x_numbers = []
            #y_numbers = []
            sentence1 = pair[0]
            sentence2 = pair[1]
            dict1 = _pair[0]
            dict2 = _pair[1]

            inner_dict_numbers = compare_inner_dicts(dict1, dict2)
            numbers.append(inner_dict_numbers)

            for word, num in words.items():
                if sentence2.find(word)>-1:
                    x = words[word]
                    x_numbers.append(x)
                    numbers.extend(x_numbers)
#                if sentence1.find(word)>-1: #reverse case
#                    y = words[word]
#                    y_numbers.append(y)
#                    numbers.extend(y_numbers)

                    total = sum([p for p in numbers if len(numbers)>0])

                    if total>0:
                        gr.add_edge(sentence1, sentence2, weight=total)
                        del total
                    else: del total
                else: 
                    continue
                    numbers.clear()
                    x_numbers.clear()
                   #y_numbers.clear()

    return gr

G = build_adj_mat(example_dictionary)
print(nx.adjacency_matrix(G))

预期结果:

(0, 1) 5*2+5*2=20
(0, 2) 3*6=18+5=23
(0, 3) 3+5+8=16
(1, 0) 20
(1, 2) 3*6=18+2=20
(1, 3) 3+5=8
(2, 0) 23
(2, 1) 20
(2, 3) 2*5=10+5+6=21
(3, 0) 16
(3, 1) 8
(3, 2) 21

输出:

  (0, 2)        23
  (0, 3)        6
  (1, 2)        23
  (1, 3)        6
  (2, 0)        23
  (2, 1)        23
  (2, 3)        16
  (3, 0)        6
  (3, 1)        6
  (3, 2)        16

通过比较预期的输出和比较的输出,我可以理解问题之一,那就是我的代码只是检查sentence1中的单词是否存在于sentence2中,但没有做相反的事情。我试图通过使用注释掉的部分来解决它,但是它返回了更多的废话结果。我也不确定是否还有其他问题。我不知道如何获得正确的结果,这两个组合和嵌套结构使我完全迷失了方向。很长的问题,很抱歉,为了清楚起见,我描述了所有内容。任何帮助将不胜感激,在此先感谢。

python dictionary graph combinations adjacency-matrix
1个回答
1
投票

您可以使用以下功能:

© www.soinside.com 2019 - 2024. All rights reserved.