2

私は、トラックの歌詞を使用して、曲がお互いに感情的にどれだけ密接に関連しているかを把握する音楽レコメンデーション エンジンを構築しています。tfidf アルゴリズム (ここには示されていません) を使用して各曲のスコアを生成しました。各トラックの tfidf スコアを django モデル フィールドに保存したいと思いtfidfます。しかし、各 tfidf スコアを 0 ~ 1 のスケールで正規化したいと思います。

私が抱えている問題は、誰かが管理インターフェイスに tfidf 値を入力するとすぐに、これらの tfidf スコアを自動的に正規化する方法を見つけることです。管理画面に入って、「In Da Club」という曲をデータベースに追加したいとします。曲の名前とその tfidf スコアを次のように入力します。

ここに画像の説明を入力

私がやりたいのは、保存ボタンを押すとすぐに、空のnormalized_tfidf列に正規化された値が自動的に入力されるようにすることです。単純なアルゴリズムを使用して tfidf 値を正規化しています。説明に入る前に、アルゴリズムが何をしているかをより明確に把握できるように、この表がどのようになるかをお見せしましょう。したがって、「In Da Club」がデータベースに追加された後 (およびデータが正規化された後)、テーブルの列は次のようになります。

ここに画像の説明を入力

曲 x と曲 y は、アルゴリズムが動作する上限と下限を設定するためにデータベースにシードしたダミーの曲です。あなたが見るその値は.50077、私が自動的に生成しようとしているものです。

アルゴリズムは、曲 x の特徴 tfidf の正規化された値 (nv) を見つけるために、曲の tfidf スコアとテーブル内の最小の tfidf スコアとの差を見つけ、それを最大と最小の tfidf スコアの差で割ります。テーブル。ここでは数学的にです。

nv(in da club tfidf ) = (in da club tfidf – tfidf min ) / (tfidf max – tfidf min )

そして、ここに計算があります:

nv(クラブ内) = (.25048 - .00010) / (.50000 - .00010) = .50077

だから私はそれを自分のモデルにコーディングしようとしています。問題は、django には、SQL ステートメントでできるように、テーブル内の最小値と最大値の tfidf 値を選択できるメソッドがないように見えることです。私はdjangoにかなり慣れていないため、djangoの機能を完全には認識していません。このテーブルのモデルが以下のように見える場合、管理者に入力すると tfidf が自動的に正規化されるように書き換える最良の方法は何でしょうか?

class Party(models.Model):
    song = models.CharField(max_length=30)
    tfidf = models.FloatField()
    normalized_tfidf = models.FloatField()
4

2 に答える 2

2

モデルの保存時にアクションをトリガーする方法は2つあります。saveメソッドをオーバーライドするか、post_saveリスナーを作成します。オーバーライドメソッドは少し単純で、このユースケースにうまく適合しているので、ここで説明します。

最大/最小を取得するには、Djangoのクエリセット集計関数を使用できます。

from django.db.models import Max, Min


class Party(models.Model):
    ...
    def save(self, *args, **kwargs):
        max = Party.objects.all().aggregate(Max('tfidf'))['tfidf__max']
        min = Party.objects.all().aggregate(Min('tfidf'))['tfidf__min']
        self.normalized_tfidf = (self.tfidf - min) / (max - min)
        super(Party, self).save(*args, **kwargs)

のようなデフォルトのモデルメソッドをオーバーライドするのは非常に簡単ですが、興味がある場合は、ここsaveにいくつかの詳細情報があります。

いずれかの時点で一括更新を行っている場合Party.tfidf、保存ハンドラーは呼び出されない(または、post_saveシグナルが送信される)ため、すべての行を手動で処理する必要があることに注意してください。これは、多くのことを意味します。 DB書き込みの数であり、一括更新を行うことはほとんど無意味になります。

于 2012-05-14T14:38:50.670 に答える