Skip to content

Instantly share code, notes, and snippets.

@hdknr
Last active February 17, 2025 00:24
Show Gist options
  • Save hdknr/1474a1ca0f43f1dd4e5c41feccd2f51f to your computer and use it in GitHub Desktop.
Save hdknr/1474a1ca0f43f1dd4e5c41feccd2f51f to your computer and use it in GitHub Desktop.
請求入金

請求入金

マッチング

文字列の揺らぎがある場合、ベクトルデータを使ったマッチングは非常に有効です。 具体的には、文字列の類似度を計算するために、自然言語処理(NLP)の技術を利用することができます。 以下は、fuzzywuzzyライブラリを使用して文字列の類似度を計算し、マッチングを行うサンプルコードです:

まず、必要なライブラリをインストールします:

pip install pandas openpyxl fuzzywuzzy

次に、サンプルコードです:

import pandas as pd
from fuzzywuzzy import fuzz

# 入金リストと請求明細のファイルパス
payments_file = 'payments.xlsx'
invoices_file = 'invoices.xlsx'

# Excelファイルからデータを読み込む
payments_df = pd.read_excel(payments_file)
invoices_df = pd.read_excel(invoices_file)

# 類似度の閾値を設定
similarity_threshold = 80

# マッチング結果を格納するリスト
matched_records = []

# 入金リストと請求明細をマッチングさせる
for _, payment in payments_df.iterrows():
    for _, invoice in invoices_df.iterrows():
        # 金額が一致するか確認
        if payment['金額'] == invoice['請求金額']:
            # 振り込み依頼人と顧客名の類似度を計算
            similarity = fuzz.token_sort_ratio(payment['振り込み依頼人'], invoice['顧客名'])
            if similarity >= similarity_threshold:
                matched_records.append({
                    '入金ID': payment['入金ID'],
                    '請求ID': invoice['請求ID'],
                    '金額': payment['金額'],
                    '振り込み依頼人': payment['振り込み依頼人'],
                    '顧客名': invoice['顧客名'],
                    '類似度': similarity
                })

# マッチング結果をデータフレームに変換
matched_df = pd.DataFrame(matched_records)

# マッチング結果を表示
print(matched_df)

# マッチング結果を新しいExcelファイルに保存
matched_df.to_excel('matched_results.xlsx', index=False)

このコードでは、以下の手順を実行しています:

  1. pandasライブラリを使用して、Excel ファイルから入金リストと請求明細を読み込みます。
  2. fuzzywuzzyライブラリを使用して、振り込み依頼人と顧客名の類似度を計算します。
  3. 金額が一致し、かつ文字列の類似度が閾値以上の場合にマッチングを行います。
  4. マッチング結果を表示し、新しい Excel ファイルに保存します。

記事

曖昧一致

Pythonで支払い請求先と入金振込元の曖昧一致処理を行う方法

支払い請求先リストと入金振込元リストのマッチング処理をPythonで実装し、曖昧一致を使って入金に対して請求の一致確度の高い候補リストを作成する方法について説明します。

1. データの前処理

まず、支払い請求先リストと入金振込元リストのデータをPythonで扱えるように読み込みます。 CSVファイルやExcelファイルなど、データの形式に合わせて適切な方法で読み込んでください。

import pandas as pd

# 支払い請求先リストを読み込む
billing_df = pd.read_csv("billing_list.csv")

# 入金振込元リストを読み込む
payment_df = pd.read_csv("payment_list.csv")

次に、半角カナ文字列の入力ゆらぎに対応するため、以下の前処理を行います。

  • 半角カナを全角カナに変換: jaconvライブラリを利用して、半角カナを全角カナに変換します。
  • 空白の除去: 文字列前後の空白や、連続する空白を除去します。
  • 記号の除去: 記号や特殊文字を除去します。
  • 正規化: 文字列を正規化することで、表記の揺れを吸収します(例:長音記号の統一)。
import jaconv
import re

def normalize_text(text):
    text = jaconv.h2z(text)  # 半角カナを全角カナに変換
    text = text.strip()  # 前後の空白を除去
    text = re.sub(r"\s+", " ", text)  # 連続する空白を1つの空白に置換
    text = re.sub(r"[^A-Za-z0-9\u30A1-\u30FF\u4E00-\u9FFF]", "", text)  # 英数字、カタカナ、漢字以外の文字を除去
    # 必要に応じて、さらに正規化処理を追加
    return text

billing_df["宛先"] = billing_df["宛先"].apply(normalize_text)
payment_df["宛先"] = payment_df["宛先"].apply(normalize_text)

2. 曖昧一致アルゴリズムの選択

曖昧一致を行うアルゴリズムはいくつか存在します。代表的なものとしては、以下のものがあります。

  • レーベンシュタイン距離: 2つの文字列間の編集距離(文字の挿入、削除、置換の回数)を測るアルゴリズムです。
  • コサイン類似度: 2つの文字列のベクトル表現の類似度を測るアルゴリズムです。
  • Jaro-Winkler距離: 2つの文字列間の類似度を測るアルゴリズムで、特に短い文字列の比較に適しています。

今回は、Jaro-Winkler距離を使って曖昧一致を行う例を示します。Levenshteinライブラリをインストールしてください。

pip install python-Levenshtein
import Levenshtein

def calculate_jaro_winkler_similarity(str1, str2):
    return Levenshtein.jaro_winkler(str1, str2)

3. マッチング処理の実装

支払い請求先リストと入金振込元リストを比較し、一致確度の高い候補リストを作成します。

def find_matching_candidates(payment_name, billing_df):
    candidates = []
    for billing_name in billing_df["宛先"]:
        similarity = calculate_jaro_winkler_similarity(payment_name, billing_name)
        if similarity > 0.8:  # 類似度が0.8以上のものを候補とする(閾値は調整可能)
            candidates.append((billing_name, similarity))
    candidates.sort(key=lambda x: x[1], reverse=True)  # 類似度順にソート
    return candidates

payment_df["候補リスト"] = payment_df["宛先"].apply(lambda x: find_matching_candidates(x, billing_df))

4. 結果の確認

作成された候補リストを確認し、必要に応じて閾値を調整してください。

print(payment_df)

補足

  • 上記の実装では、Jaro-Winkler距離を使用していますが、他のアルゴリズムを使用することも可能です。
  • 類似度の閾値は、データや要件に合わせて調整してください。
  • より高度なマッチング処理を行う場合は、複数のアルゴリズムを組み合わせたり、機械学習を活用したりすることも検討できます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment