2012-03-11 111 views
1

我正在尝试对文本进行分类的逻辑回归技术,并且我想要以p x n矩阵的形式构建数据集,对于特殊字词,p行,对于特殊字词,n列。我已经有了一个可以工作的文本,我只需要计算其中的单词。概念 - 如何在Python中构建2D词频矩阵?

重要的是要跟踪在哪个游戏中出现哪个单词,因此对于给定的游戏,我已经能够创建一个可以记录独特单词的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 2012-03-12 00:10:30

回答

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' 

说明:从两个字典合并所有的键一起,然后运行循环和填充类型的字典全新的字典:)

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()