Python中标记化数据的高效数据结构是什么?

时间:2015-02-23 04:58:45

标签: python performance text pandas tokenize

我有一个pandas数据框,其中包含一些带有文本的列。我想修改数据框,以便在所有行中出现每个不同单词的列,以及一个布尔值,指示该单词是否出现在我的文本列中该特定行的值中。

我有一些代码可以执行此操作:

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个唯一字)。有没有更有效的方法来做到这一点,不会破坏我的电脑?

1 个答案:

答案 0 :(得分: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是来自df的行,而n是一组字词。稀疏格式最适合节省内存,其中矩阵的大多数元素都是0.将它留作稀疏似乎是要走的路,并且许多'sklearn'算法采用稀疏输入。

你可以从X创建一个数据框(如果真的有必要,但它会很大):

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