如何处理DataFrame中的配对数据集?


df = pd.DataFrame({'source': [1000, 1000, 1001, 1001, 1002,1002], 'acceptability': [1,0,1,0,1,0], 'sentence': ['I do not know', 'I does not know', 'you are stupid', 'you is stupid', 'she is bad for python', 'she are bad for python']})

我想做的是比较两个句子共享相同的来源。在拆分或合并(无论什么…)之后,我想在两个句子之间使用Jaccard相似度。

我不知道如何用loop来完成它。

可能原型是这样的。

来源:1000,可接受性:1,句子:

来源:1000,可接受性:0,句子:

来源:1001,可接受性:1,句子:

来源:1001,可接受性:0,句子:

将DataFrame与loop station分开后,我希望基于Jaccard Similarity对它们进行比较。如果配对的相似性得分太低,我想从DataFrame中删除该配对。

我真的需要你们的帮助!!谢谢你的帮助!

我想在两个句子之间使用Jaccard相似度。

让我们首先定义集合列表的Jaccard相似系数的函数:

def JaccSim(sets): return len(set.intersection(*sets))/len(set.union(*sets))

比较具有相同来源的两个句子

可以使用DataFrame。groupby,用于按分隔DataFrame,而不需要显式循环:

js = df.groupby('source').apply(lambda d: JaccSim(d['sentence'].str.split().apply(set)))

这将每个源组的句子转换为单词集的列表,并计算相似系数,得到:

source
1000    0.600000
1001    0.500000
1002    0.666667
dtype: float64

如果配对的相似性得分太低,我想从DataFrame中删除该配对。

现在提取相似性足够高的行(例如至少0.6)可以像

一样简单
df = df.set_index('source')[.6<=js]
但是,这将打印一个UserWarning: Boolean Series key will be reindexed to match DataFrame index.,我们可以通过使用 来避免这种情况
df = df.set_index('source')[.6<=js[df['source']]]

最新更新