使用莱温施泰因距离根据另一列替换单词
假设我有一个数据表 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)