Beispiel #1
0
            /// <summary>
            /// 添加实体关系
            /// </summary>
            public void AddEntityRelation(string entityA, string relationship, string entityB)
            {
                if (entityA == entityB)
                {
                    return;
                }
                EntityRelation entityRelationA = FindParent(entityA);

                if (entityRelationA == null)
                {
                    entityRelationA        = new EntityRelation();
                    entityRelationA.A      = entityA;
                    entityRelationA.Weight = 0.1;
                    _entityIndex.Add(entityA, entityRelationA);
                }

                EntityRelation entityRelationB = FindParent(entityB);

                if (entityRelationB == null)
                {
                    EntityRelation childEntity = new EntityRelation();
                    childEntity.Weight       = 0.1;
                    childEntity.Relationship = relationship;
                    childEntity.A            = entityB;
                    entityRelationA.AddChild(childEntity);
                    _entityIndex.Add(entityB, childEntity);
                }
                else
                {
                    //entityRelationB.AddChild(childEntity);
                    entityRelationB.Weight += 0.1;
                }

                eeFragment.AddDocument(relationship, new[] { entityA, entityB });
                arFragment.AddDocument(entityB, new[] { entityA, relationship });
                brFragment.AddDocument(entityA, new[] { entityB, relationship });
            }
Beispiel #2
0
        /// <summary>
        /// 索引程序入口
        /// </summary>
        /// <param name="pages">网页信息集合</param>
        public void Indexer(ref List <Page> pages)
        {
            //自动分析网页表达的含义
            //WriteToConsole(string.Format("开始自动分析网页表达的含义,共{0}条记录。", pages.Count));
            List <Template.Question> questions = new List <Template.Question>();
            const string             delimiter = ".?。!\t?…●|\r\n])!";

            foreach (Page page in pages)
            {
                string[] sentences = page.Content.Split(delimiter.ToCharArray(),
                                                        StringSplitOptions.RemoveEmptyEntries);
                foreach (string sentence in sentences)
                {
                    if (sentence.Length >= 5)
                    {
                        Template.Question result = Bot.GetInstance(GetRootFolder())
                                                   .BuildQuestion(sentence, page.Url, page.Title);
                        if (result != null && result.Description != null && result.Description.Count > 0)
                        {
                            result.Content = sentence;
                            questions.Add(result);
                        }
                    }
                }
            }
            pages.Clear();

            //对表达的语义建议索引
            // WriteToConsole(string.Format("对表达的语义建议索引,共{0}条记录。", questions.Count));

            if (File.Exists(_textIndexFile) && TextFragment == null)
            {
                TextFragment = Serializer.DeserializeFromFile <InvertFragment>(_textIndexFile);
            }

            if (File.Exists(_relativeIndexFile) && RelativeTable == null)
            {
                RelativeTable =
                    Serializer.DeserializeFromFile <DimensionTable <string, string, double> >(_relativeIndexFile);
            }


            if (questions.Any())
            {
                foreach (Template.Question question in questions)
                {
                    int id = question.GetHashCode();
                    question.Id = id;
                    TextFragment.AddDocument(id, question.Content, false);
                    foreach (var entity in question.Entity)
                    {
                        double oldValue = RelativeTable[entity.Item1][entity.Item2] == null
                            ? 0
                            : RelativeTable[entity.Item1][entity.Item2];
                        RelativeTable[entity.Item1][entity.Item2] = oldValue + 0.0001;
                    }
                    DataStore.Write(question);
                }
            }
            questions.Clear();
            Serializer.SerializeToFile(TextFragment, _textIndexFile);
            Serializer.SerializeToFile(RelativeTable, _relativeIndexFile);
        }