使用recordlinkage进行python字符串匹配-针对特定情况编写规则的可能性

问题描述

我正在使用python的recordlinkage工具包来对来自两个dataframesdf1df2的学校名称列进行字符串匹配,同时阻止它们公共列'division'

我的代码如下:

import recordlinkage
from recordlinkage.standardise import clean

indexer = recordlinkage.Index()
indexer.block('division')
candidate_links_2 = indexer.index(df1,df2)
compare = recordlinkage.Compare()
compare.string('school_name','school_name',method='jaro',threshold=0.95)
compare_vectors_2 = compare.compute(candidate_links_2,df1,df2)

matches_2 = compare_vectors_2[compare_vectors_2[0]==1.0]
matches_2.reset_index(inplace=True) 
matches_2 = matches_2.rename(columns={'level_0': 'df1_index','level_1': 'df2_index',0: 'match'})

matches_duplicates_dropped_2 = matches_2.drop_duplicates(subset = ['df1_index'],keep = 'last') 
matches_duplicates_dropped_2

使用此代码,我得到了一些不匹配的匹配-

    df1_index   df2_index   match   df1_school  df2_school
2   15136   26636   1.0 girls middle 34sp   girls middle 53sp
4   15137   26636   1.0 girls middle 34sp   girls middle 53sp
7   15148   26636   1.0 girls middle 35sp   girls middle 53sp
10  15149   26636   1.0 girls middle 35sp   girls middle 53sp
... ... ... ... ... ...
43794   64087   6601    1.0 islamabad model i v2 i 91ii islamabad model i v2 i 101ii

我想创建一个单独的规则,其中school_name中是否有数字,例如'girls middle 35sp'具有数字35等,数字必须是“完全匹配” ,因此'girls middle 35sp' 应仅与匹配'girls middle 35sp',并且不应与 'girls middle 53sp'等匹配。

我想知道这是否有可能,或者为此目的是否有更好的工具包。

解决方法

您应该尝试阈值= 1。

来自documentation

阈值(浮点数,浮点数的元组)–一个阈值。所有大于或等于此阈值的近似字符串比较均为1。否则为0。