我正在分析一个带有大约135k文档(每个文档几页)和大约80万个单词的词汇的语料库。我注意到一半的词汇是频率为1或2的单词,所以我想删除它们。
所以我正在运行类似这样的东西:
remove_indices = np.array(index_df[index_df['frequency'] <= 2]['index']).astype(int)
for file_name in tqdm(corpus):
content = corpus[file_name].astype(int)
content = [index for index in content if index not in remove_indices]
corpus[file_name] = np.array(content).astype(np.uint32)
corpus
如下所示:
{
'filename1.txt': np.array([43, 177718, 3817, ...., 28181]).astype(np.uint32),
'filename2.txt': ....
}
并且每个单词以前都被编码为正整数索引。
问题出在content = [index for index in content if index not in remove_indices]
上,每次迭代都需要经过len(remove_indices) * len(content)
次检查。这将永远(tqdm告诉我100h +)。关于如何加快速度的任何提示?
到目前为止我尝试过的事情
remove_indices
中删除。仍然永远... 答案 0 :(得分:3)
您可以使用numpy.isin()
方法https://numpy.org/devdocs/reference/generated/numpy.isin.html代替此列表理解。
或者,您可以创建现有单词/索引的set
。然后,此in
操作将是O(1)而不是O(n)(其中n是数组的长度)。