ホームページ  >  記事  >  バックエンド開発  >  Django プロジェクトでのレーベンシュタイン距離による不正検出システムの実装

Django プロジェクトでのレーベンシュタイン距離による不正検出システムの実装

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-07 20:59:02346ブラウズ

Implémentation d

レーベンシュタイン距離は、不正検出システムで使用され、ユーザーが入力したデータ (名前、住所、電子メールなど) を既存のデータと比較し、類似しているが不正な可能性のあるエントリを識別することができます。

ここでは、この機能を Django プロジェクトに統合するためのステップバイステップのガイドを示します。


1. ユースケース

不正検出システムは以下を比較できます:

  • 類似メール: わずかな違いで作成されたアカウント (例: user@example.com と userr@example.com) を検出します。
  • 近いアドレス: 複数のアカウントがほぼ同じアドレスを使用しているかどうかを確認します。
  • 類似の名前: 名前がわずかに変更されたユーザーを検出します (例: John Doe 対 Jon Doe)。

2. 実装の手順

a.データを分析するためのミドルウェアまたはシグナルを作成する

Django の シグナル を使用して、登録または更新時に新しいユーザー データを確認します。

b.レーベンシュタイン計算機能をインストールする

レーベンシュタイン距離を計算するライブラリを統合するか、次のような Python 関数を使用します。

from django.db.models import Q
from .models import User  # Assume User is your user model

def levenshtein_distance(a, b):
    n, m = len(a), len(b)
    if n > m:
        a, b = b, a
        n, m = m, n

    current_row = range(n + 1)  # Keep current and previous row
    for i in range(1, m + 1):
        previous_row, current_row = current_row, [i] + [0] * n
        for j in range(1, n + 1):
            add, delete, change = previous_row[j] + 1, current_row[j - 1] + 1, previous_row[j - 1]
            if a[j - 1] != b[i - 1]:
                change += 1
            current_row[j] = min(add, delete, change)

    return current_row[n]

c.不正検出機能を追加します

シグナルまたはミドルウェアで、入力されたデータをデータベース内のデータと比較して、類似したエントリを見つけます。

from django.db.models import Q
from .models import User  # Assume User is your user model

def detect_similar_entries(email, threshold=2):
    users = User.objects.filter(~Q(email=email))  # Exclure l'utilisateur actuel
    similar_users = []

    for user in users:
        distance = levenshtein_distance(email, user.email)
        if distance <= threshold:
            similar_users.append((user, distance))

    return similar_users

d.ユーザー向けの Signal post_save に接続します

ユーザーが登録または更新した後に、post_save シグナルを使用してこのチェックを実行します。

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User
from .utils import detect_similar_entries  # Import your function

@receiver(post_save, sender=User)
def check_for_fraud(sender, instance, **kwargs):
    similar_users = detect_similar_entries(instance.email)

    if similar_users:
        print(f"Potential fraud detected for {instance.email}:")
        for user, distance in similar_users:
            print(f" - Similar email: {user.email}, Distance: {distance}")

え。オプション: 不正ログテンプレートを追加します

詐欺の疑いを追跡するには、FraudLog モデルを作成できます。

from django.db import models
from django.contrib.auth.models import User

class FraudLog(models.Model):
    suspicious_user = models.ForeignKey(User, related_name='suspicious_logs', on_delete=models.CASCADE)
    similar_user = models.ForeignKey(User, related_name='similar_logs', on_delete=models.CASCADE)
    distance = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)

疑わしい一致をこのテンプレートに保存します:

from django.db.models import Q
from .models import User  # Assume User is your user model

def levenshtein_distance(a, b):
    n, m = len(a), len(b)
    if n > m:
        a, b = b, a
        n, m = m, n

    current_row = range(n + 1)  # Keep current and previous row
    for i in range(1, m + 1):
        previous_row, current_row = current_row, [i] + [0] * n
        for j in range(1, n + 1):
            add, delete, change = previous_row[j] + 1, current_row[j - 1] + 1, previous_row[j - 1]
            if a[j - 1] != b[i - 1]:
                change += 1
            current_row[j] = min(add, delete, change)

    return current_row[n]

3. 改善と最適化

a.制限比較

  • 最近のユーザー、または同じ地域、会社などのユーザーのみを比較します。

b.しきい値を調整

  • フィールドに応じて、許容可能な距離の異なるしきい値を設定します (たとえば、電子メールのしきい値 1、名前のしきい値 2)。

c.高度なアルゴリズムの使用

  • RapidFuzz などのライブラリを探索して計算を最適化します。

d. Django Admin への統合

  • 潜在的な不正行為のリスクがあるユーザーに対して管理インターフェースにアラートを追加します。

4. 結論

このアプローチにより、レーベンシュタイン距離に基づいた不正検出システムが実装されました。同様のエントリを特定するのに役立ち、不正なアカウントの作成やデータの複製のリスクを軽減します。このシステムは拡張可能で、プロジェクトの特定のニーズに合わせて調整できます。

以上がDjango プロジェクトでのレーベンシュタイン距離による不正検出システムの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。