亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 pandas 為所有字符串對創建距離矩陣

使用 pandas 為所有字符串對創建距離矩陣

精慕HU 2023-07-11 16:44:52
我有一個列表,我想將其轉換為距離矩陣from pylev3 import Levenshteinfrom itertools import combinationsmylist = ['foo', 'bar', 'baz', 'foo', 'foo']以下從列表中生成計算矩陣所需的所有可能的對list(combinations(mylist,2))[('foo', 'bar'), ('foo', 'baz'), ('foo', 'foo'), ('foo', 'foo'), ('bar', 'baz'), ('bar', 'foo'), ('bar', 'foo'), ('baz', 'foo'), ('baz', 'foo'), ('foo', 'foo')]然后可以通過以下方式計算每對的距離:def ld(a):  return [Levenshtein.classic(*b) for b in combinations(a, 2)]ld(mylist)[3, 3, 0, 0, 1, 3, 3, 3, 3, 0]然而,我堅持在 pandas 中創建一個類似矩陣的數據框 - pandas 中有一個雄辯的解決方案嗎?       foo    bar   baz  foo   foo1 foo   0     3     3    0     02 bar   3     0     1    3     33 baz   3     1     0    3     34 foo   0     3     3    0     05 foo   0     3     3    0     0
查看完整描述

2 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

讓我們嘗試稍微修改一下函數,以便消除重復條目的計算:


from itertools import combinations, product


def ld(a):

    u = set(a)

    return {b:Levenshtein.classic(*b) for b in product(u,u)}


dist = ld(mylist)


(pd.Series(list(dist.values()), pd.MultiIndex.from_tuples(dist.keys()))

   .unstack()

   .reindex(mylist)

   .reindex(mylist,axis=1)

)

輸出:


     foo  bar  baz  foo  foo

foo    0    3    3    0    0

bar    3    0    1    3    3

baz    3    1    0    3    3

foo    0    3    3    0    0

foo    0    3    3    0    0


查看完整回答
反對 回復 2023-07-11
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

為了計算 Levenshtein 距離,我使用了Levenshtein模塊(需要pip install python-Levenshtein ),與fuzzywuzzy配對使用 。

import Levenshtein as lv

然后,當我們使用Numpy函數時,mylist必須轉換為Numpy數組:

lst = np.array(mylist)

要計算整個結果,請運行:

result = pd.DataFrame(np.vectorize(lv.distance)(lst[:, np.newaxis], lst[np.newaxis, :]),
    index=lst, columns=lst)

細節:

  • np.vectorize(lv.distance)是lv.distance函數的矢量化版本 。

  • (lst[:, np.newaxis], lst[np.newaxis, :])是一個numpythonic習慣用法 - 來自lst數組的“each with every”參數列表,用于連續調用上述函數。

  • 由于Numpy向量化,整個計算運行得很快,尤其是在大數組上。

  • pd.DataFrame(...)將上述結果(Numpy數組)轉換為具有正確索引和列名稱的 DataFrame。

  • 如果需要,請使用原始函數而不是lv.distance。

結果是:

     foo  bar  baz  foo  foo

foo    0    3    3    0    0

bar    3    0    1    3    3

baz    3    1    0    3    3

foo    0    3    3    0    0

foo    0    3    3    0    0


查看完整回答
反對 回復 2023-07-11
  • 2 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號