/// <summary>
        /// Tìm center có độ tương tự cao nhất với document thông qua công thức cosine
        /// </summary>
        /// <param name="clusterCenter">danh sách center</param>
        /// <param name="obj">document</param>
        /// <returns>center có độ tương tự cao nhất với document</returns>
        private static int FindClosestClusterCenter(List <Centroid> clusterCenters, DocumentVector obj)
        {
            int countCenter = clusterCenters.Count(); // số lượng center

            float[] similarityMeasure = new float[countCenter];

            // Tính độ tương tự của document với các center rồi add vào mảng similarityMeasure
            for (int i = 0; i < countCenter; i++)
            {
                similarityMeasure[i] = SimilarityMatrics.FindExtendedJaccard(clusterCenters[i].GroupedDocument[0].VectorSpace, obj.VectorSpace);
            }

            // Tìm max trong mảng similarityMeasure
            int   index    = 0;
            float maxValue = similarityMeasure[0];

            for (int i = 0; i < similarityMeasure.Count(); i++)
            {
                if (similarityMeasure[i] > maxValue)
                {
                    maxValue = similarityMeasure[i];
                    index    = i;
                }
            }
            return(index);
        }
        /// <summary>
        /// Hàm phân nhóm document bằng độ tương tự giữa document với center
        /// </summary>
        /// <param name="k">số lượng nhóm</param>
        /// <param name="documentCollection">Danh sách document</param>
        /// <returns>Danh sách centroid</returns>
        public static List <Centroid> DocumentCluster(int k, List <DocumentVector> documentCollection, string textSearch)
        {
            // Danh sách centroid ban đầu
            List <Centroid> centroidCollection = new List <Centroid>();

            bool            stoppingCriteria;  // biến dừng thuật toán
            List <Centroid> resultSet;         // danh sách centroid trả về
            List <Centroid> prevClusterCenter; // danh sách centroid cũ

            //Danh sách số ngẫu nhiên dùng để chọn document ngẫu nghiên làm centroid
            HashSet <int> uniqRand = new HashSet <int>();

            uniqRand = GenerateRandomNumber(k, documentCollection.Count);

            foreach (int pos in uniqRand)
            {
                var c = new Centroid
                {
                    GroupedDocument = new List <DocumentVector>
                    {
                        documentCollection[pos]
                    }
                };

                centroidCollection.Add(c);
            }

            resultSet = InitializeClusterCentroid(centroidCollection.Count); // khởi tạo cluster

            do
            {
                prevClusterCenter = centroidCollection;
                centroid          = new Centroid();
                documentVector    = new DocumentVector();

                foreach (DocumentVector obj in documentCollection)
                {
                    int index = FindClosestClusterCenter(centroidCollection, obj);
                    resultSet[index].GroupedDocument.Add(obj);

                    if (obj.Content == textSearch)
                    {
                        centroid       = resultSet[index];
                        documentVector = obj;
                    }
                }
                centroidCollection = InitializeClusterCentroid(centroidCollection.Count());
                centroidCollection = CalculateMeanPoints(resultSet);
                stoppingCriteria   = CheckStoppingCriteria(prevClusterCenter, centroidCollection);

                if (!stoppingCriteria)
                {
                    //initialize the result set for next iteration
                    resultSet = InitializeClusterCentroid(centroidCollection.Count);
                }
            } while (stoppingCriteria == false);

            return(resultSet);
        }
Пример #3
0
        /// <summary>
        /// Xử lý documnet thành dạng vector
        /// </summary>
        /// <param name="collection">Danh sách document</param>
        /// <returns>Danh sách document với vectorSpace tương ứng</returns>
        public static List <DocumentVector> ProcessDocumentCollection(DocumentCollection collection)
        {
            distinctTerms      = new HashSet <string>(); // túi từ
            documentCollection = collection.DocumentList;

            #region Bag of word
            foreach (string documentContent in documentCollection)
            {
                foreach (string term in r.Split(documentContent))
                {
                    distinctTerms.Add(term);
                }
            }

            List <string> removeList = new List <string>()
            {
                "\"", "\r", "\n", "(", ")", "[", "]", "{", "}", "", ".", " ", ","
            };
            foreach (string s in removeList)
            {
                distinctTerms.Remove(s);
            }
            #endregion

            List <DocumentVector> documentVectorSpace = new List <DocumentVector>();
            float[] vectorSpaceArray;
            foreach (string document in documentCollection)
            {
                int count = 0;
                vectorSpaceArray = new float[distinctTerms.Count];

                foreach (string term in distinctTerms)
                {
                    vectorSpaceArray[count] = FindTFIDF(document, term); // tính Tf_Idf
                    count++;
                }

                var documentVector = new DocumentVector
                {
                    Content     = document,
                    VectorSpace = vectorSpaceArray
                };
                documentVectorSpace.Add(documentVector);
            }

            return(documentVectorSpace);
        }