2016-04-01 18 views
2

私はPythonを使ってOkapi BM25 modelを使って文書のランク付けを試みています。Python pandas:空白で区切られた '.dat'ファイルから文書用語行列を生成

IDF(Inverse Document Frequency)のようなScore(D,Q)に必要な用語をより効率的に計算することができます(つまり、特定の用語(列)のすべての非ゼロ行を数えます)。さらに、実際のScoreの行列に新しい列を追加し、これを並べ替えてドキュメントをランク付けすることができます。

文書の用語ベクトルは次のように構成され.datファイルに格納されている:

D1 7:10 2:5 
D2 1:2 3:4 
D1は、文書IDと 7:1010

で現れるID 7と用語を表す

私は、次のコードを使用してリストのリストに目を通しています:

fname = "dtv.dat" 
f = open(fname, "r") 
l = [x.strip(" \n").split(" ") for x in f.readlines()] 
与えられた例えば次のような出力が得

:リスト形式のリストを考えると

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

は、Pythonのパンダのデータフレームにこれを変換するための最も効率的な方法は、次のようなものです:

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

答えて

1

各文書がファイル内に1回しか表示されない場合は、あなたの回答はOKであるようです。それ以外の場合、コードはdict dの一部のレコードを上書きします。

は、私は次のことが、より一般的なことだと思う:

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) 

仕組み:

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

うわー、確かに非常に素晴らしいです! – jfive

0

これを達成するために、リストのリストを変更し、リストのリストをIDの辞書と用語頻度の辞書に変換した後、DataFrameに直進させ、改善が非常に歓迎されます!

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() 
関連する問題