1. 程式人生 > >python稀疏矩陣得到每列最大k項的值,對list內為類對象的排序(scipy.sparse.csr.csr_matrix)

python稀疏矩陣得到每列最大k項的值,對list內為類對象的排序(scipy.sparse.csr.csr_matrix)

book init list tuple work 0.10 src 是我 技術分享

    print(train_set.tdm)
    print(type(train_set.tdm))

輸出得到:

  (0, 3200)    0.264940780338
  (0, 1682)    0.356545827856
  (0, 3875)    0.404535449364
  (0, 2638)    0.375094236628
  (0, 2643)    0.420086333071
  (0, 558)    0.332314202381
  (0, 2383)    0.215711023304
  (0, 3233)    0.304884643652
  (0, 3848)    0.26822694041
  (
1, 1682) 0.0679433740085 (1, 3586) 0.186001809282 (1, 1748) 0.224453998729 (1, 4369) 0.217962362491 (1, 4102) 0.321977101868 (1, 3717) 0.11571865147 (1, 1849) 0.23976007391 (1, 3019) 0.105831301914 (1, 2731) 0.133236987271 (1, 2284) 0.158959982269 (1, 1129) 0.224453998729 (
1, 4004) 0.14716429302 (1, 1113) 0.224453998729 (1, 1239) 0.23282317344 (1, 4439) 0.17621324335 (1, 4075) 0.111234138548 : : (3297, 4296) 0.189022497666 (3297, 1273) 0.173257613112 (3297, 611) 0.189022497666 (3297, 1639) 0.201945480138 (3297, 1401) 0.196076146399 (
3297, 800) 0.193531186809 (3297, 4442) 0.213804760507 (3298, 2383) 0.115351969953 (3298, 3848) 0.143434978411 (3298, 3480) 0.166989458436 (3298, 767) 0.208015125433 (3298, 3836) 0.115469714921 (3298, 3877) 0.132381892057 (3298, 4387) 0.302243669544 (3298, 2967) 0.182430066726 (3298, 4184) 0.170734583655 (3298, 3878) 0.131142324027 (3298, 3381) 0.202336034891 (3298, 3959) 0.299487688552 (3298, 1392) 0.257499357524 (3298, 3039) 0.266066529253 (3298, 3599) 0.27026191686 (3298, 4289) 0.302243669544 (3298, 484) 0.36124988755 (3298, 2037) 0.36124988755 <class scipy.sparse.csr.csr_matrix>

說明這個變量train_set.tdm是個scipy.sparse.csr.csr_matrix,類似稀疏矩陣,輸出得到的是矩陣中部位0的行列坐標及值,現在我們要挑出每一行中值最大的k項。

首先我們知道一個對於稀疏矩陣很方便函數:

    #輸出非零元素對應的行坐標和列坐標
    nonzero=train_set.tdm.nonzero()
    #nonzero是個tuple
    print(type(nonzero))
    print(nonzero[0])
    print(nonzero[1])
    print(nonzero[1][0])

輸出為:

<class tuple>
[   0    0    0 ..., 3298 3298 3298]
[3200 1682 3875 ..., 4289  484 2037]
3200

其實train_set.tdm是我文本挖掘tf-idf後得到的權重矩陣,
技術分享圖片
我要挑出每天記錄中權重最大的76個詞,根據權重從大到小輸出這些詞的字典編號到excel
我用一個class來存儲這些非零格子的兩個信息:一個是這個詞權重信息,一個是這個詞的字典編號,
lis來存一條記錄的所有權重非零詞的信息,gather則是所有lis的集合,代碼如下:
    class obj:
    def __init__(self):
        self.key=0
        self.weight=0.0


    k=0 #k用來記錄是不是一條記錄結束了
    lis=[]
    gather=[]
    p=-1 #p用來計數,每走一遍循環+1
    for i in nonzero[0]:#i不一定每循環就+1的,它是nonzero【0】裏的數,不懂可以看之前輸出的nonzero【0】
        p=p+1
        print(i)
        if k==i:
            a=obj()
            a.key=nonzero[1][p]#這個詞的字典編號就是它屬於第幾列
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
        else:
            lis.sort(key=lambda obj: obj.weight, reverse=True)#對鏈表內為類對象的排序
            #print(lis)
            gather.append(lis)
            while k < i:
                k=k+1
            lis=[]
            a=obj()
            a.key=nonzero[1][p]
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
    gather.append(lis)

最後就是輸出到excel中

    myexcel = xlwt.Workbook()
    sheet = myexcel.add_sheet(sheet)
    #si,sj表示輸出到第幾行第幾列
    si=-1
    sj=-1
    for i in gather:
        si=si+1
        for j in i:
            sj=sj+1
            sheet.write(si,sj,str(j.key))
        while sj<=76:
            sj=sj+1
            sheet.write(si,sj,-1)#要是沒有那麽多詞組就用-1代替
        sj=-1
    myexcel.save("attribute76.xls")

就如下所示:

技術分享圖片

 

python稀疏矩陣得到每列最大k項的值,對list內為類對象的排序(scipy.sparse.csr.csr_matrix)