2016-11-28 35 views
0

我想獲取MovieLens標記數據集的tf-idf表示形式。該標籤是一個'COO - 格式:用於coo格式的ML數據集的TFIDF表示python

import pandas as pd 

ratings = pd.read_csv('data/ratings.csv',sep=',') 
movies = pd.read_csv('data/movies.csv',sep=',') 
tags = pd.read_csv('data/tags.csv',sep=',') 
print(tags) 

     userId movieId          tag \ 
0   15  339       sandra 'boring' bullock 
1   15  1955           dentist 
2   15  7478           Cambodia 
3   15 32892           Russian 
4   15 34162          forgettable 
5   15 35957            short 
6   15 37729           dull story 
7   15 45950           powerpoint 
8   15 100365           activist 
9   15 100365          documentary 
10  15 100365            uganda 
11  23  150           Ron Howard 
... 

我的TF-IDF代碼的第一個版本是這樣的:

vectorizer = TfidfVectorizer(use_idf=True, norm= 'l2') 
X = vectorizer.fit_transform(tags['tag']) 

print(X) 

(0, 89) 0.603928505945 
(0, 80) 0.52013528953 
(0, 577) 0.603928505945 
(1, 160) 1.0 
(2, 94) 1.0 
(3, 573) 1.0 
(4, 255) 1.0 
(5, 604) 1.0 
    ... 

雖然這看起來不錯,但沒有確切的表示,我想。有兩個主要問題:

  1. 我認爲'標記'矩陣中的每一行被視爲一個不正確的文檔。許多電影都由不同的用戶添加爲單獨的條目。
  2. 'X'中的ID是矩陣索引。我怎樣才能知道相應的ML-ID?假設我想知道MLid:150的電影的tf-idf表示。我怎麼知道這個?

這將是很好,如果你可以讓我知道如何解決上述情況,我認爲這是一件非常容易的事情。

+0

你會定義爲一個文件?所有標籤由電影連接起來? –

+0

每部電影都是一個文檔。在這種情況下,在標籤矩陣中,每個文檔都有一個唯一的movieId。所以,給定電影的所有標籤的串聯定義該文檔(電影)。 – FlytoScience

回答

0

輸入

userId movieId tag 
15 339 sandra 'boring' bullock 
15 1955 dentist 
15 7478 Cambodia 
15 32892 Russian 
15 34162 forgettable 
15 35957 short 
15 37729 dull story 
15 45950 powerpoint 
15 100365 activist 
15 100365 documentary 
15 100365 uganda 
23 150 Ron Howard 

代碼

import pandas as pd 

# consolidated dataset 
tags = pd.read_csv('tfidf_input1.csv') 
concatenated_tags = tags.groupby('movieId')['tag'].apply(lambda x: "%s" % ' '.join(x)).reset_index() 
#print concatenated_tags 

# TfidfVectorization 
from sklearn.feature_extraction.text import TfidfVectorizer 
vec = TfidfVectorizer() 
X = vec.fit_transform(concatenated_tags['tag']) 
#print X 

# knowing IDs in tftdf matrix 
# you have to convert to dense [NOT AT ALL advised for large matrices] 
# the output is a compressed sparse matrix for the memory reason 
X_dense = X.todense() 
print vec.get_feature_names() 
print X_dense[0,:] # output for the first movieId 
+0

答案看起來像我需要的,謝謝。仍然存在一個問題,如下所示:代碼中'concatenated_tags'的輸出返回給我一個大小爲(689,764)'的矩陣。 ['689'電影(文件),'764'標籤(文字)]。但是,實際上電影的數量是「9125」。這意味着很多電影沒有被標記。現在,在你的代碼中,我怎麼知道'X'的行對應於哪個'movieId'?謝謝 – FlytoScience

+0

X_dense應該返回矩陣的正確尺寸... X仍然是一個稀疏的壓縮尺寸...對於通過電影ID進行檢索,您需要從原始數據集中獲取該電影ID的索引...相應的索引X_dense應該給你正確的向量! –

+0

非常感謝Vivek。答案很精確,解決了我的問題。我將你的回答標記爲真正的答案。 – FlytoScience