コード例 #1
0
        /// <summary>
        /// Save schema (with feature set and it's value group, mean, variance).
        /// </summary>
        /// <param name="language">The language.</param>
        /// <param name="schemaFile">The schema File.</param>
        /// <param name="phoneToIdIndexes">Phone To Id Indexes.</param>
        /// <param name="writer">Writer.</param>
        /// <param name="stringPool">String pool.</param>
        /// <returns>Size of bytes written out.</returns>
        public uint WriteSchema(Language language, string schemaFile, Dictionary<string, string> phoneToIdIndexes, DataWriter writer, StringPool stringPool)
        {
            Helper.ThrowIfFileNotExist(schemaFile);
            Helper.ThrowIfNull(phoneToIdIndexes);
            Helper.ThrowIfNull(writer);
            Helper.ThrowIfNull(stringPool);
            Helper.ThrowIfNull(language);

            uint size = 0;

            LexicalAttributeSchema schema = new LexicalAttributeSchema(language);
            schema.Load(schemaFile);

            List<string> stateFeatureList = new List<string>();
            List<string> featureList = new List<string>();

            int stateFeatureCount = 0;

            for (int i = 0; i < schema.Categories.Count; i++)
            {
                string name = schema.Categories[i].Name.ToLower();

                if (name.IndexOf("state") >= 0)
                {
                    stateFeatureCount++;

                    if (!stateFeatureList.Contains(name))
                    {
                        stateFeatureList.Add(name);
                    }
                }

                if (!featureList.Contains(name))
                {
                    featureList.Add(name);
                }
            }

            // write state feature count.
            size += writer.Write((uint)stateFeatureList.Count);
            size += writer.Write((uint)stateFeatureCount);

            // write total feature count.
            size += writer.Write((uint)featureList.Count());

            Dictionary<string, uint> featureIndex = new Dictionary<string, uint>();

            uint index = 0;
            foreach (string feature in featureList)
            {
                size += writer.Write((uint)stringPool.Length);

                stringPool.PutString(feature);
                featureIndex.Add(feature, index++);
            }

            // write feature category
            size += writer.Write((uint)schema.Categories.Count);
            for (int i = 0; i < schema.Categories.Count; i++)
            {
                string featureName = schema.Categories[i].Name.ToLower();

                // feature index
                size += writer.Write((uint)featureIndex[featureName]);

                // mean
                size += writer.Write(schema.Categories[i].Mean);

                // invStdDev
                size += writer.Write(schema.Categories[i].InvStdDev);

                // value count
                size += writer.Write((uint)schema.Categories[i].Values.Count);
                for (int k = 0; k < schema.Categories[i].Values.Count; k++)
                {
                    string valueName = schema.Categories[i].Values[k].Name.ToLower();
                    string id = string.Empty;

                    if (phoneToIdIndexes.ContainsKey(valueName) && featureName.IndexOf("phoneidentity") >= 0)
                    {
                        id = phoneToIdIndexes[valueName];
                    }
                    else
                    {
                        id = valueName;
                    }

                    try
                    {
                        size += writer.Write(uint.Parse(id));
                    }
                    catch (System.FormatException)
                    {
                        continue;
                    }
                }
            }

            Debug.Assert(size % sizeof(uint) == 0, "Data must be 4-byte aligned.");

            return size;
        }