高效迭代数据框中的句子相似度匹配

问题描述 投票:0回答:1

数据帧(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)

感谢有关如何改进这一点的任何指导。

python pandas dataframe performance levenshtein-distance
1个回答
0
投票

因为您需要计算每个 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) ) ) )
在“结果”中,您将获得一个元组列表,其中包含满足所需过滤器的句子对。

© www.soinside.com 2019 - 2024. All rights reserved.