【问题标题】: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将列中的每一行与同一列中的每一行进行比较,如果匹配率> 90,则使用python中的模糊逻辑删除该行
【发布时间】:2021-07-02 16:36:18
【问题描述】:

用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")

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

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

【问题讨论】:

  • 您使用什么库进行“模糊”匹配/同义词。你的例子只是开始,那是你想要的吗?需要定义你的算法...
  • 我已经更新了我尝试过的代码,但这仅适用于一行,我们必须输入句子。你能调查一下问题吗

标签: python pandas dataframe fuzzy-logic fuzzy-comparison


【解决方案1】:
  • 使用itertools.combinations 获取所有值组合
  • 然后apply()fuzz.ratio()
  • 分析结果并选择与其他组合没有强匹配的行
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

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多