Преобразование словаря кортежей в пустую матрицу

У меня есть очень большой словарь, содержащий кортежи в качестве ключей и их значений. Предполагается, что этот словарь представляет собой матрицу смежности с векторами совпадения слов, например, «работа» встречается с «опытом» 16 раз, а «работа» появляется с «услугами» 15 раз. Является ли этот метод предпочтительным или нет, это другой вопрос (с огромным объемом данных, которые у меня есть, вложенные словари стали кошмаром для обхода), но это просто то, что у меня есть прямо сейчас.

Frequency:{ 
('work', 'experience'): 16, 
('work', 'services'): 25, 
('must', 'services'): 15, 
('data', 'services'): 10,     
...
...}

Благодаря предыдущему сообщению я смог создать простую бинарную матрицу смежности с помощью NetworkX, просто используя эту методологию:

A=Frequency.keys()
networkx.Graph(A)

Тогда это был отличный результат, но мой вопрос заключается в том, что мне нужно сделать, чтобы преобразовать частоту в матрицу смежности, используя ее значение совместной встречаемости в качестве значения в матрице, чтобы результат выглядел примерно так: :

array([[ 0.,  16.,  25.,  0.],
       [ 16.,  0.,  1.,  0.],
       [ 25.,  1.,  0.,  1.],
       [ 10.,  0.,  0.,  0.]
       ...)

Прошу прощения, если это похоже на предыдущие сообщения, но я просто не могу найти правильный способ преобразования этих кортежей в матрицу, которую я могу использовать в NetworkX. Я предполагаю, что буду использовать numpy, но я не могу найти документацию для такого метода.

Заранее спасибо,

Рон


person Swanson Ron    schedule 30.01.2014    source источник


Ответы (2)


Этот ответ может помочь. С вашими примерными данными:

>>> frequency = {('work', 'experience'): 16, 
...              ('work', 'services'): 25, 
...              ('must', 'services'): 15, 
...              ('data', 'services'): 10}
>>> keys = np.array(frequency.keys())
>>> vals = np.array(frequency.values())
>>> keys
array([['work', 'services'],
       ['must', 'services'],
       ['work', 'experience'],
       ['data', 'services']], 
      dtype='|S10')
>>> vals
array([25, 15, 16, 10])
>>> unq_keys, key_idx = np.unique(keys, return_inverse=True)
>>> key_idx = key_idx.reshape(-1, 2)
>>> unq_keys
array(['data', 'experience', 'must', 'services', 'work'], 
      dtype='|S10')
>>> key_idx
array([[4, 3],
       [2, 3],
       [4, 1],
       [0, 3]])
>>> n = len(unq_keys)
>>> adj = np.zeros((n, n) ,dtype=vals.dtype)
 >>> adj[key_idx[:,0], key_idx[: ,1]] = vals
>>> adj
array([[ 0,  0,  0, 10,  0],
       [ 0,  0,  0,  0,  0],
       [ 0,  0,  0, 15,  0],
       [ 0,  0,  0,  0,  0],
       [ 0, 16,  0, 25,  0]])
>>> adj += adj.T
>>> adj
array([[ 0,  0,  0, 10,  0],
       [ 0,  0,  0,  0, 16],
       [ 0,  0,  0, 15,  0],
       [10,  0, 15,  0, 25],
       [ 0, 16,  0, 25,  0]])
person Jaime    schedule 30.01.2014

Вы можете создать словарь для сопоставления слов в ваших кортежах с целыми числами, анализируя кортежи в ваших частотных ключах, а затем создать массив numpy размером nxn, где n — общее количество слов, которые у вас есть, и, наконец, заполнить этот массив, используя ваш Диктант частоты.

person user3208430    schedule 30.01.2014