Исключение твитов - PullRequest
       2

Исключение твитов

4 голосов
/ 24 февраля 2011

Давайте представим, что у меня есть сайт, на котором пользователи создают темы и пишут темы на Fruit.

Чтобы информировать пользователей обо всех разговорах Fruit во всем Интернете, я собираю твиты, связанные с определенной темой, исоздавать темы, основанные на содержании твита.

Очень важно, чтобы твиты относились к теме, очевидно.Допустим, пользователь создает тему под названием «Яблоки и апельсины».Я вытащил все твиты, которые содержат ключевые слова Яблоки и / или Апельсины.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые пользователи Твиттера пишут твит, включающий, например, ключевые слова: яблоки, апельсины, груши, и он собирается и публикуется как тема в теме обсуждения яблок и апельсинов,Это злит пользователей!

Так что мне нужен способ отфильтровать любой твит, содержащий слова фруктов, кроме яблок и / или апельсинов.

Например, если пользователь твиттера пишет«Я люблю яблоки, апельсины, груши и виноград», тогда этот твит не должен быть включен.

Теперь вы можете только сделать поисковый запрос в Твиттере настолько сложным.Таким образом, логика исключения должна будет выполняться в Ruby после сбора твитов.

Программно, как бы вы решили эту проблему?

Ответы [ 5 ]

7 голосов
/ 27 февраля 2011

Определите слова, которые относятся к названию темы. Груши, виноград и т. Д. Затем можно исключить твиты, в которых используются эти связанные слова.

Один из способов сделать это - использовать Google Sets.

ПРИМЕЧАНИЕ. Я не полностью оправдываю свое собственное решение из-за того, что у этой службы нет официального API (каким бы замечательным это ни было!). Хотя, если вы собираетесь использовать тогда эту стратегию я бы предложил сохранить результат Google Set.

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."]
1 голос
/ 01 марта 2011
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)

Вам необходимо учитывать различия в регистре с именами Fruit #. Я бы посоветовал просто сохранить все имена в нижнем регистре, а затем уменьшить количество запросов. Вы также можете использовать запись пользовательских SQL-запросов, используя LOWER.

0 голосов
/ 04 марта 2011

Так же, как дополнительное предложение, учитывая, что ваш сайт, вероятно, на самом деле не о фруктах, вы можете решить, какие ключевые слова исключить, опираясь на другие группы, которые пользователи создают на вашем сайте.

Например, если кто-тосоздает группу «Яблоки», а кто-то другой создает группу «Апельсины», тогда твит о «Яблоках и апельсинах» будет правильно отображаться ни в одном из них, но твит об апельсинах и кумкватах будет правильно отображаться в ветке «Апельсины», пока кто-то другой не сделаетгруппа для кумкватов.

0 голосов
/ 01 марта 2011

Взгляните на Рубин Классификатор камень.

0 голосов
/ 24 февраля 2011

Да, вы должны сделать это в Ruby.Сразу после размещения твита убедитесь, что он не содержит никаких других ключевых слов, кроме ключевого слова поиска.Итак, если вы нашли твит, выполнив поиск «Apple», вам следует убедиться, что он не содержит других (N-1) ключевых слов, таких как «Оранжевый», «Виноград» и т. Д.

В качестве альтернативы вы можете разбить твит на словаа затем убедитесь, что ни одно из слов не соответствует вашим ключевым словам, кроме искомого.Это будет быстрее, так как твит может содержать только меньше слов, чем количество ключевых слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...