Ruby on rails 推特排除

Ruby on rails 推特排除,ruby-on-rails,ruby,twitter,Ruby On Rails,Ruby,Twitter,让我们假设我有一个站点,用户在其中创建主题并在水果上写线程 为了让用户了解整个网络上的所有水果对话,我收集与特定主题相关的推文,并根据推文内容创建线程 显然,tweet与主题相关是非常重要的。假设用户创建了一个名为“苹果和桔子”的主题。我调出所有包含关键词苹果和/或橙子的推特 我遇到的问题是,一些推特用户写了一条推特,其中包括关键词Apple、Oranges、Pears,例如,它被收集并作为一条线索发布到Apple和Oranges讨论主题。这让用户很生气 因此,我需要的是一种过滤掉任何包含苹果和

让我们假设我有一个站点,用户在其中创建主题并在水果上写线程

为了让用户了解整个网络上的所有水果对话,我收集与特定主题相关的推文,并根据推文内容创建线程

显然,tweet与主题相关是非常重要的。假设用户创建了一个名为“苹果和桔子”的主题。我调出所有包含关键词苹果和/或橙子的推特

我遇到的问题是,一些推特用户写了一条推特,其中包括关键词Apple、Oranges、Pears,例如,它被收集并作为一条线索发布到Apple和Oranges讨论主题。这让用户很生气

因此,我需要的是一种过滤掉任何包含苹果和/或橙子以外的水果词的tweet的方法

例如,如果一个推特用户写下“我喜欢苹果、桔子、梨和葡萄”,那么该推特就不应该包括在内

现在,您只能让Twitter搜索查询变得如此复杂。因此,在收集推文之后,必须在Ruby中执行排除逻辑


在编程方面,您将如何解决这个问题?

是的,您应该在Ruby中完成这项工作。在找到一条tweet后,确保它不包含除搜索关键字以外的任何关键字。因此,如果你通过搜索“苹果”找到了这条推文,你应该确保它不包含其他(N-1)关键词,如橙色、葡萄等


或者,你可以将tweet拆分成几个词,然后确保除了搜索的词外,没有任何词与你的关键词匹配。这会更快,因为tweet可能只包含比你的关键字数量更少的单词

确定与主题名称相关的单词。梨、葡萄等。然后可以排除使用这些相关词语的推特

实现这一点的一种方法是使用googleset

注意:由于这项服务没有官方的API(这将是多么棒!),我很不幸没有完全容忍我自己的解决方案。不过,如果你打算使用这种策略,我建议你存储谷歌的搜索结果集

require 'google_set'

twitter_search_terms = ['apples', 'oranges']
# Mocked twitter search method
tweets = search_twitter(twitter_search_terms)
# returns ["Both apples and oranges are great!", "I love Apples, Oranges, Pears, and Grapes."]

related_words = GoogleSet.for(*twitter_search_terms)
# returns ["apples", "oranges", "bananas", "peaches", "pears", "grapes", "strawberries", "plums", ...]
related_words = (related_words - twitter_search_terms).each(&:downcase)

good_tweets = []
bad_tweets = []
tweets.each do |tweet|
  tweet_words = tweet.downcase.split
  # Remove any non-word characters
  tweet_words = tweet_words.map { |word| word.gsub(/\W+/, '') }.compact

  if (tweet_words - related_words).size == tweet_words.size
    good_tweets << tweet
  else
    bad_tweets << tweet
  end
end

p good_tweets
# returns ["Both apples and oranges are great!"]

p bad_tweets
# returns ["I love Apples, Oranges, Pears, and Grapes."]
require'google\u set'
推特搜索词=['apples','oranges']
#模拟twitter搜索方法
tweets=search\u twitter(twitter\u搜索词)
#返回[“苹果和桔子都很棒!”,“我喜欢苹果、桔子、梨和葡萄。”]
related_words=GoogleSet.for(*twitter_搜索词)
#返回[“苹果”、“橙子”、“香蕉”、“桃子”、“梨”、“葡萄”、“草莓”、“李子”…]
相关词=(相关词-推特搜索词)。每个(&:downcase)
好消息=[]
糟糕的推文=[]
tweets.each do| tweet|
tweet_words=tweet.downcase.split
#删除任何非单词字符
tweet_words=tweet_words.map{| word | word.gsub(/\W+/,'')}.compact
if(tweet\u words-related\u words).size==tweet\u words.size
好的推特看看Ruby宝石。

类水果{:name=>words).eql?(1)
结束
#如果验证通过,则解析结果
创建前:从文本解析水果
def解析来自文本的水果
self.fruit_id=fruit.first(:conditions=>{:name=>words},:select=>'id').id
结束
定义词
@words | |=this.text.split(“”)
结束
结束
#现在你可以做。。。
create(json)

您需要考虑水果名称的大小写差异。我建议将所有名称保存为小写,然后对所有查询进行降格。您也可以使用小写编写自定义SQL查询。

作为补充建议,考虑到您的网站可能实际上与水果无关,您可以决定使用哪些关键字排除在用户在站点上创建的其他组上绘制


例如,如果有人创建了一个“苹果”组,而其他人创建了一个“橙子”组,那么就会出现一条关于“苹果和橙子”的推特将正确显示在这两个页面中,但关于桔子和金橘的推文将正确显示在桔子线程中,直到其他人为金橘创建了一个组。

如果您显示了您已经尝试过的示例代码,您可能会得到更具体的答案。
class Fruit < AR::Base
  has_many :tweets
end

class Tweet < AR::Base
  belongs_to :fruit

  # validation catches any tweets that mention more than one fruit
  def validate
    self.errors[:base] = 'Mentions too many fruit' unless single_topic?
  end

  def single_topic?
    Fruit.count(:conditions => {:name => words).eql?(1)
  end

  # if validation passes the the fruit is parsed
  before_create :parse_fruit_from_text

  def parse_fruit_from_text
    self.fruit_id = Fruit.first(:conditions => {:name => words}, :select => 'id').id
  end

  def words
    @words ||= this.text.split(' ')
  end

end

# Now you can just do...
Tweet.create(json)