diff --git a/src/predictors/basic_set.rs b/src/predictors/basic_set.rs
index 43d5fd84aae850577cce112e41946a54d574351b..43f7c2fca284137dc4fb222614a5c9386587b6b3 100644
--- a/src/predictors/basic_set.rs
+++ b/src/predictors/basic_set.rs
@@ -42,7 +42,15 @@ impl Predictor for SetPredictor {
 
         //println!("blocklist:{:?}",self.configuration);
 
-        let lowercase_query = query.to_lowercase();
+        let lowercase_query: String = query.to_lowercase().chars()
+        .map(|c| {
+            if c.is_alphanumeric() {
+                c
+            } else {
+                ' '
+            }
+        })
+        .collect();
         let words: Vec<&str> = lowercase_query.split_whitespace().filter(|&x| !blocklist.contains(&x)).collect();
 
         for &word in &words {
@@ -79,12 +87,13 @@ fn get_top_completions(
     top_n: usize,
     min_freq: usize
 ) -> Option<Vec<(String, usize)>> {
-    Some(predictor.set.iter()
+    let mut completions: Vec<(String, usize)> = predictor.set.iter()
     .filter(|(key, &value)| key.starts_with(word) && value >= min_freq)
     .map(|(key, &value)| (key.clone(), value))
-    .take(top_n)
-    .collect())
-
+    .collect();
+    completions.sort_by(|a, b| b.1.cmp(&a.1));
+    completions.truncate(top_n);
+    Some(completions)
 }