数据帧(data_df)为 6M 行。前四行如下。我需要计算每个 src_sent 与其余句子之间的语义相似度,并找到编辑距离小于 10 的句子并删除这些行。相似性我需要迭代整个 6M 并删除最相似的句子。
作为最相似的句子,我采用编辑距离小于 10 的句子。
| src_sents | tgt_sents
-------- ----------------------------| ------------------------------
| Where is 2011 AG5 now? | 2011 AG5 දැන් කොහෙද ඉන්නේ?
| God knows what he’s saying. | මේකා මොනව කියනවද කියල දෙයියො තමා දන්නෙ.
| but their heart is far from Me. | එහෙත් ඔවුන්ගේ හදවත් මාගෙන් දුරස් වීඇත.
| But he obeyed his parent’s wishes. | අනෙක් අතට, ඔහු තම දෙමාපියන්ගේ ආශාව ඔහුට ගරු කළා
为了计算语义相似度,我使用 Levenshtein 编辑距离。计算和迭代需要相当长的时间。如何有效地做到这一点?
以下是我的代码。
min_threshold=0
max_threshold=10
def get_Levenshtien_distance(text, ref_sentence):
return levenshtein_distance(str(text), str(ref_sentence))
for idx, row in data_df.iterrows():
current_sliced_df = df.drop(index=idx)
current_sliced_df["Levenshtien_distance"] = df["src_sents"].apply(get_Levenshtien_distance, args=(ref_src_sent,))
min_Levenshtien_distance_indexes = list(current_sliced_df.loc[(current_sliced_df["Levenshtien_distance"]>=min_threshold) & (current_sliced_df["Levenshtien_distance"]<=max_threshold)].index)
感谢有关如何改进这一点的任何指导。
因为您需要计算每个 src_sent 与其余之间的相似度,即 600 万条记录中的每一行与所有其他记录之间的相似度,这涉及计算 6 * 600 万 = 36 BILLIONS 倍的 for 相似度循环。
所以,无论如何,由于数据量的原因,这个操作需要花费很多时间。现在,如果您可以等待循环完成所需的时间(同样,这是多次迭代),您可以通过以下方式实现您的目标:
result = []
for ref_sentence in sentences_serie:
filter_sim = [ other for other in sentences_serie if get_Levenshtien_distance(ref_sentence, other) < 10 ]
for others in filter_sim:
#Make sure you don't store repeat pairs
if tuple(sorted((ref_sentence, other)) ) not in result:
result.append( tuple(sorted((ref_sentence, other) ) ) )
在“结果”中,您将获得一个元组列表,其中包含满足所需过滤器的句子对。