我有一个列表,我想变成一个距离矩阵
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中有没有一个雄辩的解决方案
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
为了计算Levenshtein距离,我使用了Levenshtein模块 (pip-install-python-Levenshteinrequired),与 模糊模糊
然后,当我们使用Numpy函数时,mylist必须转换 到Numpy阵列:
要计算整个结果,请运行:
详情:
np.vectorize(lv.distance)
是lv.distance 功能李>(lst[:, np.newaxis], lst[np.newaxis, :])
是一个名词性的习语- 来自lst数组的参数列表,用于连续 调用上述函数李>pd.DataFrame(...)
转换上述结果(aNumpy数组) 到数据帧,使用正确的索引和列名李>结果是:
让我们尝试稍微修改一下函数,以便消除对重复条目的计算:
输出:
相关问题 更多 >
编程相关推荐