使用莱温施泰因距离根据另一列替换单词

2 投票
1 回答
627 浏览
提问于 2025-04-18 08:50

假设我有一个数据表 df1

Sr       A              B                            C
1      rains         It rain there.             It rains there
2      plane         This is a vertical planes  This is a vertical plane
3      tree          Plant a trees              Plant a tree

C 是我想要的结果。我需要把列 B 中的每个单词和列 A 中的单词进行比较,如果它们的 Levenshtein 距离是 1,就把它替换掉。

我的方法

import jellyfish as jf
def word_replace(str1):
    comp = #don't know how to store value of column A in this variable.
    for word in str1.split():
        if jf.levenshtein_distance(word,comp) == 1:
           word = comp
        else:
            pass
    return str1

df1['C'] = df1['B'].apply(word_replace)

还有一个问题,如果列 A 中有两个单词,比如 "near miss",我需要怎么修改上面的代码呢?比如:

 Sr       A              B                            C
  1     near miss        that was a ner mis          that was a near miss

1 个回答

5

你在Stack Overflow上问了两个问题,这样做通常不是个好主意。我只会回答你的第一个问题,如果你想让别人帮你看第二个问题,建议你单独写一个新问题。

pd.DataFrame.apply 可以在行或者列上操作,你想要逐行处理,所以需要传入 axis=1 这个参数。

下面是一些代码,可以解决你的问题。它使用了 列表推导式,结合了 三元运算符 来选择需要替换的单词。然后,这个列表会用 str.join() 方法连接成一个字符串。

你原来的代码是遍历分割后的字符串,但这样做不行,因为 在遍历列表时不能修改它们。另外,你的代码假设函数的输入是一个字符串,但实际上它应该是一个 pandas.Series 对象。

这段代码比较简单,没有考虑标点符号等问题,留给读者自己去思考。

import pandas as pd
import jellyfish as jf

data1 =  {'A':['rains','plane','tree'],'B':['It rain there','This is a vertical planes','Plant a trees']}
df1 = pd.DataFrame(data1)

def word_replace(row):
    comp = row['A']
    str1 = row['B']

    out = ' '.join([comp if jf.levenshtein_distance(word, comp) == 1
                    else word for word in str1.split()])
    return out

df1['C'] = df1.apply(word_replace, axis=1)

撰写回答