如何从推文中分离主题标签?

时间:2013-08-13 15:41:55

标签: ruby

从字符串中删除哈希标记,然后将哈希标记词连接在另一个以逗号分隔的字符串中,这是一种好方法:

'Some interesting tweet #hash #tags'

结果将是:

'Some interesting tweet'

'hash,tags'

3 个答案:

答案 0 :(得分:7)

str = 'Some interesting tweet #hash #tags'
a,b = str.split.partition{|e| e.start_with?("#")}
# => [["#hash", "#tags"], ["Some", "interesting", "tweet"]]
a
# => ["#hash", "#tags"]
b
# => ["Some", "interesting", "tweet"]
a.join(",").delete("#")
# => "hash,tags"
b.join(" ")
# => "Some interesting tweet"

答案 1 :(得分:2)

备用路径是使用scan然后删除哈希标记:

tweet = 'Some interesting tweet #hash #tags'

tags = tweet.scan(/#\w+/).uniq
tweet = tweet.gsub(/(?:#{ Regexp.union(tags).source })\b/, '').strip.squeeze(' ') # => "Some interesting tweet"
tags.join(',').tr('#', '') # => "hash,tags"

解剖它显示:

  • tweet.scan(/#\w+/)返回一个数组["#hash", "#tags"]
  • uniq会删除所有重复的标记。
  • Regexp.union(tags)返回(?-mix:\#hash|\#tags)
  • Regexp.union(tags).source返回\#hash|\#tags。我们一开始并不想要模式标记,因此使用source修复了这一点。
  • /(?:#{ Regexp.union(tags).source })\b/返回正则表达式/(?:\#hash|\#tags)\b/
  • tr是将一个或多个字符翻译成另一个字符或剥离它们的极快方法。

最终的正则表达式不是可以生成的最优化的。我实际上编写代码来生成:

/#(?:hash|tags)\b/

但如何做到这一点留给你锻炼。并且,对于短弦乐而言,就速度而言,它不会产生太大的影响。

答案 2 :(得分:0)

这有一个以空白开头的哈希数组 然后它根据空格分割哈希标记 然后它会查找哈希标记并抓取其余部分 然后它将它存储到数组

array_of_hashetags = []
array_of_words = []

str = "Some interesting tweet #hash #tags"

str.split.each do |x|
  if /\#\w+/ =~ x
    array_of_hashetags << x.gsub(/\#/, "")
  else 
    array_of_words << x
  end
end

希望帮助