1

乱雑なタイトルのリストがあります (1000 としましょう)。私が作成した少数のジャンルに一致する「キーワード」を分析したいこれらのタイトル (タイトルはモデルではありませんが、ジャンルはモデルです)。

たとえば、最初のタイトル文字列が"awesome playlist of house, EDM and ambient"

さて、私も 15 を持っているとしましょうGenres。それぞれに属性がありますname

私の最終的な目標は、そのタイトル文字列にジャンルを割り当てたいということです。これは、文字列の正規化を行ってから、.include?

しかし、同義語があると役に立ちません。たとえば、私の @genre.name は と呼ばれchill、上記の文字列に適用する必要ambientがあります。同様に、ダンス ミュージックの @genre.name は と呼ばれdance、上記の文字列に含める必要がEDMあります (edm = エレクトロニック ダンス ミュージック)

だから私がやりたいのは、ジャンルごとに 10 ほどの同義語を追加して、それらもチェックできるようにすることです。

問題は、ループ内でこれを行う方法がわからないことです.ループ内にループがあると思いますか?

これは、同義語のない「単一レベル」の私のコードです

  def determine_genres(title)
    relevant_genres = []
    @genres.each do |genre|
      if normalize_string(title).include? normalize_string(genre.name)
        relevant_genres << genre.id
      end
    end
    relevant_genres
  end
4

3 に答える 3

1

文字列の配列の配列と言うとき、あなたは間違いなく正しい軌道に乗っています。私はそれをもっと次のように構成します:

genres = {
    'chill' => ['ambient','mood','chill'],
    'dance' => ['edm','trance','house',]
}

など、ハッシュ内の各キーは の名前で@genre.nameあり、対応する配列はその @genre の可能な同義語/サブジャンルのすべてのリストです。

ruby には、&2 つの配列を「交差」させて共通の値を見つけることができる気の利いた配列メソッドがあります。そのようです:

[1,2,3,4,5] & [0,3,5,6,8]  OUTPUT: [3,5]

詳細はこちら: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26

正規化された文とすべてのキー タームの配列を交差する場合、出力された交差配列の長さが > 0 であれば、そのジャンルに一致するキー タームがあり、そのジャンルは関連していると言えます。

したがって、ループを次のように編集します (上記の配列のジャンル ハッシュを使用)。

def determine_genres(title)
  relevant_genres = []
  genres.each do |genre, terms|
    intersecting_terms = normalize_string(title) & terms
    if intersecting_terms.length > 0
      relevant_genres << Genre.find_by_name(genre).id
    end
  end
  relevant_genres
end

Genre同義語のハッシュ/配列を格納するモデルの DB にフィールドを作成することもできます。

于 2012-10-20T00:25:24.687 に答える
0

シノニムごとにGenre、それnameがシノニムであり、 が代表的なシノニムとid同じである のインスタンスを作成します。

あなたの構造が最も効果的かどうかはわかりませんが、それを使用すると、次のようにリファクタリングできます。

def determine_genres(title)
  title = normalize_string(title)
  @genres.select{|genre| title.include? normalize_string(genre.name)}.map(&:id)
end
于 2012-10-20T00:25:11.423 に答える
0

んー...わかった

このアプローチについてどう思いますか。ジャンルごとに一般的な名前 (アンビエントなど) を使用し、シノニムごとにそれらをハッシュに関連付けます。すなわち

hsh = {"chill" => "ambient",
 "chillout" => "ambient",
 "chilloff" => "ambient",
 "ambient" => "ambient",
 "trance"  => "electronic"
}

#then you just need to check the Hash like this:

puts hsh['chill']  #=> ambient
puts hsh['chillout'] #= ambient
puts hsh['trance'] #=> electronic

欠点は、これらの同義語をすべて書き留める必要があることです。

于 2012-10-19T23:51:03.073 に答える