2012-03-11 2 views
1

Я пытаюсь применить метод логистической регрессии для категоризации текста, и я хочу построить набор данных в виде матрицы p x n, p строк для воспроизведения и n столбцов для уникальных слов. У меня уже есть текст для работы, мне просто нужно подсчитать в нем слова.Концептуальные - Как построить 2D-частотную матрицу в Python?

Важно следить за тем, какое слово происходит в игре, поэтому для данного воспроизведения я смог создать словарь Python, который подбирает уникальные слова. То, что я НЕ знаю, как это сделать, - объединить эти дикты, чтобы, например,

romeo = {[alas,2],[julliet,35]} 
caesar = {[et,1],[tu,3],[cassius,12]} 

могут быть объединены для создания матрицы

 alas julliet et tu cassius 
romeo 2  35 0 0 0 
caesar 0  0  1 3 12 

Для наглядности я создал пример, где каждая игра состоит только из уникальных слов - естественно, на самом деле это не совсем верно.

Как мог кто-то строить эту матрицу из этих словарей? Было бы легче начать с другого места?

+0

Какой формат вы хотите, чтобы ваши полученную матрицу в? Сам Python не имеет родного типа данных 2d-массива. – Amber

ответ

1

Это работает, проверено:

from itertools import chain 
from collections import defaultdict 

romeo = {'alas':2, 'juliet':35, 'hello':1} 
caesar = {'et':1, 'tu':3, 'cassius':12, 'hello':1} 

dicts = defaultdict(dict) 
dicts['romeo'] = romeo 
dicts['caesar'] = caesar 

columns = list(set(list(chain(romeo.keys(), caesar.keys())))) 

matrix = defaultdict(dict) 

for coll in ('romeo', 'caesar'): 
    matrix[coll] = {} 
    for key in columns: 
     if dicts[coll].has_key(key): 
      matrix[coll][key] = dicts[coll][key] 
     else: 
      matrix[coll][key] = 0 

print columns 

for coll in matrix.keys(): 
    for key in columns: 
     print matrix[coll][key], 
    print '\n' 

Объяснение: объединить все ключи от обоих словарей вместе, а затем запустить петли и заполнить новый Dict из dicts :)

0

Я бы использовал вложенные словари или двумерные словари. Для вложенными, во-первых, вам необходимо изменить формат вашего dicitonary в надлежащей форме:

romeo = {[alas,2],[julliet,35]} 
caesar = {[et,1],[tu,3],[cassius,12]} 

должно быть:

romeo = {'alas':2,'julliet': 35} 
caesar = {'et':1,'tu':3,'cassius':12} 

Оттуда, вы можете петлю через все «ценности» в словарные и гнездовые словари так вместо матрицы, как вы есть, вы можете иметь что-то вроде:

#declare first: 
Ds = {{}} 

Затем используйте цикл для заполнения:

Ds = { 
     'romeo' : {'et': 0, 'alas':2,'julliet': 35, tu':0,'cassius':0}, 
     'caesar' : {'et':1, 'alas':0, 'julliet': 0, 'tu':3,'cassius':12} 
     } 

Надеюсь, что это поможет.

0

В конце концов, что я в конечном итоге было реализовано defaultdict, потому что мне понравилось, как он будет создавать словари или словарные записи (в зависимости от местоположения), когда ссылка ранее не существовала.

Я построил полный defaultdict с тем, что я хотел, а затем ploddingly выводил в CSV.

Я использовал полный текст дамп из opensourceshakespeare.com, вот что я писал:

playNames = {} 

    for line in listOfLines: 
      try: 
        playNames[line.rsplit('~')[0]] += 1 
        if line.rsplit('~')[0] == '': 
         print line 
      except: 
        playNames[line.rsplit('~')[0]] = 1 

    #print playNames.keys() 

    # 
    # Now let's build a dictionary for each play 
    # 

    for line in listOfLines: 

      try: 
        playNames[line.rsplit('~')[0]] += line.rsplit('~,~')[2] 
        playNames[line.rsplit('~')[0]] += " " 
      except: 
        playNames[line.rsplit('~')[0]] = line.rsplit('~,~')[2] 
        playNames[line.rsplit('~')[0]]+= " " 

    # 
    # for each play, tokenize text into list of words 
    # 

    for key in playNames.iterkeys(): 
      playNames[key] = playNames[key].split(' ') 

    plays = collections.defaultdict(dict) 

    for key in playNames.iterkeys(): 
      for val in playNames[key]: 
        try: 
          plays[key][val] += 1 
        except: 
          plays[key][val] = 1 

    # 
    # build a set of words 
    # 

    words = set() 

    for eachplay in plays.itervalues(): 
      words.update(eachplay.keys()) 

    outfile = open("wordlist.csv",'w') 

    i=0 
    outfile.write(",") 
    for word in words: 

      outfile.write(word) 
      outfile.write(",") 
      i+=1 
    print "words ",i 

    outfile.write("\n") 
    for eachplay in plays.iterkeys(): 
      i = 0 
      outfile.write(eachplay) 

      outfile.write(",") 
      for word in words: 
        try: 
          outfile.write(str(plays[eachplay].get(word,"0"))) 
          #print word,plays[eachplay][word] 
        except: 
         outfile.write("") 
        i+=1 
        outfile.write(",") 
      outfile.write("\n") 
      print eachplay," ",i 
    outfile.close() 
Смежные вопросы