ホームページ >バックエンド開発 >Python チュートリアル >Pythonのファジーマッチングアルゴリズムを通じて2つのExcelテーブルの内容を分類する方法
インターンシップ中に、2 つの異なるエンジニアリング プロジェクトなど、2 つのテーブルの内容を照合して分類する必要があります。オブジェクトがすべて A である場合、これら 2 つのエンジニアリング プロジェクトは A に分類する必要があります。その中にはエンジニアリング プロジェクトと建設オブジェクトが非常に多くあるため、それらを自動的に分類するプログラムを作成することを考えました。これにより、大幅な削減が可能になります。作業負荷の。
2 つのテーブルのキーワードが類似しているため、つまり、一方のテーブルのコンテンツ形式がプロジェクト A、もう一方のテーブルのコンテンツ形式がユニット A であるため、キーワード「A」と一致してフィルタリングするだけです。この問題では、目的を達成するためにファジー マッチング アルゴリズムを使用しましたが、このアルゴリズムが唯一の可能な解決策ではありません。
注: ここでは、あいまい一致アルゴリズムを使用するための difflib ライブラリと、Excel テーブルをエクスポートするための xlwt ライブラリをインポートしました
まず、処理する必要がある 2 つの Excel テーブルをインポートします。
df1=pd.read_excel(r'D:\杂货\项目.xlsx',sheet_name='Sheet1') df2=pd.read_excel(r'D:\杂货\项目2.xlsx',sheet_name='Sheet1')#导入两个需要处理的excel表格
2 つのテーブルの内容と形式は、おおよそ上記のとおりです。私の要件は、これら 2 つのテーブルに関連するエンジニアリング プロジェクトを照合して分類することです。
処理したい 2 つの列のデータをリストに入れます。
for i in df1['XXXXXX改造']:#将这两列的数据存入list1和list2两个列表中 list1.append(i) for j in df2['XXXXXX新改']: list2.append(j)
ファジー マッチング アルゴリズムを使用して、list2 のデータ コンテンツを list1 のデータ コンテンツと 1 つずつ照合します。
for n in range(len(list2)):#通过模糊匹配算法,将list2与list1中的数据一一匹配,设置近似度为42%,得到匹配结果res query_word=str(list2[n]) res=difflib.get_close_matches(query_word,list1,1,cutoff=0.42) res = "".join(res) listx.append(res)
ここでは difflib ライブラリの get_close_matches(query_word,list1,n,cutoff) メソッドが呼び出されることに注意してください。ここで、query_word は一致した文字列、list1 は一致する文字列のリストです。 n は上位 n 個の最もよく一致するものの戻り値で、1 に設定します。cutoff は一致度であり、[0,1] の浮動小数点数であり、2 つの間の類似度とも言えます。特定の問題に従って、類似性レベルを 0.42 に設定し、一致させる必要がある 2 つのテーブルの内容を正常に一致させることができます。
res で一致するすべての結果はリスト形式であり、結果を新しいテーブルに書き込みたいため、結果は文字列形式で必要なので、 res="".join( res ) メソッドは、リストを文字列形式に変換し、結果を文字列形式で listx リストに入れて、新しい Excel テーブルへの書き込みを容易にします。
マッチング結果の抜けが心配だったので、list1 のデータ内容と list2 のデータ内容を 1 つずつマッチングさせました。
for m in range(len(list1)):#同上,将list1与list2的数据一一匹配 query_word=str(list1[m]) res=difflib.get_close_matches(query_word,list2,1,cutoff=0.42) res="".join(res) listy.append(res)
このとき、一致する文字列をlist1の文字列に、一致させる文字列リストをlist2に設定しました。他のパラメータは同じであり、これは最初にテーブル1を使用すると言っているのと同じです。表 2 と一致させてから、表 2 を使用して表 1 と一致させ、欠落している問題をより適切に解決できるようにします。
最後に新しい Excel テーブルのパラメータを設定します
workbook=xlwt.Workbook(encoding='utf-8')#设定好新的excel表格的参数 worksheet=workbook.add_sheet('test_sheet') worksheet.write(0,0,label='XXX改造')#从第0行第0列开始输入标签为XXX改造的数据 worksheet.write(0,1,label='XX金额')#从第0行第1列开始输入标签为XX金额的数据 worksheet.write(0,2,label='XXX新改') worksheet.write(0,3,label='XX金额') worksheet.write(0,4,label='已XXX金额') for i in range(len(listx)):#写入运算出来的数据 worksheet.write(i+1,0,label=listx[i]) for j in range(len(listy)): worksheet.write(j+1,2,label=listy[j]) for k in range(len(list1)): worksheet.write(k+1,1,label=list3[k]) for l in range(len(list2)): worksheet.write(l+1,3,label=list4[l]) worksheet.write(l+1,4,label=list5[l]) workbook.save(r'D:\杂货\新项目6.xls')#导出excel表格
ここで Excel テーブルにデータ内容を書き込む方法については、詳しくは紹介しません。 Excel の使用経験があり、コードの意味を容易に理解できる。
最終的な出力表の形式は次のとおりです。
# 2 回のマッチングを経て、相互一致度の高いものが表に表示されます。一致度が 1 つだけ高い場合は、左側にデータがあっても右側にデータがない、または右側にデータがあっても左側にデータがないことになります。
import pandas as pd import difflib import xlwt#导入库 df1=pd.read_excel(r'D:\杂货\项目.xlsx',sheet_name='Sheet1') df2=pd.read_excel(r'D:\杂货\项目2.xlsx',sheet_name='Sheet1')#导入两个需要处理的excel表格 list1=[]#设置空列表,用于存储2017年一列的数据 list2=[]#用于存储2018年一列的数据 list3=list(df1['XX金额'])#将excel表格中的列数据列表化 list4=list(df2['XX金额']) list5=list(df2['XXX金额']) listx=[]#用于存储匹配结果的数据 listy=[]#同上 for i in df1['XXXXXXXXX改造']:#将这两列的数据存入list1和list2两个列表中 list1.append(i) for j in df2['XXXXXXXXXXXXX新改']: list2.append(j) for n in range(len(list2)):#通过模糊匹配算法,将list2与list1中的数据一一匹配,设置近似度为42%,得到匹配结果res query_word=str(list2[n]) res=difflib.get_close_matches(query_word,list1,1,cutoff=0.42) res = "".join(res) listx.append(res) for m in range(len(list1)):#同上,将list1与list2的数据一一匹配 query_word=str(list1[m]) res=difflib.get_close_matches(query_word,list2,1,cutoff=0.42) res="".join(res) listy.append(res) workbook=xlwt.Workbook(encoding='utf-8')#设定好新的excel表格的参数 worksheet=workbook.add_sheet('test_sheet') worksheet.write(0,0,label='XXXXXXXXX改造') worksheet.write(0,1,label='XX金额') worksheet.write(0,2,label='XXXXXXXXXXX新改') worksheet.write(0,3,label='XX金额') worksheet.write(0,4,label='XXX金额') for i in range(len(listx)):#写入运算出来的数据 worksheet.write(i+1,0,label=listx[i]) for j in range(len(listy)): worksheet.write(j+1,2,label=listy[j]) for k in range(len(list1)): worksheet.write(k+1,1,label=list3[k]) for l in range(len(list2)): worksheet.write(l+1,3,label=list4[l]) worksheet.write(l+1,4,label=list5[l]) workbook.save(r'D:\杂货\新项目6.xls')#导出excel表格
以上がPythonのファジーマッチングアルゴリズムを通じて2つのExcelテーブルの内容を分類する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。