anchor.diff:    let samples, trainOutput = Array.unzip examples
   
     printfn "Extracting training features..."
  -  let attribs = getAttr attribMap
  +  let attribs = attributes attribMap
     let getFeatures' = getFeatures attribs attribMap
     let trainInput = samples |> extractFeatures getFeatures'
     // NOTE: ALGLIB wants prediction variable at end of input array
  
positive.code:        float descMatches.Length
         float descMatches.Length / float uniqueWords.Length
         float attrMatches.Length
         queryTitlePosScore
  //       float attrMatches.Length / float uniqueWords.Length
         float brandNameMatch |]
  
  let getAttr attribMap productId =
      match attribMap |> Map.tryFind productId with
      | Some a ->
        let getAttrStr name (value:string) =
            match value.ToLowerInvariant() with
            | "yes" -> name // if true attrib, include attrib name
            | "no"  -> String.Empty
            | _     -> name + " " + value
        a |> Seq.map (fun (_, name, value) -> getAttrStr name value) |> Array.ofSeq
      | None -> [||]
  
  let getFeatures attribs attribMap sample =
      sample |> features attribs (brandName attribMap sample.ProductId)
  
negative.code:     let indices = uniqueWords |> Seq.map (fun w -> titleWords |> Seq.tryFindIndexBack (isMatch w)) |> Seq.choose id
      let queryTitleIndices = indices |> Seq.map (fun i -> float i / float titleWords.Length) |> Array.ofSeq
      let queryTitlePosScore = if Array.isEmpty queryTitleIndices then 0. else Seq.average queryTitleIndices
      let attributes = attrSelector sample.ProductId |> Array.ofSeq
      let attributeNames = attributeNames attributes
      let attrNameMatches = attributeNames |> Seq.filter (fun n -> uniqueWords |> Seq.exists (isMatch n))
      let attributesText = attributesConcat attributes
      let desc = sample.Description |> fixLineConcats attributesText
      let deduped = attributesText |> Seq.where (containedIn desc >> not) |> String.concat " "
      let titleMatches = uniqueWords |> Array.filter (isMatch title)
      let descMatches = uniqueWords |> Array.filter (isMatch desc)
      let attrMatches = uniqueWords |> Array.filter (isMatch deduped)
  