我有一個包含人名的單列資料框,如下所示。
name
--------------
john doe
john david doe
doe henry john
john henry
無論順序如何,我都想計算每兩個單詞一起出現在名稱中的次數。在這個例子中,單詞john和doe出現在相同的三個名稱john doe中,john henry doe和doe john。
預期產出
name1 | name2 | count
----------------------
david | doe | 1
doe | henry | 1
doe | john | 3
henry | john | 2
請注意,這name1是按字母順序排在第一位的單詞。目前我有一個蠻力解決方案。
- 創建資料框中所有唯一單詞的串列
- 對于此串列中的每個唯一單詞
W,過濾原始資料框中包含此單詞的記錄W - 從過濾的記錄中,統計其他詞的頻率。這給出了
W與各種其他詞一起出現的時間
問題:這適用于少量記錄,但如果我們有大量記錄,則效率不高,因為它以二次復雜度運行。它如何以更快的方式生成輸出?是否有任何功能或包可以提供這些計數?
注意:我嘗試從 NLP 包中使用 n-gram 提取,但這會過度估計計數,因為它在內部附加所有名稱以形成一個長字串,因此名稱上的最后一個單詞和下一個名稱的第一個單詞顯示為a 附加字串中的單詞序列,加起來就是計數。
uj5u.com熱心網友回復:
這是一個仍然是二次方的解決方案,但更小n,并且將大部分內容隱藏在已編譯的代碼中(希望執行得更快):
from itertools import combinations
combs = df['name'].apply(lambda x:list(combinations(sorted(x.split()),2)))
counts = Counter(combs.explode())
res = pd.Series(counts).rename_axis(['name1', 'name2']).reset_index(name='count')
樣本資料的輸出:
name1 name2 count
0 doe john 3
1 david doe 1
2 david john 1
3 doe henry 1
4 henry john 2
uj5u.com熱心網友回復:
我建議如下:
import itertools
# 1) Create combinations of 2 from all the names using itertools().
l = [a for b in df.name.tolist() for a in b]
c = {c for c in itertools.combinations(l, 2) if c[0] != c[1]}
df_counts = pd.DataFrame(c, columns=["name1", "name2"])
# 2) Create a new column iterating through rows to check of each name is contained in each list of words & sum the boolean outputs.
df_counts["counts"] = df_counts.apply(lambda row: sum([row["name1"] in l and row["name2"] in l for l in df.name.to_list()]), axis=1)
我希望這有幫助。
uj5u.com熱心網友回復:
這個問題是“關聯規則挖掘”的一個實體,每個事務只有 2 個專案。它有像“Aperiori”這樣的簡單演算法以及像“FP-Growth”這樣的高效演算法,你可以找到很多資源來學習它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519856.html
