10

それぞれが1列の名前を含む2つのcsvファイルをあいまい一致させようとしていますが、それらは似ていますが同じではありません。

これまでの私のコードは次のとおりです。

import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv

save_file = open('fuzzy_match_results.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')

def parse_csv(path):

with open(path,'r') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        yield row


if __name__ == "__main__":
## Create lookup dictionary by parsing the products csv
data = {}
for row in parse_csv('names_1.csv'):
    data[row[0]] = row[0]

## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"):
    #print(process.extract(row,data, limit = 100))
    for found, score, matchrow in process.extract(row, data, limit=100):
        if score >= 60:
            print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
            Digi_Results = [row, score, found]
            writer.writerow(Digi_Results)


save_file.close()

出力は次のとおりです。

Name11 , 90 , Name25 
Name11 , 85 , Name24 
Name11 , 65 , Name29

スクリプトは正常に動作します。出力は期待どおりです。しかし、私が探しているのはベストマッチだけです。

Name11 , 90 , Name25
Name12 , 95 , Name21
Name13 , 98 , Name22

したがって、列 2 の最大値に基づいて、列 1 の重複した名前をどうにかして削除する必要があります。これはかなり簡単なはずですが、理解できないようです。どんな助けでも大歓迎です。

4

3 に答える 3

10

fuzzywuzzy'sprocess.extract()は、最も一致するものが最初になるように、逆順でソートされたリストを返します。

したがって、最適な一致だけを見つけるには、制限引数を に設定して1、最適な一致のみを返すようにし、それが 60 より大きい場合は、現在行っているように csv に書き込むことができます。

例 -

from fuzzywuzzy import process
## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"):

    for found, score, matchrow in process.extract(row, data, limit=1):
        if score >= 60:
            print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
            Digi_Results = [row, score, found]
            writer.writerow(Digi_Results)
于 2015-08-17T17:19:40.293 に答える
5

process.extractOne()コードのいくつかの部分は、 FuzzyWuzzy から使用することで大幅に簡素化できます。上位一致を返すだけでなく、別の論理ステップを実行する必要なく、関数呼び出し内でスコアしきい値を設定できます。たとえば、次のようになります。

process.extractOne(row, data, score_cutoff = 60)

この関数は、条件を満たす一致が見つかった場合、最高の一致とそれに付随するスコアのタプルを返します。それ以外の場合は返されNoneます。

于 2016-10-03T03:35:22.927 に答える