/// <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); }
/// <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); }