我正在使用一些机器学习,从SBERT python模块中计算出最常见的K个字符串,给出输入复制和目标语料库(在本例中是100 K和100 K的大小)。
该模块相当健壮,比较完成得非常快,返回给我一个字典列表,其中包含格式中每个输入字符串的最类似的比较:
{Corpus ID : Similarity_Score}
然后,我可以用用作索引的查询字符串列表将其封装在一个dataframe中。给我一个格式的数据文件:
Query_String | Corpus_ID | Similarity_Score
然而,我的方法的主要时间接收器是将语料库ID与语料库中的字符串匹配,因此我知道输入对应的字符串是什么。我目前的解决方案是将熊猫apply与pandarallel模块结合使用:
def retrieve_match_text(row, corpus_list):
dict_obj = row['dictionary']
corpus_id = dict_obj['corpus_id'] #corpus ID is an integer representing the index of a list
score = dict_obj['score']
matched_corpus_keyword = corpus_list[corpus_id] #list index lookup (speed this up)
return [matched_corpus_keyword, score]
.....
.....
# expand the dictionary into two columns and match the corpus KW to its ID
output_df[['Matched Corpus KW', 'Score']] = output_df.parallel_apply(
lambda x: pd.Series(retrieve_match_text(x, sentence_list_2)), axis=1)对于一个100 K的输入语料库,与另一个100 K大小的语料库相比,这需要大约2分钟的时间。然而,我正在处理的是一个几百万的语料库,所以这里任何速度的进一步提高都是受欢迎的。
发布于 2022-06-25 12:20:33
如果我正确地阅读了这个问题,您将看到列: Query_String和字典(这是正确的吗?)
然后corpus_id和分数存储在那本字典里。
你对熊猫的第一个目标应该是以熊猫友好的方式工作。避免嵌套字典,直接将值存储在列中。在那之后,你可以使用高效的熊猫操作。
索引列表对你来说不是很慢。如果您正确地这样做,它可以是一个完整的表合并/连接,并且不需要任何缓慢的逐行应用和字典查找。
第一步。如果你这样做:
target_corpus = pd.Series(sentence_list_2, name="target_corpus")然后,您有一个索引系列的一个语料库(以前的“列表查找”)。
步骤2.在主数据帧中获取score和corpus_id列
步骤3.使用pd.merge连接corpus_id上的输入语料库和target_corpus索引,并使用how="left" (只有与现有corpus_id匹配的项是相关的)。这应该是一个有效的方法,这是一个完整的数据操作。
开发并测试解决方案和一个小子集(1K),以快速迭代,然后增长。
https://stackoverflow.com/questions/72753242
复制相似问题