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']]]