示例#1
0
 public static void SetSegment(UIElement target, SegmentOption value) => target.SetValue(SegmentProperty, value);
示例#2
0
        public List <KeyWord> Segment(string sentence, SegmentOption option)
        {
            var dict = SingletonDict.Instance;

            sentence = sentence.ToLower();
            if (dict.NeedInitDict)
            {
                dict.TransDict = _sqlProvider.GetTransDict();
                dict.AliasDict = _sqlProvider.GetAliasDict();
                dict.AliasDict.AddRange(GetBoAlias());
                dict.NeedInitDict = false;
            }
            List <WordInfo> words;
            MatchOptions    matchOptions = new MatchOptions();

            matchOptions.IgnoreCapital = true;
            if (option.MatchRule == "MinWords")
            {
                var parameter = new MatchParameter {
                    Redundancy = 2
                };
                words = _panGuSegmantService.DoSegment(sentence, matchOptions, parameter);
            }
            else
            {
                words = _panGuSegmantService.DoSegment(sentence, matchOptions);
            }

            words = words.Distinct(new WordAttributeComparer()).ToList();

            var keywords = new List <KeyWord>();

            if (option.Cc?.Count > 0)
            {
                keywords.AddRange(from item in words
                                  let cc = item.Pos.ToString().Split(new[] { ", " }, StringSplitOptions.None).ToList()
                                           where option.Cc.Intersect(cc).Any()
                                           select new KeyWord
                {
                    Term = item.Word,
                    Cc   = option.Cc.Intersect(cc).ToList()
                });
            }
            else
            {
                keywords.AddRange(words.Select(item => new KeyWord
                {
                    Term = item.Word,
                    Cc   = item.Pos.ToString().Split('|').ToList()
                }));
            }

            foreach (var keyword in keywords)
            {
                //包含同义词
                if (option.IncludeAlias)
                {
                    foreach (var key in dict.AliasDict.Keys)
                    {
                        if (key.Equals(keyword.Term, StringComparison.OrdinalIgnoreCase))
                        {
                            keyword.Aliases.AddRange(dict.AliasDict[key]);
                        }
                    }
                    keyword.Aliases = keyword.Aliases.Distinct().ToList();
                }



                //包含翻译词
                if (option.IncludeTrans)
                {
                    foreach (var key in dict.TransDict.Keys)
                    {
                        if (key.Equals(keyword.Term, StringComparison.OrdinalIgnoreCase))
                        {
                            keyword.Translates.AddRange(dict.TransDict[key]);
                        }
                    }
                    keyword.Translates = keyword.Translates.Distinct().ToList();
                }
            }
            return(keywords);
        }