gpt4 book ai didi

python - 用 Pandas 为所有字符串对创建距离矩阵

转载 作者:行者123 更新时间:2023-12-02 02:40:21 27 4
gpt4 key购买 nike

我有一个列表,我想把它变成一个距离矩阵

from pylev3 import Levenshtein
from itertools import combinations

mylist = ['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 中是否有一个 Eloquent 解决方案?

       foo    bar   baz  foo   foo
1 foo 0 3 3 0 0
2 bar 3 0 1 3 3
3 baz 3 1 0 3 3
4 foo 0 3 3 0 0
5 foo 0 3 3 0 0

最佳答案

让我们尝试稍微修改一下函数,以便我们消除对重复条目的计算:

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

关于python - 用 Pandas 为所有字符串对创建距离矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63727901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com