anchor.diff:              row.Product_description |> normalize)
           |> dict
   
  -    let attributes =
  -
  -        printfn "Loading attributes"
  +    let preprocessedAttributes =
  +
  +        printfn "Pre-processing attributes"
   
           AllAttributes.GetSample().Rows
  -        |> PSeq.map (fun x -> 
  +        |> PSeq.map (fun x ->
  +            x.Product_uid, 
               x.Name |> normalize, 
               x.Value |> normalize)
  -        |> Seq.groupBy fst
  -        |> Seq.map (fun (key,values) ->
  +        
  +    let attributes =
  +
  +        printfn "Loading attributes"
  +
  +        preprocessedAttributes
  +        |> PSeq.map (fun (id,name,value) -> name,value)
  +        |> PSeq.groupBy fst
  +        |> PSeq.map (fun (key,values) ->
               key,
               values |> Seq.map snd |> set)
           |> Map.ofSeq
  
positive.code:         printfn "Loading train data"
  
          Train.GetSample().Rows
          |> Seq.map (fun row ->
              let description = descriptions.[row.Product_uid]
              let attributes = attributesFor (row.Product_uid)
              let product =
  
negative.code:         printfn "Loading test data"
  
          Test.GetSample().Rows
          |> PSeq.map (fun row ->
              let description = descriptions.[row.Product_uid]
              let attributes = attributesFor (row.Product_uid)
              let product =
  