-2
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 Similarity。

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

也许原型是这样的。

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

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

……

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

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

...

在将 DataFrame 与循环站拆分后,我希望根据 Jaccard Similarity 比较这些对。如果这对的相似度分数太低,我想从 DataFrame 中删除该对。

我真的需要你们帮助!!

谢谢你帮助我!

4

1 回答 1

0

我想在两个句子之间使用 Jaccard Similarity。

我们先定义一个集合列表的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]

但是,这会打印出 aUserWarning: Boolean Series key will be reindexed to match DataFrame index.我们可以通过使用来避免这种情况

df = df.set_index('source')[.6<=js[df['source']]]
于 2021-08-01T10:36:01.323 回答