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​​ 中,有一个漂亮的数组方法,使用它&可以让你“交叉”两个数组并找到共同的值。像这样:

[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存储同义词的哈希/数组的模型提供一个字段。

于 2012-10-20T00:25:24.687 回答
0

嗯。。。好吧

您如何看待这种方法,对于每种类型,您将使用一个通用名称(如环境),对于每个同义词,您会将它们与哈希相关联。IE

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 回答
0

对于每个同义词,创建一个实例,Genrename是同义词,并且与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 回答