pandas: hitung kemiripan jaccard untuk setiap baris berdasarkan nilai di kolom lain

Dec 15 2020

Saya memiliki kerangka data sebagai berikut, hanya dengan lebih banyak baris:

import pandas as pd

data = {'First':  ['First value', 'Second value','Third value'],
'Second': [['old','new','gold','door'], ['old','view','bold','door'],['new','view','world','window']]}

df = pd.DataFrame (data, columns = ['First','Second'])

Untuk menghitung kemiripan jaccard saya menemukan bagian ini secara online (bukan solusi saya):

def lexical_overlap(doc1, doc2): 
    words_doc1 = set(doc1) 
    words_doc2 = set(doc2)

    intersection = words_doc1.intersection(words_doc2)
    union = words_doc1.union(words_doc2)
    
    return float(len(intersection)) / len(union) * 100

apa yang ingin saya dapatkan sebagai hasilnya adalah ukuran untuk mengambil setiap baris dari kolom Kedua sebagai doc dan membandingkan setiap pasangan secara iteratif dan mengeluarkan ukuran dengan nama baris dari kolom Pertama seperti ini:

First value and Second value = 80 

First value and Third value  = 95

Second value and Third value = 90

Jawaban

AmitAmola Dec 15 2020 at 23:04

Baiklah, saya akan melakukannya seperti ini:

from itertools import combinations

for val in list(combinations(range(len(df)), 2)):
    firstlist = df.iloc[val[0],1]
    secondlist = df.iloc[val[1],1]
    
    value = round(lexical_overlap(firstlist,secondlist),2)
    
    print(f"{df.iloc[val[0],0]} and {df.iloc[val[1],0]}'s value is: {value}")

Keluaran:

First value and Second value's value is: 33.33
First value and Third value's value is: 14.29
Second value and Third value's value is: 14.29
1 QuangHoang Dec 15 2020 at 22:54

Karena data Anda tidak besar, Anda dapat mencoba menyiarkan dengan pendekatan yang sedikit berbeda:

# dummy for each rows
s = pd.get_dummies(df.Second.explode()).sum(level=0).values

# pair-wise jaccard
([email protected])/(s|s[:,None,:]).sum(-1) * 100

Keluaran:

array([[100.        ,  33.33333333,  14.28571429],
       [ 33.33333333, 100.        ,  14.28571429],
       [ 14.28571429,  14.28571429, 100.        ]])