假设我有一个数据集,像这样
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)
我还可以使用这个方便的多进程函数(感谢这篇博客文章),以并行方式对数据框执行大多数任意应用函数:
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
例如: for example:
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 ()
有没有其他方法可以做到这一点?我正在喜欢Spacy进行NLP,但我有很多文本数据,所以我想并行一些处理函数,但遇到了这个问题。
还有其他方法可以解决这个问题吗?我很喜欢使用Spacy进行自然语言处理,但是由于我的文本数据很多,因此我想要并行一些处理函数,但我遇到了这个问题。
返回结果:
还有其他方法可以解决这个问题吗?我很喜欢使用Spacy进行自然语言处理,但是由于我的文本数据很多,因此我想要并行一些处理函数,但我遇到了这个问题。
pipe()
的n_threads
参数已于2019年被弃用。n_process
可作为一个合理的替代品。 - Cold Fishdoc.is_parsed
属性已经在 spacy v3.0 中被弃用。文档建议使用doc.has_annotation("DEP")
替代。 - scign