Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }