Esempio n. 1
0
        /// <summary>
        /// 反向分词函数,获得词,并且重置参数
        /// </summary>
        /// <param name="temp">要进行反向分词的字符串序列</param>
        /// <param name="ls">反向分词结果的词链表</param>
        /// <param name="i">当前扫描位置</param>
        /// <param name="searchTime">搜索次数</param>
        /// <param name="max_time">最大节点的次数</param>
        /// <param name="isSearchFromTheTree">是否从根节点开始扫描</param>
        /// <param name="current_node">当前节点</param>
        /// <param name="max_node">最大节点</param>
        private void endReflex(ref string temp, List <_WordInnfo> ls, ref int i, ref int searchTime, ref int max_time, ref bool isSearchFromTheTree, Search_Tree_Node <_WordInnfo> current_node, ref Search_Tree_Node <_WordInnfo> max_node)
        {
            if (max_node != null)
            {
                ls.Add(max_node.Content.Copy());
            }
            else
            {
                if (_provider.SingleDic.ContainsKey(temp[i - (searchTime - max_time - 1)]))
                {
                    ls.Add(_provider.GetWordInfoFromSingleDic(temp[i - (searchTime - max_time - 1)]).Copy());
                }
                else
                {
                    ls.Add(new _WordInnfo()
                    {
                        Name = temp[i - (searchTime - max_time - 1)].ToString(), TypeInfo = new Dictionary <WordType, int> {
                            { WordType.Noun, 1 }
                        }, MaxType = WordType.Unknow
                    });
                }
            }

            i = i - (searchTime - max_time) + 1;
            isSearchFromTheTree = true;
            current_node        = null;
            max_node            = null;
            searchTime          = max_time = 0;
            isSearchFromTheTree = true;
        }
        private Tuple <int, int, int> count(List <_WordInnfo> l1)
        {
            /*******************
             * 特殊单字词比重
             * 这 那 会 能 才
             * ****************/
            int sr = 0;

            /*************
             * 词性相似度
             * *****************/
            int f = 0;

            /**************
             * 单字词个数
             * *************************/
            int s = 0;

            foreach (var item in l1)
            {
                if (item.Name.Length == 1)
                {
                    s++;
                    if (CharHelper.IsFirstSingleWord(item.Name[0]))
                    {
                        sr += 3;
                    }
                    else if (CharHelper.IsSecondSingleWord(item.Name[0]))
                    {
                        sr += 2;
                    }
                    else if (CharHelper.IsThirdSingleWord(item.Name[0]))
                    {
                        sr++;
                    }
                }
                else
                {
                    if (item.Length == 2)
                    {
                        /********************************************
                         * 比较二字词构词规则可信度
                         * n+n 3
                         * v+v 3
                         * a+a 3
                         * a+n 2
                         * adv+v 2
                         * a+v 1
                         * ********************************/
                        if (_provider.SingleDic.ContainsKey(item.Name[0]) && _provider.SingleDic.ContainsKey(item.Name[1]))
                        {
                            var a = _provider.GetWordInfoFromSingleDic(item.Name[0]).MaxType;
                            var b = _provider.GetWordInfoFromSingleDic(item.Name[1]).MaxType;
                            if (a.GetBigType() == b.GetBigType())
                            {
                                f += 3;
                            }
                            else if (a.IsAdjective() && b.IsNoun())
                            {
                                f += 2;
                            }
                            else if (a.IsAdverb() && b.IsVerb())
                            {
                                f += 2;
                            }
                            else if (a.IsAdverb() && b.IsAdjective())
                            {
                                f += 1;
                            }
                            else if (a.IsAdjective() && b.IsVerb())
                            {
                                f += 1;
                            }
                        }
                    }
                }
            }
            return(new Tuple <int, int, int>(sr, s, f));
        }