2016-12-23 8 views
0

Я только начал использовать Python, и я просто наткнулся на следующую проблему:Как создать частотную матрицу?

Imagine У меня есть следующий список списков:

list = [["Word1","Word2","Word2","Word4566"],["Word2", "Word3", "Word4"], ...] 

Результат (матрица), я хочу, чтобы получить должен выглядеть следующим образом : screenshot

Отображаемые столбцы и строки - все возникающие слова (независимо от того, в каком списке).

То, что я хочу, это программа, которая учитывает появление слов в каждом списке (по списку).

Изображение представляет собой результат после первого списка.

Есть ли простой способ добиться чего-то подобного или чего-то подобного?


EDIT: В основном я хочу List/Matrix, который говорит мне, сколько раз слова 2-4566 появился, когда слово 1 также был в списке, и так далее.

Поэтому я бы получил список для каждого слова, которое отображает абсолютную частоту всех других 4555 слов в связи с этим словом.


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

+1

Это не совсем понятно, о чем вы просите. Что означают пересечения столбцов и строк? – Nurjan

+0

Взаимосвязи столбцов и строк не важны. Мне они не нужны, поэтому они могут быть 0 или пробелами или вообще – mgruber

+0

Не могли бы вы просто уточнить, что вы хотите сделать? Вы хотите подсчитать, сколько раз каждое слово появляется в каждом из списков? Если да, то каковы связи между количеством слов и этой матрицей? – Nurjan

ответ

0

Мне удалось найти правильный ответ на мой вопрос:

list = [["Word1","Word2","Word2"],["Word2", "Word3", "Word4"],["Word2","Word3"]] 

#Names of all dicts 
all_words = sorted(set([w for sublist in list for w in sublist])) 

#Creating the dicts 
dicts = [] 
for i in all_words: 
    dicts.append([i, dict.fromkeys([w for w in all_words if w != i],0)]) 

#Updating the dicts 
for l in list: 
    for word in sorted(set(l)): 
     tmpL = [w for w in l if w != word] 
     ind = ([w[0] for w in dicts].index(word)) 

     for w in dicts[ind][1]: 
      dicts[ind][1][w] += l.count(w) 

print dicts 

Получает результат:

[ 'Слово1', { 'Word4': 0, 'word3': 0, 'Слово2': 2}], [ 'Слово2', { 'Word4 ': 1,' Word1 ': 1,' Word3 ': 2}], [' Word3 ', {' Word4 ': 1,' Word1 ': 0,' Word2 ': 2}], [' Word4 ', { 'Word1': 0, 'Word3': 1, 'Word2': 1}]]

1

Я нахожу это очень трудно понять, что вы действительно просите, но я буду стараться, сделав некоторые предположения:

  • (1) у вас есть список (), содержащий другие списки (б) из нескольких слов (ж).
  • (2) Для каждого б -list в -list
    • (3) Для каждого ш в б:
      • (3,1) подсчитать общее число выступления w во всех b-списки
      • (3,2) подсчитывают, сколько из б -lists, в котором ж появляется только один раз

Если эти предположения верны, то таблица не правильно соответствует списку предоставленных Вами. Если мои предположения ошибочны, я все же верю, что мое решение может дать вам вдохновение или некоторые идеи о том, как правильно его решить. Наконец, я не утверждаю, что мое решение является оптимальным по скорости или тому подобному.

OBS !!Я использую встроенные словари python, которые могут стать ужасно медленными, если вы намереваетесь заполнить их тысячами слов! Посмотрите: https://docs.python.org/2/tutorial/datastructures.html#dictionaries

frq_dict = {} # num of appearances/frequency 
    uqe_dict = {} # unique 

    for list_b in list_A: 
      temp_dict = {} 
      for word in list_b: 
        if(word in temp_dict): 
          temp_dict[word]+=1 
        else: 
          temp_dict[word]=1 

      # frq is the number of appearances 
      for word, frq in temp_dict.iteritems(): 
        if(frq > 1): 
          if(word in frq_dict) 
            frq_dict[word] += frq 
          else 
            frq_dict[word] = frq 
        else: 
          if(word in uqe_dict) 
            uqe_dict[word] += 1 
          else 
            uqe_dict[word] = 1 
+0

@mgruber. Я видел, что ваше редактирование на ваш вопрос было слишком поздно. Я постараюсь сделать обновленное решение. – magnus

+0

Спасибо за ваш ответ! Вещь, в которой я нуждаюсь, является словарем для каждого слова, содержащим все остальные слова, кроме одного. словарь затем заполняется переходом по списку. Поэтому, если в списке 1 содержится слово1, словарь word1 заполняется количеством слов word2, word3 и т. Д., Появляется в том же списке (только). Это делается для каждого слова в первом списке. Затем перейдите к списку2, если снова появится слово 1, число слов word2, word3 и т. Д. Добавляется поверх уже существующих номеров. – mgruber

+0

Действительно. Вы можете решить это, заполнив словарь другими словарями. Однако для многих слов это будет ужасно медленным. Здесь вы запрашиваете довольно большой объем информации. Вы поняли, как вы хотите это сделать, или вам нужна дополнительная помощь? – magnus

2

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

Прежде всего, мы должны исправить множество уникальных слов:

lst = [["Word1","Word2","Word2","Word4566"],["Word2", "Word3", "Word4"], ...] # list is a reserved word in python, don't use it as a name of variables 

words = set() 
for sublst in lst: 
    words |= set(sublst) 
words = list(words) 

Во-вторых, мы должны определить матрицу с нулями:

result = [[0] * len(words)] * len(words) # zeros matrix N x N 

И, наконец, мы заполняем матрицу, проходящие через данный список :

for sublst in lst: 
    sublst = list(set(sublst)) # selecting unique words only 
    for i in xrange(len(sublst)): 
     for j in xrange(i + 1, len(sublst)): 
      index1 = words.index(sublst[i]) 
      index2 = words.index(sublst[j]) 
      result[index1][index2] += 1 
      result[index2][index1] += 1 

print result 
Смежные вопросы