将列中的每一行与同一列中的每一行进行比较,如果匹配率 > 90,则使用 python 中的模糊逻辑删除该行

Compare each row in column with every row in the same column and remove the row if match ratio is > 90 with fuzzy logic in python

用python中的模糊逻辑将列中的每一行与同一列中的每一行进行比较,如果匹配率 > 90,则删除该行。我尝试使用重复项删除,但有些行具有相同的内容和一些额外的信息。数据如下

print(df)

输出为:

    Page no
0   Hello
2   Hey
3   Helloo
4   Heyy
5   Hellooo

我正在尝试将每一行与每一行进行比较,如果行与比率大于 90 的内容匹配,则使用模糊逻辑将其删除。预期输出是:

    Page no
0   Hello
2   Hey

我试过的代码是:

def func(name):
    matches = df.apply(lambda row: (fuzz.ratio(row['Content'], name) >= 90), axis=1)
    print(matches)
    return [i for i, x in enumerate(matches) if x]

func("Hey")

上面的代码只检查一行有一句嘿

谁能帮我写代码?这真的很有帮助

  • 使用itertools.combinations获取值的所有组合
  • 然后 apply() fuzz.ratio()
  • 分析结果和 select 与另一个组合不完全匹配的行
import pandas as pd
import io
import itertools
from fuzzywuzzy import fuzz

df = pd.read_csv(
    io.StringIO(
        """    Page_no
0   Hello
2   Hey
3   Helloo
4   Heyy
5   Hellooo"""
    ),
    sep="\s+",
)

# find combinations that have greater than 80 match
dfx = pd.DataFrame(itertools.combinations(df["Page_no"].values, 2)).assign(
    ratio=lambda d: d.apply(lambda t: fuzz.ratio(t[0], t[1]), axis=1)
).loc[lambda d: d["ratio"].gt(80)]

# exclude rows that have big match to another row...
df.loc[~df["Page_no"].isin(dfx[1])]

Page_no
0 Hello
2 Hey