Implement OSM.spam_score to return a spam score for a piece of text
authorTom Hughes <tom@compton.nu>
Wed, 28 Apr 2010 23:29:49 +0000 (00:29 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 6 May 2010 16:18:33 +0000 (17:18 +0100)
lib/osm.rb

index cb23b0c97eb6b0bda038e7dfbdb403b08898503f..46b90447781b23938a6cc3820403381c8ba30272 100644 (file)
@@ -7,6 +7,7 @@ module OSM
   require 'xml/libxml'
   require 'digest/md5'
   require 'RMagick'
+  require 'nokogiri'
 
   # The base class for API Errors.
   class APIError < RuntimeError
@@ -498,5 +499,24 @@ module OSM
     return "#{tilesql} AND #{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
   end
 
+  # Return a spam score for a chunk of text
+  def self.spam_score(text)
+    link_count = 0
+    link_size = 0
 
+    doc = Nokogiri::HTML(text)
+
+    if doc.content.length > 0
+      doc.xpath("//a").each do |link|
+        link_count += 1
+        link_size += link.content.length
+      end
+
+      link_proportion = link_size.to_f / doc.content.length.to_f
+    else
+      link_proportion = 0
+    end
+
+    return [link_proportion - 0.2, 0.0].max * 200 + link_count * 20
+  end
 end