Python 使用熊猫为所有字符串对创建距离矩阵
我有一个列表,我想变成一个距离矩阵Python 使用熊猫为所有字符串对创建距离矩阵,python,pandas,string,matrix,distance,Python,Pandas,String,Matrix,Distance,我有一个列表,我想变成一个距离矩阵 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'),
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
让我们尝试稍微修改一下函数,以便消除对重复条目的计算:
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
让我们尝试稍微修改一下函数,以便消除对重复条目的计算:
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
为了计算Levenshtein距离,我使用了Levenshtein模块 (需要pip安装python Levenshtein),与 模糊模糊 然后,当我们使用Numpy函数时,必须转换mylist 要创建Numpy数组,请执行以下操作: 要计算整个结果,请运行:
result = pd.DataFrame(np.vectorize(lv.distance)(lst[:, np.newaxis], lst[np.newaxis, :]),
index=lst, columns=lst)
详情:
是lv.distance的矢量化版本 功能np.vectorize(lv.distance)
是一个numpythonic成语- lst数组中的参数“每个都有每个”的列表,用于连续 调用上述函数(lst[:,np.newaxis],lst[np.newaxis,:])
- 由于Numpy矢量化,整个计算运行速度很快, 特别是在大型阵列上可以看到什么
转换上述结果(一个Numpy数组) 到数据帧,使用正确的索引和列名pd.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
为了计算Levenshtein距离,我使用了Levenshtein模块 (需要pip安装python Levenshtein),与 模糊模糊 然后,当我们使用Numpy函数时,必须转换mylist 要创建Numpy数组,请执行以下操作: 要计算整个结果,请运行:
result = pd.DataFrame(np.vectorize(lv.distance)(lst[:, np.newaxis], lst[np.newaxis, :]),
index=lst, columns=lst)
详情:
是lv.distance的矢量化版本 功能np.vectorize(lv.distance)
是一个numpythonic成语- lst数组中的参数“每个都有每个”的列表,用于连续 调用上述函数(lst[:,np.newaxis],lst[np.newaxis,:])
- 由于Numpy矢量化,整个计算运行速度很快, 特别是在大型阵列上可以看到什么
转换上述结果(一个Numpy数组) 到数据帧,使用正确的索引和列名pd.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
您的
mylist
中有重复的条目。这是故意的吗?是的,这是故意的。您的mylist
有重复的条目。这是故意的吗?是的,这是故意的我得到了name错误:没有定义名称“dist”
对不起,复制/粘贴时遗漏了一个单元格。请参阅更新的答案。我收到name错误:未定义名称“dist”
抱歉,复制/粘贴时遗漏了一个单元格。请参阅更新的答案。