2015-02-23 34 views
2

我有一個有一些文本列的熊貓數據框。我想要修改數據框,以便在所有行中都有一個用於每個不同單詞的列,以及一個布爾值,指示該文本列中該特定行的值是否出現該單詞。什麼是Python中標記化數據的高效數據結構?

我有一些代碼來做到這一點:

from pandas import * 

a = read_table('file.tsv', sep='\t', index_col=False) 
b = DataFrame(a['text'].str.split().tolist()).stack().value_counts() 

for i in b.index: 
    a[i] = Series(numpy.zeros(len(a.index))) 

for i in b.index: 
    for j in a.index: 
     if i in str.split(a['text'][j]: 
      a[i][j] = 1 

然而,我的數據集是非常大的(200,000行及約70,000獨特字)。有沒有更有效的方式來做到這一點,不會毀掉我的電腦?

回答

2

我會推薦使用sklearn,特別是CountVectorizer

import pandas as pd 
from sklearn.feature_extraction.text import CountVectorizer 
vect= CountVectorizer(binary =True) 



df= pd.DataFrame({'text':['cat on the cat','angel eyes has','blue red angel','one two blue','blue whales eat','hot tin roof','angel eyes has','have a cat'],'labels':\ 
        [1,0,1,1,0,0,1,1]}) 




X = vect.fit_transform(df['text'].values) 
y = df['labels'].values 
X 

<8x16 sparse matrix of type '<type 'numpy.int64'>' 
with 23 stored elements in Compressed Sparse Row format> 

這將返回一個sparse matrix其中m是從dfn行是所述單詞集合。稀疏格式對於節省矩陣中大多數元素爲0的內存是更可取的。將稀疏格式保留爲稀疏似乎是一種行之有效的方法,許多'sklearn'算法採用稀疏輸入。

您可以創建一個數據幀從X(如果真的有必要,但它會大):

word_counts =pd.DataFrame(X.todense(),columns = vect.get_feature_names()) 
+0

謝謝,這聽起來就像是我想要的。一個問題是,我仍然關心數據框中包含「標籤」的另一列(我確實打算將這些列轉換爲各種迴歸)。有沒有辦法讓稀疏矩陣,但仍然加入到標籤,所以我可以將它簡單地喂入sklearn ML算法? – araspion 2015-02-23 05:24:23

+0

其實,從來沒有 - 我看到這並不重要,因爲你通常將X和Y作爲單獨的對象傳遞,對吧? – araspion 2015-02-23 05:27:32

+0

是的,這是正確的。查看編輯 – JAB 2015-02-23 05:28:17