2016-11-28 4 views
0

Ich möchte die tf-idf Darstellung für MovieLens-Tag-Dataset erhalten. Die Tags sind in einem 'coo' Format:TFIDF-Darstellung für ML-Datensatz im Coo-Format 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 
... 

Die erste Version meines tf-idf-Code sieht wie folgt aus:

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

Während diese schön aussieht, ist es nicht die genaue Darstellung, die ich wollen. Es gibt zwei Hauptprobleme:

  1. Ich denke, jede Zeile in der 'Tag' Matrix wird als ein Dokument behandelt, das nicht wahr ist. Viele Filme werden von verschiedenen Benutzern als separate Einträge markiert.
  2. Die IDs in 'X' sind Matrixindizes. Wie kann ich die entsprechenden ML-IDs kennen? Angenommen, ich möchte die tf-idf-Darstellung für einen Film mit MLid wissen: 150. Wie kann ich das wissen?

Es wäre schön, wenn Sie mir mitteilen könnten, wie ich die oben genannten Fälle beheben kann, was ich für eine ziemlich einfache Aufgabe halte.

+0

was würden Sie als Dokument definieren? Die Verkettung aller Tags durch Filme? –

+0

Jeder Film ist ein Dokument. In diesem Fall hat jedes Dokument in der Tag-Matrix eine eindeutige movieId. Also, ja Verkettung aller Tags für einen bestimmten Film definieren dieses Dokument (Film). – FlytoScience

Antwort

0

Eingang

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 

-Code

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

Die Antworten sieht so aus, wie ich brauchte, danke. Ein Problem bleibt, das ist wie folgt: Die Ausgabe von 'verketteten_Tags' in Ihrem Code gibt mir eine Matrix der Größe' (689, 764) zurück. ['689' Filme (Dokumente),' 764' Tags (Wörter)]. In Wirklichkeit ist die Anzahl der Filme jedoch 9125. Dies bedeutet, dass viele Filme nicht markiert wurden. Nun, wie kann ich in Ihrem Code wissen, dass die Zeilen von 'X' denen' MovieId' entsprechen? Danke – FlytoScience

+0

X_dense sollte die richtigen Dimensionen der Matrix zurückgeben ... X ist immer noch eine spärlich komprimierte ... zum Abrufen nach Film-ID müssen Sie den Index dieser Film-ID aus dem ursprünglichen Dataset erhalten ... den entsprechenden Index in X_dense sollte dir den richtigen Vektor geben! –

+0

Vielen Dank Vivek. Die Antwort war präzise und löste mein Problem. Ich habe deine Antwort als die wahre Antwort markiert. – FlytoScience

Verwandte Themen