使用pandas DataFrame计算Levenshtein距离

0 投票
1 回答
3671 浏览
提问于 2025-04-18 07:30

我正在尝试计算莱文斯坦距离,这是一个关于字符串之间差异的度量,使用的是一个叫做pandas的DataFrame。我用的是这个库来实现。

In [22]: df = pd.DataFrame({'id' : [1,2,3,4,5,6,7],
                'path'  : ["abc,cde,eg,ba","abc,cde,ba","abc,yz,zx,eg","abc,cde,eg,ba","abc,cde","abc","cde,eg,ba"]})

In [23]: df
Out[23]: 
   id           path
0   1  abc,cde,eg,ba
1   2     abc,cde,ba
2   3   abc,yz,zx,eg
3   4  abc,cde,eg,ba
4   5        abc,cde
5   6            abc
6   7      cde,eg,ba

下面是我的实现代码。

In [18]: d = {'abc':'1', 'cde':'2', 'eg':'3', 'ba':'4', 'yz':'5', 'zx':'6'}

In [19]: d
Out[19]: {'abc': '1', 'ba': '4', 'cde': '2', 'eg': '3', 'yz': '5', 'zx': '6'}

In [20]: a = [jellyfish.levenshtein_distance(*map(d.get, item)) for item in itertools.combinations(d,2)]

In [21]: a
Out[21]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

为什么它没有像我想的那样比较字符串?而且为什么只打印出1呢?

In [22]: list(itertools.combinations(d,2))
Out[22]: 
[('cde', 'abc'),
 ('cde', 'ba'),
 ('cde', 'eg'),
 ('cde', 'yz'),
 ('cde', 'zx'),
 ('abc', 'ba'),
 ('abc', 'eg'),
 ('abc', 'yz'),
 ('abc', 'zx'),
 ('ba', 'eg'),
 ('ba', 'yz'),
 ('ba', 'zx'),
 ('eg', 'yz'),
 ('eg', 'zx'),
 ('yz', 'zx')]

1 个回答

0

这个列表推导式看起来没有设置好。我不太明白你的数据框(DataFrame)和实现之间的关系,但似乎你实现中的列表推导式没有达到你想要的效果。下面的代码是不是你想要的呢?

a = [jf.levenshtein_distance(x[0], x[1]) for x in itertools.combinations(d,2)]

撰写回答