我正在使用兩個資料框,一個帶有藥物表格的縮寫,另一個帶有完整版本的藥物表格。我想檢查具有多個子字串(作為單詞)的字串是否都包含在另一個字串中單詞的開頭。
我有:
df1
abrev
'dis ijp'
'dis inf'
'dis inj'
我正在嘗試將這些縮寫與字串與這些藥物表格的完整版本相關聯:
df2
term
'Dispergovate?ná tableta'
'Dispergovate?né tablety do dávkovacieho zariadenia'
'Disperzia na koncentrát na infúznu disperziu'
'Disperzia pre rozpra?ova?'
我嘗試使用fuzzywuzzy,但它很少與正確的字串匹配,因為我有數百個,所以降低閾值會導致錯誤的匹配。df2如示例中所示,大多數縮寫詞甚至都沒有正確的術語來匹配。
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
def fuzzy_partial(df_1, df_2, key1, key2, threshold=90, limit=3):
"""
:param df_1: the left table to join
:param df_2: the right table to join
:param key1: key column of the left table
:param key2: key column of the right table
:param threshold: how close the matches should be to return a match, based on Levenshtein distance
:param limit: the amount of matches that will get returned, these are sorted high to low
:return: dataframe with boths keys and matches
"""
s = df_2[key2].tolist()
m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit, scorer = fuzz.partial_ratio))
df_1['matches'] = m
m2 = df_1['matches'].apply(lambda x: '; '.join([i[0] for i in x if i[1] >= threshold]))
df_1['matches'] = m2
return df_1
fuzzy_partial(df1,df2,'abrev','term',threshold=50)
此代碼示例使用partial_ratio記分器,但我嘗試使用所有記分器。這就是為什么我想將子字串與完整術語上的單詞開頭進行匹配。這樣,我會得到:
df
abrev term
'dis inf' 'Disperzia na koncentrát na infúznu disperziu'
最好的方法是什么?
uj5u.com熱心網友回復:
概念:
查看每個單詞是否以每個縮寫開頭。如果是,則計算它并將下一個單詞與下一個縮寫進行比較。如果最終計數等于縮寫詞的數量,則意味著該術語包含其中的所有縮寫詞;所以,把它放在結果串列中。對所有術語和縮寫執行此操作。最后,回傳結果串列以查看所有匹配的情侶。
代碼:
abrevs = ['dis ijp','dis inf','dis inj',]
terms = ['Dispergovate?ná tableta',
'Dispergovate?né tablety do dávkovacieho zariadenia',
'Disperzia na koncentrát na infúznu disperziu',
'Disperzia pre rozpra?ova?',]
def find_all(abrevs, terms):
result = []
for abrev in abrevs:
abrev_match_count = 0
abrev_split = abrev.split(' ')
for term in terms:
for word in term.split(' '):
if abrev_match_count < len(abrev_split) and word.lower().startswith(abrev_split[abrev_match_count]):
abrev_match_count = 1
if abrev_match_count == len(abrev_split):
result.append((abrev,term))
return result
print(find_all(abrevs, terms))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494179.html
