Twitter API:如何在标签结尾处匹配标点符号?

时间:2017-03-13 17:07:41

标签: ruby twitter

我正在使用Twitter gem生成包含图片的特定主题标签的最近推文列表。

它工作正常,但我注意到当人们在其推文中将标点添加到主题标签时,API不会将它们包含在我的搜索结果中。为了说明,当我搜索#sourcecon时,它不包含使用#sourcecon!

的推文

通过#sourcecon.#sourcecon!的API运行单独搜索无效 - 它会忽略标点并生成相同的列表。

我的代码在这里:

twitter_client.search("'#sourcecon' filter:images", result_type: "recent", :since_id => last_tweet).collect

VS

twitter_client.search("'#sourcecon!' filter:images", result_type: "recent", :since_id => last_tweet).collect

我知道Twitter将标点符号视为不是标签的一部分。来自twitter API:

  

请注意,标点符号不被视为#hashtag或@mention的一部分,因此包含标点符号的跟踪词与#hashtags或@mentions不匹配。

但是不应该意味着它会完全忽略它并返回所有结果(包括那些在推文中包含附加标点符号的结果?)

有没有人知道如何在此处获取搜索结果,其中包括最后是否有标点符号的标签提及?

1 个答案:

答案 0 :(得分:2)

通过Twitter搜索,标点符号和特殊字符将被视为您要搜索的字词的一部分,因此搜索#twitter!'将返回' #twitter!'," twitter?',' #twitter'等。您可以做的是检查搜索是否包含任何类型的搜索标点符号,如果是,您可以对数组进行排序以首先添加这些推文。

require 'twitter'

module TwitterSearch
  extend self

  @twiiter_client = Twitter::REST::Client.new do |config|
    config.consumer_key        = ""
    config.consumer_secret     = ""
    config.access_token        = ""
    config.access_token_secret = ""
  end

  # search returns  
  # Check out what @researchgoddess is up to at #sourcecon! 
  # What a welcome from @SourceCon! Thanks @CareerBuilder for hosting.#   
  # RT @JRoberts257: Happy hour at #SourceCon! Thanks @CareerBuilder for 
  # Happy hour at #SourceCon! Thanks @CareerBuilder for sponsoring. ht
  # @RT @cybsearchjoe: #SourceCon is rocking
  # etc 

  def search(text)
    tweets = @twitter_client.search("#{text} filter:images", result_type: "recent").take(30).collect do |tweet|
        "#{tweet.text}"
    end
    # looks to see if there is puncuation at the end of the text "!.?{}[]" It will ignore the # at the beginning 
    tweets = sort_tweets(text, tweets) if text[1..text.length] =~ /[[:punct:]]/
    puts tweets 
  end


  # sorts tweets based off index given in match_phrase 
  def sort_tweets(text, tweets)
    tweets.sort do |phrase, other_phrase| 
      match_phrase(phrase, text, tweets) <=> match_phrase(other_phrase, text, tweets) 
    end
  end

  # if phrase matches punc_text(text) the phrase will be inserted at the beginning of the array else it will return its previous index. 
  def match_phrase(phrase, text, tweets)
    phrase.match(/#{punc_text(text)}/i).nil? ? tweets.index(phrase) + 1 : 0 
  end

  # adds backslash to punctuation '#sourcecon//?|!|.'
  def punc_text(text)
    text[1..text.length].gsub(/([[:punct:]])/){|punc| "\\#{punc}"}
  end
end

TwitterSearch.search('#sourcecon!')