private void ExtractSparseFeature(int currentState, int numStates, List <string[]> features, State pState) { var sparseFeature = new Dictionary <int, float>(); var start = 0; var fc = featureContext; //Extract TFeatures in given context window if (tFeaturizer != null) { if (fc.ContainsKey(TFEATURE_CONTEXT)) { var v = fc[TFEATURE_CONTEXT]; for (var j = 0; j < v.Count; j++) { var offset = TruncPosition(currentState + v[j], 0, numStates); var tfeatureList = tFeaturizer.GetFeatureIds(features, offset); foreach (var featureId in tfeatureList) { if (tFeatureWeightType == TFEATURE_WEIGHT_TYPE_ENUM.BINARY) { sparseFeature[start + featureId] = 1; } else { if (sparseFeature.ContainsKey(start + featureId) == false) { sparseFeature.Add(start + featureId, 1); } else { sparseFeature[start + featureId]++; } } } start += tFeaturizer.GetFeatureSize(); } } } // Create place hold for run time feature // The real feature value is calculated at run time if (fc.ContainsKey(RT_FEATURE_CONTEXT)) { var v = fc[RT_FEATURE_CONTEXT]; pState.RuntimeFeatures = new PriviousLabelFeature[v.Count]; for (var j = 0; j < v.Count; j++) { if (v[j] < 0) { pState.AddRuntimeFeaturePlacehold(j, v[j], sparseFeature.Count, start); sparseFeature[start] = 0; //Placehold a position start += TagSet.GetSize(); } else { throw new Exception("The offset of run time feature should be negative."); } } } var spSparseFeature = pState.SparseFeature; spSparseFeature.SetLength(SparseFeatureSize); spSparseFeature.AddKeyValuePairData(sparseFeature); }
void ExtractSparseFeature(int currentState, int numStates, List<string[]> features, State pState) { Dictionary<int, float> sparseFeature = new Dictionary<int, float>(); int start = 0; var fc = m_FeatureConfiguration; //Extract TFeatures in given context window if (m_TFeaturizer != null) { if (fc.ContainsKey(TFEATURE_CONTEXT) == true) { List<int> v = fc[TFEATURE_CONTEXT]; for (int j = 0; j < v.Count; j++) { int offset = TruncPosition(currentState + v[j], 0, numStates); List<int> tfeatureList = m_TFeaturizer.GetFeatureIds(features, offset); foreach (int featureId in tfeatureList) { if (m_TFeatureWeightType == TFEATURE_WEIGHT_TYPE_ENUM.BINARY) { sparseFeature[start + featureId] = 1; } else { if (sparseFeature.ContainsKey(start + featureId) == false) { sparseFeature.Add(start + featureId, 1); } else { sparseFeature[start + featureId]++; } } } start += m_TFeaturizer.GetFeatureSize(); } } } // Create place hold for run time feature // The real feature value is calculated at run time if (fc.ContainsKey(RT_FEATURE_CONTEXT) == true) { List<int> v = fc[RT_FEATURE_CONTEXT]; pState.RuntimeFeatures = new PriviousLabelFeature[v.Count]; for (int j = 0; j < v.Count; j++) { if (v[j] < 0) { pState.AddRuntimeFeaturePlacehold(j, v[j], sparseFeature.Count, start); sparseFeature[start] = 0; //Placehold a position start += TagSet.GetSize(); } else { throw new Exception("The offset of run time feature should be negative."); } } } SparseVector spSparseFeature = pState.SparseData; spSparseFeature.SetDimension(m_SparseDimension); spSparseFeature.SetData(sparseFeature); }