4 Stimmen

Ausschluss von Tweets

Nehmen wir an, ich habe eine Website, auf der die Benutzer Themen erstellen und Beiträge über Obst schreiben.

Um die Nutzer über alle Fruchtgespräche im gesamten Web auf dem Laufenden zu halten, sammle ich Tweets zu einem bestimmten Thema und erstelle Threads, die auf dem Inhalt des Tweets basieren.

Es ist wirklich wichtig, dass die Tweets für das Thema relevant sind. Nehmen wir an, ein Nutzer erstellt ein Thema namens "Äpfel und Orangen". Ich ziehe alle Tweets, die die Schlüsselwörter "Äpfel" und/oder "Orangen" enthalten.

Das Problem, das ich habe, ist, dass einige Twitter-Nutzer einen Tweet schreiben, der z. B. die Schlüsselwörter Äpfel, Orangen, Birnen enthält, und er wird gesammelt und als Thread zum Diskussionsthema Äpfel und Orangen gepostet. Das macht die Nutzer wütend!

Was ich also brauche, ist eine Möglichkeit, alle Tweets herauszufiltern, die andere Obstwörter als Äpfel und/oder Orangen enthalten.

Wenn ein Twitter-Nutzer beispielsweise schreibt "Ich liebe Äpfel, Orangen, Birnen und Trauben", dann sollte dieser Tweet nicht aufgenommen werden.

Jetzt kann man die Twitter-Suchabfrage nur noch so raffiniert gestalten. Die Ausschlusslogik muss also in Ruby ausgeführt werden, nachdem die Tweets gesammelt wurden.

Wie würden Sie dieses Problem programmatisch lösen?

7voto

Walking Wiki Punkte 699

Bestimmen Sie die Wörter, die mit dem Namen des Themas in Verbindung stehen. Birnen, Trauben, usw. Sie können dann Tweets ausschließen, die diese verwandten Wörter verwenden.

Eine Möglichkeit, dies zu tun, ist die Verwendung von Google Sets.

HINWEIS: Ich bin in der unglücklichen Lage, dass ich meine eigene Lösung nicht in vollem Umfang billigen kann, da dieser Dienst keine offizielle API hat (so großartig das auch wäre!). Wenn Sie jedoch diese Strategie anwenden wollen, würde ich vorschlagen, das Ergebnis von Google Set zu speichern.

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."]

1voto

Jordan Punkte 1210
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)

Bei Fruit#names müssen Sie die unterschiedliche Groß- und Kleinschreibung berücksichtigen. Ich würde vorschlagen, einfach alle Namen in Kleinbuchstaben zu speichern und dann alle Abfragen in Kleinbuchstaben zu schreiben. Sie könnten auch benutzerdefinierte SQL-Abfragen mit LOWER schreiben.

0voto

Karthik Murugan Punkte 1389

Ja, Sie sollten dies in Ruby tun. Vergewissern Sie sich nach dem Auffinden eines Tweets, dass er keine anderen Schlüsselwörter als das Suchwort enthält. Wenn Sie also den Tweet durch die Suche nach "Apple" gefunden haben, sollten Sie sicherstellen, dass er keine anderen (N-1) Schlüsselwörter wie Orange, Trauben usw. enthält.

Alternativ können Sie den Tweet auch in einzelne Wörter aufteilen und dann sicherstellen, dass keines der Wörter mit Ihren Schlüsselwörtern übereinstimmt, außer dem gesuchten. Das geht schneller, da der Tweet möglicherweise nur weniger Wörter enthält als die Anzahl Ihrer Schlüsselwörter.

0voto

user94154 Punkte 15508

Werfen Sie einen Blick auf den Ruby Klassifikator gem.

0voto

B_. Punkte 2094

Nur als zusätzlicher Vorschlag: Da es auf Ihrer Website wahrscheinlich nicht um Obst geht, könnten Sie entscheiden, welche Schlüsselwörter Sie ausschließen, indem Sie die anderen Gruppen heranziehen, die die Nutzer auf Ihrer Website erstellen.

Wenn z. B. jemand eine Gruppe "Äpfel" und jemand anderes eine Gruppe "Orangen" erstellt, wird ein Tweet über "Äpfel und Orangen" in keiner der beiden Gruppen erscheinen, aber ein Tweet über Orangen und Kumquats würde korrekt im Orangen-Thread erscheinen, bis jemand anderes eine Gruppe für Kumquats erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X