public FeatureTemplate load(File file) throws IOException
    {
        FeatureTemplate featureTemplate = new FeatureTemplate();
        BufferedReader reader = new BufferedReader(new FileReader(file));

        String line;
        for(int lineNum = 1 ; (line = reader.readLine()) != null; ++lineNum)
        {
            line = line.trim();
            if (line.isEmpty() || line.startsWith("#"))
                continue;

            // Otherwise better be a feature
            if (!line.startsWith("B") && !line.startsWith("U"))
            {
                throw new IOException("Invalid start of line: (" + lineNum + ")");
            }

            int nGram = line.startsWith("U") ? 1 : 2;
            int startIndex = line.indexOf(":") + 1;


            // Not a default feature, get to the good stuff
            if (startIndex != 0)
            {
                // This will include the rule name which is key for context disambiguation
                String ns = line.substring(0, startIndex).trim();
                line = line.substring(startIndex);
                featureTemplate.addExtractor(readExtractorRule(ns, line, nGram));
            }
            else
            {

                String ns = line.trim() + ":";
                FeatureExtractorPart part  = new ExtractPart(nGram, 0, 0);

                featureTemplate.addExtractor(new FeatureExtractor(ns, Arrays.asList(part)));
            }


        }
        return featureTemplate;
    }