Python 中标记化数据的有效数据结构是什么?
What is an efficient data structure for tokenized data in Python?
我有一个 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 个唯一单词)。有没有更有效的方法来做到这一点,不会破坏我的电脑?
我建议使用 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>
This returns a sparse matrix
其中 m
是来自 df
的行,n
是单词集。稀疏格式更适合在矩阵的大多数元素为 0 的情况下节省内存。将其保留为稀疏似乎是可行的方法,许多 'sklearn' 算法采用稀疏输入。
您可以从 X 创建一个数据框(如果确实有必要,但它会很大):
word_counts =pd.DataFrame(X.todense(),columns = vect.get_feature_names())
我有一个 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 个唯一单词)。有没有更有效的方法来做到这一点,不会破坏我的电脑?
我建议使用 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>
This returns a sparse matrix
其中 m
是来自 df
的行,n
是单词集。稀疏格式更适合在矩阵的大多数元素为 0 的情况下节省内存。将其保留为稀疏似乎是可行的方法,许多 'sklearn' 算法采用稀疏输入。
您可以从 X 创建一个数据框(如果确实有必要,但它会很大):
word_counts =pd.DataFrame(X.todense(),columns = vect.get_feature_names())