2015-02-23 6 views
2

У меня есть рамка данных pandas, в которой есть столбец с некоторым текстом. Я хочу изменить dataframe таким образом, что есть столбец для каждого отдельного слова, которое встречается во всех строках, и логическое значение, указывающее, происходит ли это слово в этом значении конкретной строки в моем текстовом столбце.Что такое эффективная структура данных для токенизированных данных в 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 

Однако мой набор данных очень большой (200000 строк и около 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 являются строки из df и n есть множество слов. Редкий формат предпочтительнее для сохранения памяти, где большинство элементов матрицы равно 0. Оставляя ее как разреженный, кажется, путь, и многие из алгоритмов sklearn принимают разреженный ввод.

Вы можете создать фрейм данных из X (если это действительно необходимо, но это будет большой):

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

Спасибо, это звучит, как это то, что я хочу. Один из вопросов, однако, заключается в том, что мне по-прежнему нужен еще один столбец в фрейме данных, который содержит «метки» (я действительно намереваюсь передать это в регрессию). Есть ли способ иметь эту разреженную матрицу, но все же присоединить ее к ярлыкам, чтобы я мог легко ее комбинировать с алгоритмом Sklearn ML? – araspion

+0

На самом деле, неважно - я вижу, это не имеет значения, поскольку вы обычно проходите X и y в виде отдельных объектов, не так ли? – araspion

+0

да, это так. См. Edit – JAB

Смежные вопросы