我有以下数据
list = ['good dog','bad cat']
pattern = '|'.join(list)
|column|
|---|
|bad cat|
|good dog|
|cat|
|dog|
当我将字符串包含在大熊猫中时,只有完全匹配的字符串才会获得True输出,如下所示
df[column].str.contains(pattern,regex=True)
|column|
|---|
|True|
|True|
|False|
|False|
是否可以执行诸如模糊匹配之类的操作,其中还检查了模式中的部分字符串?既然“猫”和“狗”部分存在,那么输出将全部为真?
谢谢。
答案 0 :(得分:1)
写一个粗略的模糊匹配度量。您可能可以通过删除高频词并适当词干来调整此指标。
<ul>
<li class="home menu"><a href="#home.html">Home</a>
<ul class="home-dropdown">
<li><a href="#vocalcoaching">Vocalcoaching</a></li>
<li><a href="#circlesinging">Circlesinging</a></li>
</ul>
</li>
<li class="uber menu"><a href="#uber.ich.html">Über mich</a></li>
<li class="vocal menu"><a href="#">Vocalcoaching</a>
<ul class="vocal-drop">
<li><a href="#vocalcoaching">Gesangunterricht</a></li>
<li><a href="#songwriting">Songwriting</a></li>
<li><a href="#tech">Technische Geräte</a></li>
</ul>
</li>
<li class="circle menu"><a href="#">Circlesinging</a>
<ul class="circle-drop">
<li><a href="#what">Was ist Was</a></li>
<li><a href="#volume1">Volume 1</a></li>
<li><a href="#volume2">Volume 2</a></li>
<li><a href="#volume3">Volume 3</a></li>
</ul>
</li>
</ul>
这将计算一个列表中的单词数与另一个列表中的单词数。
我们建立了一个数据框来帮助说明。
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
的度量分别为'bad cat'
。对于第三行和第四行,我们得到'good dog'
的量度,表示匹配的单词的一半。
现在,您设置了一个阈值,并查找行中是否有任何超过阈值的东西:
阈值为0.5
.5
阈值为df[d.ge(.5).any(1)]
column
0 bad cat
1 good dog
2 cat
3 dog
.6
使用Levenshtein的距离比
df[d.ge(.6).any(1)]
column
0 bad cat
1 good dog
您可以执行与上述相同的阈值分析。