2016-04-01 27 views
2

Okapi BM25 model kullanarak belgeleri sıralamak için Python kullanıyorum.Python pandas: Boşluk sınırlandırılmış '.dat' dosyasından Belge Dönemi matrisini oluştur

IDF (Ters Belge Sıklığı) gibi Score(D,Q) için gerekli olan bazı terimleri daha verimli bir şekilde hesaplayabildiğimi düşünüyorum (yani: Belirli bir terim için tüm sıfır olmayan satırları sayma (sütun)). Ayrıca, gerçek Puan için matrise yeni bir sütun ekleyebilir ve ardından sıralamak için bu sıraya göre sıralayabilirim. 'De

D1 7:10 2:5 
D2 1:2 3:4 
D1 belge numarası

ve 7:10 ID 7 görünen terimi ile temsil 10 kez

:

belge, vektörler

aşağıdaki gibi yapılandırılmıştır bir .dat dosyada saklandığı Şu an aşağıdaki kodu kullanarak listelerin bir listesini okuyordum:

fname = "dtv.dat" 
f = open(fname, "r") 
l = [x.strip(" \n").split(" ") for x in f.readlines()] 
Verilen örneğin şu çıktıyı verir

: en etkili yolu bir Python pandalar için bu dönüştürmek için ne

[['D1', '7:10', '2:5'],['D2' '1:2', '3:4']] 

listesi formatı bu liste dikkate alındığında, aşağıdakine benzer DataFrame:

0  1  2  3  7 
D1  0  5  0  10  
D2  2  0  4  0 

cevap

1

Her belge yalnızca bir kez dosyada görünüyorsa, cevabınız iyi görünüyor. Aksi takdirde, kod d dict bazı kayıtların üzerine yazacaktır.

Aşağıdakilerin daha genel olacağını düşünüyorum:

import numpy as np 
import pandas as pd 

fname = 'example.txt' 

full_list = [] 
with open(fname, "r") as f: 
    for line in f: 
     arr = line.strip(" \n").split(" ") 
     for chunk in arr[1:]: 
      # converting numbers to ints: 
      int_pair = [int(x) for x in chunk.split(":")] 
      full_list.append([arr[0], *int_pair]) 

df = pd.DataFrame(full_list) 

df2 = df.pivot_table(values = 2, index = 0, columns = 1, aggfunc = np.sum, fill_value = 0) 

Nasıl çalışır:

>>> cat 'example.txt' 
D1 1:3 2:2 3:3 
D2 1:4 2:7 
D2 7:1 
D1 2:4 4:2 
D1 4:1 4:3 
>>> full_list 
Out[37]: 
[['D1', 1, 3], 
['D1', 2, 2], 
['D1', 3, 3], 
['D2', 1, 4], 
['D2', 2, 7], 
['D2', 7, 1], 
['D1', 2, 4], 
['D1', 4, 2], 
['D1', 4, 1], 
['D1', 4, 3]] 
>>> df 
Out[38]: 
    0 1 2 
0 D1 1 3 
1 D1 2 2 
2 D1 3 3 
3 D2 1 4 
4 D2 2 7 
5 D2 7 1 
6 D1 2 4 
7 D1 4 2 
8 D1 4 1 
9 D1 4 3 
>>> df2 
Out[39]: 
1 1 2 3 4 7 
0     
D1 3 6 3 6 0 
D2 4 7 0 0 1 
+0

Vay, gerçekten çok güzel! – jfive

0

Listelerin bir listeye geçme, listenin bir ID'ye ve terim frekanslarının sözlüğüne dönüştürülmesi, daha sonra doğrudan DataFrame'e dönüştürülmesi kombinasyonunu kullanarak bunu gerçekleştirmek için yönetilen, herhangi bir iyileştirme çok hoş geldiniz!

def term_matrix(fname): 
f = open(fname, "r") 
l = [x.strip(" \n").split(" ") for x in f.readlines()] 

d = dict() 

for i in l: 
    d[i[0]] = dict(t.split(":") for t in i[1:]) 

return pd.DataFrame(d).transpose()