2016-03-27 8 views
3

madde ve ilgili yorum metinleri de dahil olmak üzere, bu tür bir veri çerçevesi Verilen:Veri çerçevesindeki kelimeyi python-pandas ve gensim ile tamsayı kimliğine nasıl eşlenir?

item_id   review_text 
B2JLCNJF16  i was attracted to this... 
B0009VEM4U  great snippers... 

ben review_text üst 5000 en sık kelimeyi eşleştirmek istiyoruz, bu yüzden çıkan veriler çerçevesi olması gerektiği gibi:

item_id   review_text 
B2JLCNJF16   1 2 3 4 5... 
B0009VEM4U   6... #as the word "snippers" is out of the top 5000 most frequent word 

Veya, vektör oldukça tercih edilir torba-of-the word a:

item_id   review_text 
B2JLCNJF16   [1,1,1,1,1....] 
B0009VEM4U   [0,0,0,0,0,1....] 

bunu nasıl yapabilirim? Çok teşekkürler!

EDIT: @ayhan'ın yanıtını denedim. Şimdi başarıyla doc2bow forma inceleme metnini değişti:

item_id   review_text 
B2JLCNJF16   [(123,2),(130,3),(159,1)...] 
B0009VEM4U   [(3,2),(110,2),(121,5)...] 

O belgede 2 kez oluştu kimliği 123 sözünü ifade eder. Şimdi bunu bir vektöre aktarmak istiyorum:

[0,0,0,.....,2,0,0,0,....,3,0,0,0,......1...] 
     #123rd   130th  159th 

Bunu nasıl yapıyorsunuz? Şimdiden teşekkür ederim!

cevap

4

Öncelikle, her satırda kelimelerin bir listesini almak için:

Şimdi
df["review_text"] = df["review_text"].map(lambda x: x.split(' ')) 

sen df["review_text"] geçebilir en gensim için Sözlük: 5000 En sık kelimeler için

from gensim import corpora 
dictionary = corpora.Dictionary(df["review_text"]) 

, filter_extremes kullandığınız yöntem:

dictionary.filter_extremes(no_below=1, no_above=1, keep_n=5000) 

doc2bow yöntemi kelimeler temsilinin çantasını (word_id, Frekans):

df["bow"] = df["review_text"].map(dictionary.doc2bow) 

0  [(1, 2), (3, 1), (5, 1), (11, 1), (12, 3), (18... 
1  [(0, 3), (24, 1), (28, 1), (30, 1), (56, 1), (... 
2  [(8, 1), (15, 1), (18, 2), (29, 1), (36, 2), (... 
3  [(69, 1), (94, 1), (115, 1), (123, 1), (128, 1... 
4  [(2, 1), (18, 4), (26, 1), (32, 1), (55, 1), (... 
5  [(6, 1), (18, 1), (30, 1), (61, 1), (71, 1), (... 
6  [(0, 5), (13, 1), (18, 6), (31, 1), (42, 1), (... 
7  [(0, 10), (5, 1), (18, 1), (35, 1), (43, 1), (... 
8  [(0, 24), (1, 4), (4, 2), (7, 1), (10, 1), (14... 
9  [(0, 7), (18, 3), (30, 1), (32, 1), (34, 1), (... 
10 [(0, 5), (9, 1), (18, 3), (19, 1), (21, 1), (2... 

kelime temsilinin torbasını aldıktan sonra, her satırda serisini Concat olabilir (muhtemelen çok verimli değil): Cevabınız için

df2 = pd.concat([pd.DataFrame(s).set_index(0) for s in df["bow"]], axis=1).fillna(0).T.set_index(df.index) 


    0 1 2 3 4 5 6 7 8 9 ... 728 729 730 731 732 733 734 735 736 737 
0 0 2 0 1 0 1 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 
1 3 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 0 1 0 ... 0 0 0 0 0 1 1 0 0 0 
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 
4 0 0 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 1 0 
5 0 0 0 0 0 0 1 0 0 0 ... 0 0 0 1 0 0 0 0 0 0 
6 5 0 0 0 0 0 0 0 0 0 ... 0 0 0 1 0 0 0 0 0 0 
7 10 0 0 0 0 1 0 0 0 0 ... 0 0 0 0 0 0 0 1 0 0 
8 24 4 0 0 2 0 0 1 0 0 ... 1 1 2 0 1 3 1 0 1 0 
9 7 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 1 
10 5 0 0 0 0 0 0 0 0 1 ... 0 0 0 0 0 0 0 0 0 0 
+0

teşekkürler! Çözümünüz oldukça güzel! Ama lütfen bana "doc2bow" sonucunu vektöre nasıl transfer edeceğini söyler misin? Teşekkürler! –

+0

Üzgünüm, bu soruyu bir haftalığına bırakıyorum ve şimdi tekrar aldım. Kodunuzu denedim ancak uzunluk hala farklı ve tüm değerler ikili: '0' veya' 1'. Bunun hakkında bir fikrin var mı? –

+0

Cevabınız için teşekkürler! Bu gerçekten harika! Ama df2'nin indeksinin df ile aynı olup olmadığını merak ediyorum. –

İlgili konular