嗨,我想獲得資料框中所有行之間的 Jaccard 相似性。
我已經有一個類似下面的 jaccard 相似度函式,它包含兩個串列,但我無法理解如何跟蹤正在進行比較的用戶。
def jaccard_similarity(x,y):
""" returns the jaccard similarity between two lists """
intersection_cardinality = len(set.intersection(*[set(x), set(y)]))
union_cardinality = len(set.union(*[set(x), set(y)]))
return intersection_cardinality/float(union_cardinality)
我想對資料框中的所有行運行這個函式。
| 措辭 | 用戶 |
|---|---|
| 蘋果、香蕉、橙子、梨 | 阿德琳 |
| 香蕉,菠蘿蜜,漿果,蘋果 | 埃里科 |
| 漿果、葡萄、西瓜 | 瑪麗 |
如何生成如下所示的輸出,以便跟蹤正在比較的用戶?
| 用戶1 | 用戶2 | 相似 |
|---|---|---|
| 阿德琳 | 繪里子 | 0.5 |
| 阿德琳 | 瑪麗 | 0.2 |
非常感謝您的指導。
sentences = ['apple,banana,orange,pears', 'banana,jackfruit,berries,apple']
sentences = [sent.lower().split(",") for sent in sentences]
jaccard_similarity(sentences[0], sentences[1])
輸出:0.3333333333333333
運行上面的代碼將使我得到我想要的值,但如果我有 100 行資料,我只是堅持如何跟蹤資料框中正在比較的用戶。
謝謝
uj5u.com熱心網友回復:
可能的解決方案如下:
import itertools
import pandas as pd
# copied from OP above
def jaccard_similarity(x, y):
""" returns the jaccard similarity between two lists """
intersection_cardinality = len(set.intersection(*[set(x), set(y)]))
union_cardinality = len(set.union(*[set(x), set(y)]))
return intersection_cardinality/float(union_cardinality)
# set initial data and create dataframe
data = {"wordings": ["apple,banana,orange,pears", "banana,jackfruit,berries,apple", "berries,grapes,watermelon"], "users": ["adeline", "ericko", "mary"]}
df = pd.DataFrame(data)
# create list of tuples like [(wording, user), (wording, user)]
wordings_users = list(zip(df["wordings"], df["users"]))
result = []
# create list of all possible combinations between sets of (wording, user) and loop through them
for item in list(itertools.combinations(wordings_users, 2)):
similarity = jaccard_similarity(item[0][0], item[1][0])
data = {"user1": item[0][1], "user2": item[1][1], "similarity": similarity}
result.append(data)
df1 = pd.DataFrame(result)
df1
退貨

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450100.html
標籤:Python python-3.x 数据框 nlp 数据处理
上一篇:按某個數字拆分字串并將結果保存為python中的串列
下一篇:Python-將時區添加到時間戳
