字符串搜索部分字符串

2024-03-29 15:02:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据

list = ['good dog','bad cat']

pattern = '|'.join(list)

|column|
|---|
|bad cat|
|good dog|
|cat|
|dog|

当我在pandas中执行字符串contains时,只有完全匹配的字符串才能得到如下所示的真输出

df[column].str.contains(pattern,regex=True)

|column|
|---|
|True|
|True|
|False|
|False|

有没有可能做一些类似模糊匹配的事情,其中模式中的部分字符串也会被检查?既然“猫”和“狗”部分存在,那么输出结果都是真的吗?你知道吗

谢谢。你知道吗


Tags: 数据字符串falsetruepandasdfcolumnlist
1条回答
网友
1楼 · 发布于 2024-03-29 15:02:09

自定义指标

写一个粗糙的模糊匹配度量。您可能可以通过删除高频词并适当地进行词干分析来调整此度量。你知道吗

def fuzz(a, b):
    a = np.asarray(a)
    b = np.asarray(b)
    c = a[:, None] == b[None, :]
    return min(c.max(0).mean(), c.max(1).mean())

这将计算一个列表中有多少单词与另一个列表中有多少单词匹配。你知道吗

我们构建了一个数据框架来帮助说明。你知道吗

d = pd.DataFrame([
    [fuzz(a, b) for b in map(str.split, lst)]
                for a in df.column.str.split()
], df.index, lst)

d

   good dog  bad cat
0       0.0      1.0
1       1.0      0.0
2       0.0      0.5
3       0.5      0.0

我们可以看到,对于第一行和第二行和第三行,我们得到了一个1.0的度量。对于第三行和第四行,我们得到了0.5的度量值,这意味着匹配的单词有一半。你知道吗

现在设置一个阈值,并查找行中是否有超过阈值的项:

阈值为.5

df[d.ge(.5).any(1)]

     column
0   bad cat
1  good dog
2       cat
3       dog

阈值为.6

df[d.ge(.6).any(1)]

     column
0   bad cat
1  good dog

莱文施坦

使用Levenshtein距离比

import Levenshtein

c = pd.DataFrame([
    [Levenshtein.ratio(a, b) for b in lst]
    for a in df.column
], df.index, lst)

c

   good dog   bad cat
0  0.266667  1.000000
1  1.000000  0.266667
2  0.000000  0.600000
3  0.545455  0.200000

你可以做与上面相同的阈值分析。你知道吗

相关问题 更多 >