public bool Sample2Patterns(SampleData sample, List <SVM_ResultPatterns> patterns) { // Морфологический разбор // Для каждого слова, кроме первого и последнего токенов... for (int word_index = 1; word_index < sample.morphology.Count - 1; ++word_index) { // Собираем контекст для слова SVM.Node[] Xi = new SVM.Node[x_len]; for (int k = 0; k < x_len; ++k) { Xi[k] = new SVM.Node(k + 1, 0.0); } int idx = 0; for (int ctx_index = word_index - context_span; ctx_index <= word_index + context_span; ++ctx_index, ++idx) { if (ctx_index >= 1 && ctx_index < sample.morphology.Count - 1) { SolarixGrammarEngineNET.SyntaxTreeNode token = sample.morphology[ctx_index]; ConvertToken2X(token, idx, Xi); } else { ConvertToken2X(null, idx, Xi); } } SolarixGrammarEngineNET.SyntaxTreeNode token0 = sample.morphology[word_index]; string word = token0.GetWord().ToLower(); // Решение foreach (SVM_X_Picker y in y_picker) { if (y.Match(token0, gren)) { int y_index = y.GetIndex(); patterns[y_index].Add(Xi, 1.0); // для остальных Y'ов добавим этот же паттерн как "не-Yi" for (int j = 0; j < y_picker.Count; ++j) { if (j != y_index) { patterns[j].Add(Xi, 0.0); } } break; } } } return(true); }
private bool ConvertToken2X(SolarixGrammarEngineNET.SyntaxTreeNode token, int token_index, SVM.Node[] X) { int start = token_index * suffix2vector.GetVectorLength(); /* * string lemma = gren.GetEntryName( token.GetEntryID() ); * if( lemma == "???" || lemma == "UNKNOWNENTRY" || lemma == "NUMBER_" ) * lemma = token.GetWord(); * * double[] v = lemma2vector.GetVector( lemma.ToLower() ); */ if (token == null) { for (int i = 0; i < suffix2vector.GetVectorLength(); ++i) { X[start + i] = new SVM.Node(start + i + 1, 0.0); } } else { string word = token.GetWord(); string suffix = word; int res; if (!int.TryParse(word, out res) && word.Length > suffix_len + 1) { suffix = "~" + word.Substring(word.Length - suffix_len); } double[] v = suffix2vector.GetVector(suffix.ToLower()); for (int i = 0; i < v.Length; ++i) { X[start + i] = new SVM.Node(start + i + 1, v[i]); } } return(true); }