2015-02-23 75 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