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

Python 在其他内部dict键的每个组合中搜索内部dict键的每个组合,也在外部dict键的每个组合中搜索,python,dictionary,graph,combinations,adjacency-matrix,Python,Dictionary,Graph,Combinations,Adjacency Matrix,我不确定标题是否很好地描述了我的问题,但如果有什么错误,我将稍后编辑。我已经检查了许多与此相关的问题,但由于代码太嵌套,我在编程方面不是很有经验,我需要使用组合,我无法处理 (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) 2

我不确定标题是否很好地描述了我的问题,但如果有什么错误,我将稍后编辑。我已经检查了许多与此相关的问题,但由于代码太嵌套,我在编程方面不是很有经验,我需要使用
组合
,我无法处理

(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
我有一个嵌套的dict,它类似于:

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}}
(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, 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
1) 如果任何句子(外部dict键)中存在任何内部dict中的单词,则在相关句子之间添加一个权重作为单词的值

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

(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
额外注意:内部dict可以有不同的长度,相同的内部dict键(单词)可能有不同的值。我只希望它们在这种情况下相乘,如果它们有相同的值,我不想考虑

(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
例如:

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
(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和1之间:5*2+5*2=20(因为他们的苹果有相同的值,只需乘以橙色和香蕉的值。而且任何句子中都不存在任何单词。)

(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
在2和3之间:(2*5=10(monkey是同一个键,值不同)+

(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
6(第3句“苹果”的键存在于第4句中)+

(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
5(第4句“猴子”的键存在于第3句)=21

(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和3之间:3+5+8=16(第4句中存在第1键“苹果”,第4句中存在第1键“鸡蛋”和“桃子”

(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, 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, 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, 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, 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
中,但没有做相反的操作。我试图用注释掉的部分来解决这个问题,但它返回的结果更无意义。此外,我不确定是否还有其他问题r问题。我不知道如何得到正确的结果,这两种组合和嵌套结构使我完全不知所措。很抱歉问这么长的问题,为了清楚起见,我描述了一切。任何帮助都将不胜感激,提前感谢。

您可以使用以下功能:

(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
from collections import defaultdict
import itertools as it
import re


def compute_scores(sentence_dict):
    scores = defaultdict(int)
    for (j, (s1, d1)), (k, (s2, d2)) in it.combinations(enumerate(sentence_dict.items()), 2):
        shared_keys = d1.keys() & d2.keys()
        scores[j, k] += sum(d1[k]*d2[k] for k in shared_keys if d1[k] != d2[k])
        scores[j, k] += sum(d1[k] for k in d1.keys() & get_words(s2))
        scores[j, k] += sum(d2[k] for k in d2.keys() & get_words(s1))
    return scores


def get_words(sentence):
    return set(map(str.lower, re.findall(r'(?<=\b)\w+(?=\b)', sentence)))
给出以下分数:

(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
defaultdict(<class 'int'>,
            {(0, 1): 20,
             (0, 2): 23,
             (0, 3): 16,
             (1, 2): 20,
             (1, 3): 8,
             (2, 3): 21})

非常感谢,你刚刚帮我从一个大麻烦和无休止的循环中解脱出来。但是如果这个词是一个短语,比如“炸薯条”,它找不到,对吗?我想我应该问另一个问题。再次感谢。@mulaixi嗯,正如前面提到的,如果这还不够的话,你需要想出你自己的
get_words
实现。万一dicts也可以包含短语,即多个单词,然后稍加修改即可,请查看我的更新答案。再次感谢,我已经尝试了一周。我根据您的规则计算并得到了其他结果。1和3项:3*6(
apple
,在两个dict中)+5(
banana
,第一个dict出现在第三句中)+2(
monkey
来自第三个dict出现在第三个句子中)=25.3和4项:6(
apple
来自第三个dict出现在第四个句子中)+2(
monkey
来自第三个dict出现在第三个句子中)+2*5(
monkey
来自第四个dict出现在第三个句子中)=23.我错过了什么吗?@MiniMax我早上计算过,很确定,但现在太困了。我所做的必须是正确的,猴子不会出现在第1句和第3句之间的任何地方。(如果在另一个句子中存在,我加上点,而不是在它自己的句子中)好的。但这个条件是:“1)如果任何句子(外部dict键)中存在任何内部dict中的单词,则在相关句子之间添加一个权重作为单词的值,在任何其他句子中的意思,除了own。对吗?这是
邻接矩阵
我想做的,我在问题的开头写了,并给它加了标签。在邻接矩阵中,不考虑自循环。这就是为什么我没有解释那部分。