假设我有一个数据集,比如
iris = pd.DataFrame(sns.load_dataset('iris'))
我可以使用Spacy
和.apply
将字符串列解析为标记(当然,我的实际数据集每个条目有1个单词/标记)
import spacy # (I have version 1.8.2)
nlp = spacy.load('en')
iris['species_parsed'] = iris['species'].apply(nlp)
结果:
sepal_length ... species species_parsed
0 1.4 ... setosa (setosa)
1 1.4 ... setosa (setosa)
2 1.3 ... setosa (setosa)
我还可以使用这个方便的多处理函数(thanks to this blogpost)并行地在数据帧上执行大多数任意应用函数:
from multiprocessing import Pool, cpu_count
def parallelize_dataframe(df, func, num_partitions):
df_split = np.array_split(df, num_partitions)
pool = Pool(num_partitions)
df = pd.concat(pool.map(func, df_split))
pool.close()
pool.join()
return df
例如:
def my_func(df):
df['length_of_word'] = df['species'].apply(lambda x: len(x))
return df
num_cores = cpu_count()
iris = parallelize_dataframe(iris, my_func, num_cores)
结果:
sepal_length species length_of_word
0 5.1 setosa 6
1 4.9 setosa 6
2 4.7 setosa 6
…但是由于某种原因,我不能用这种方式对数据帧应用Spacy解析器。
def add_parsed(df):
df['species_parsed'] = df['species'].apply(nlp)
return df
iris = parallelize_dataframe(iris, add_parsed, num_cores)
结果:
sepal_length species length_of_word species_parsed
0 5.1 setosa 6 ()
1 4.9 setosa 6 ()
2 4.7 setosa 6 ()
还有别的办法吗?我很喜欢NLP的Spacy,但是我有很多文本数据,所以我想并行化一些处理函数,但是遇到了这个问题。
Spacy是高度优化的,可以为您进行多处理。因此,我认为您最好的选择是将数据从Dataframe中取出并作为列表传递给Spacy管道,而不是尝试直接使用
.apply
。然后需要整理解析结果,并将其放回数据帧中。
因此,在您的示例中,您可以使用以下内容:
这种方法在小数据集上可以很好地工作,但是它会消耗你的内存,所以如果你想处理大量的文本,就不太好了。
相关问题 更多 >
编程相关推荐