3.4.1. Nội dung chƣơng trình
Mỗi tài liệu đƣợc biểu diễn nhƣ là một vector sử dụng mô hình không gian vector. Mô hình không gian vector còn gọi là mô hình vector là một mô hình đại số để đại diện cho tài liệu văn bản (hoặc bất kỳ đối tƣợng, nói chung) là vectơ của định danh.
- Lớp DocumentVector: chứa các tài liệu và đại diện tƣơng ứng của nó
trên không gian vector.
public class DocumentVector {
//Content represents the document (or any other object) to be clustered
public string Content { get; set; }
//represents the tf*idf of each document public float[] VectorSpace { get; set; } }
- Lớp DocumentCollection chứa tất cả các tài liệu của tắm
class DocumentCollection {
public List<String> DocumentList { get; set; } }
- TF-IDF là viết tắt của Tần số tài liệu -Tần số nghịch đảo, là số thống kê
phản ánh tầm quan trọng của một từ là một tài liệu trong danh sách, là phƣơng pháp trọng phổ biến nhất đƣợc sử dụng để mô tả các tài liệu trong không gian mô hình Vector.
Số lần một thuật ngữ xuất hiện trong một tài liệu đƣợc gọi là tần số của nó. Chúng ta có thể tính toán tần số cho một từ nhƣ tỷ lệ số lần từ xảy ra trong văn bản trên tổng số từ trong tài liệu.
Tần số tài liệu nghịch đảo đƣợc tính bằng cách chia tổng số tài liệu cho số tài liệu có chứa thuật ngữ, và sau đó dùng logarit của thƣơng đó.
//Calculates TF-IDF weight for each term t in document d private static float FindTFIDF(string document, string term) {
float tf = FindTermFrequency(document, term); float idf = FindInverseDocumentFrequency(term); return tf * idf;
}
private static float FindTermFrequency(string document, string term)
{
int count = r.Split(document).Where(s => s.ToUpper() == term.ToUpper()).Count();
//ratio of no of occurance of term t in document d to the total no of terms in the document
return (float)((float)count / (float)(r.Split(document).Count())); }
private static float FindInverseDocumentFrequency(string term) {
//find the no. of document that contains the term in whole document collection
int count = documentCollection.ToArray().Where(s => r.Split(
s.ToUpper()).ToArray().Contains(term.ToUpper())).Count(); /*
* log of the ratio of total no of document in the collection to the no. of document containing the term * we can also use
Math.Log(count/(1+documentCollection.Count)) to deal with divide by zero case;
*/
return (float)Math.Log((float)documentCollection.Count() / (float)count);
}
- Tìm điểm tƣơng đồng: Đầu vào của hàm là hai vecto */A, B đại diện
cho hai văn bản, kết quả trả về là số điểm tƣơng tự (giữa 1 và 0)
public static float FindCosineSimilarity(float[] vecA, float[] vecB)
{
var dotProduct = DotProduct(vecA, vecB); var magnitudeOfA = Magnitude(vecA);
var magnitudeOfB = Magnitude(vecB);
float result = dotProduct / (magnitudeOfA * magnitudeOfB);
//when 0 is divided by 0 it shows result NaN so return 0 in such case. if (float.IsNaN(result)) return 0; else return (float)result; }
- Tính toán tâm của cụm: tâm cụm đƣợc khởi tạo cho phiên kế tiếp, ở đây biến số chứa giá trị của ngƣời sử dụng xác định trung tâm cụm ban đầu. private static void InitializeClusterCentroid(out
List<Centroid> centroid,int count) {
Centroid c;
centroid = new List<Centroid>(); for (int i = 0; i < count; i++) {
c = new Centroid();
c.GroupedDocument = new List<DocumentVector>(); centroid.Add(c);
} }
- Tìm kiếm tâm cụm gần nhất: hàm này trả về chỉ số của tâm cụm gần
nhất cho mỗi tài liệu. Mảng similarityMeasure giữ số điểm tƣơng tự cho mỗi tài liệu với mỗi trung tâm cụm, chỉ số có điểm số tối đa đƣợc lấy làm trung tâm cụm gần nhất của tài liệu nhất định.
private static int FindClosestClusterCenter(List<Centroid> clusterCenter,DocumentVector obj)
{
float[] similarityMeasure = new float[clusterCenter.Count()];
for (int i = 0; i < clusterCenter.Count(); i++) { similarityMeasure[i] = SimilarityMatrics.FindCosineSimilarity( clusterCenter[i].GroupedDocument[0].VectorSpace, obj.VectorSpace); } int index = 0;
for (int i = 0; i < similarityMeasure.Count(); i++) {
//if document is similar assign the document
//to the lowest index cluster center to avoid the long loop if (similarityMeasure[i] >maxValue) { maxValue = similarityMeasure[i]; index = i; } } return index; }
- Xác định vị trí tâm cụm mới: Sau mỗi tài liệu đƣợc gán với tâm cụm
gần nhất của nó, chƣơng trình tính toán lại giá trị trung bình của mỗi tâm cụm mà chỉ ra vị trí mới của tâm cụm (centroid).
private static List<Centroid>
CalculateMeanPoints(List<Centroid> _clusterCenter) {
for (int i = 0; i < _clusterCenter.Count(); i++) { if (_clusterCenter[i].GroupedDocument.Count() > 0) { for (int j = 0; j < _clusterCenter[i].GroupedDocument[0].VectorSpace.Count(); j++) { float total = 0;
foreach (DocumentVector vSpace in _clusterCenter[i].GroupedDocument)
{
total += vSpace.VectorSpace[j]; }
//reassign new calculated mean on each cluster center,
_clusterCenter[i].GroupedDocument[0].VectorSpace[j] = total / _clusterCenter[i].GroupedDocument.Count(); } } } return _clusterCenter; } 3.4.2. Kết quả thực nghiệm
Dữ liệu đầu vào của chƣơng trình là các đoạn văn bản đƣợc nhập vào ô TextBox. Sau khi chạy chƣơng trình, các đoạn văn bản đó đƣợc phân cụm theo số cụm k mà ngƣời dùng nhập vào và hiển thị kết quả ra chƣơng trình.
Hình 3.2: Giao diện chính chƣơng trình
- Số cụm: Nhập số cụm cần định nghĩa trong quá trình phân cụm văn bản
- 04 ô Textbox: dùng để nhập các văn bản cần phân cụm
- Nút Clear: Xóa tất cả các văn bản đã đƣợc nhập vào
- Nút Restart: Khởi động lại quá trình phân cụm
- Nút Start: Bắt đầu thực hiện phân cụm
3.4.3. Thực hiện phân cụm thử nghiệm
Dữ liệu đầu vào của chƣơng trình là 6 đoạn văn bản đƣợc lấy từ 3 bài viết. Cụ thể các đoạn văn bản đƣợc lấy từ cùng một bài viết là: đoạn 1 + 4, đoạn 2 + 6, đoạn 3 + 5:
- Đoạn 1:
Học máy (Machine Learning) là một ngành khoa học nghiên cứu
các thuật toán cho phép máy tính có thể học được các khái niệm
(concept).
- Đoạn 2:
Sinh học là khoa học về sự sống (bắt nguồn từ Hy Lạp bios là
sự sống, và logos là môn học). Nó miêu tả những đặc điểm và
tập tính của sinh vật, cách thức các cá thể và loài tồn tại,
và những tác động qua lại lẫn nhau và với môi trường.
- Đoạn 3:
Khai phá dữ liệu có thể hiểu đơn giản là quá trình chắt lọc
hay khai phá tri thức từ một khối dữ liệu lớn.
- Đoạn 4:
Có hai loại phương pháp học máy chính
Phương pháp quy nạp: Máy học/phân biệt các khái niệm dựa trên
dữ liệu đã thu thập được trước đó. Phương pháp này cho phép
tận dụng được nguồn dữ liệu rất nhiều và sẵn có.
Phương pháp suy diễn: Máy học/phân biệt các khái niệm dựa vào
các luật. Phương pháp này cho phép tận dụng được các kiến thức
chuyên ngành để hỗ trợ máy tính.
- Đoạn 5:
Khai phá dữ liệu cần sử dụng kiến thức từ nhiều ngành và nhiều
lĩnh vực khác nhau như thống kê, trí tuệ nhân tạo, CSDL, tính
kê, sử dụng các phương pháp thống kê để mô hình hóa dữ liệu và
phát hiện các mẫu.
- Đoạn 6:
Sinh học bao hàm nhiều ngành học khác nhau được xây dựng dựa
trên những nguyên lý riêng. Các môn học này có mối quan hệ qua
lại với nhau, giúp ta hiểu về sự sống với các mức độ, phạm vi
khác nhau.
Nhập các đoạn văn bản lần lƣợt vào từng ô Textbox tƣơng ứng. Chƣơng trình đƣợc thiết kế nhập cùng lúc 4 văn bản
Sau đó nhấn nút Add và nhập tiếp hai văn bản thứ 5 và 6:
Hình 3.4: Thử nghiệm chèn văn bản vào danh sách chờ phân cụm
Nhấn Add để chèn tiếp 2 văn bản còn lại. Sau đó nhập số cụm cần định nghĩa là 3 rồi nhấn Start. Kết quả chƣơng trình phân cụm 06 đoạn văn bản nhập vào thành 03 cụm nhƣ sau:
Kết quả 6 văn bản đƣợc phân thành 3 cụm tƣơng ứng với nội dung trong 3 bài viết nguồn.
3.5. Kết luận chƣơng 3
Chƣơng này trình bày về bài toán phân cụm văn bản, các vấn đề xử lý văn bản và áp dụng thuật toán học nửa giám sát để xây chƣơng trình thử nghiệm dơn giản dựa trên ngôn ngữ lập trình C# trên nền hệ điều hành Windows và tiến hành chạy thử nghiệm chƣơng trình với một số bộ dữ liệu đầu vào.
KẾT LUẬN * Đánh giá kết quả đề tài
Trong quá trình nghiên cứu và thực hiện, luận văn đã đạt đƣợc nhƣng kết quả nhƣ sau:
- Giới thiệu một số khái niệm cơ bản trong lĩnh vực học máy, học có giám sát, học không giám sát và học nửa giám sát.
- Trình bày một số thuật toán trong học nửa giám sát nhƣ thuật thoán EM (kỳ vọng cực đại), thuật toán Self – training (tự huấn luyện) và thuật toán S3VM (Semi – superviesd Suport vector machines).
- Giới thiệu một số kỹ thuật phân cụm dữ liệu và việc sử dụng học không giám sát, học nửa giám sát ứng dụng trong các bài toán phân cụm đặc biệt là bài toán phân cụm văn bản.
- Cài đặt thuật toán học nửa giám sát bằng ngôn ngữ lập trình C# chạy trên hệ điều hành Windows và sau đó đã thử nghiệm phân cụm các đoạn văn bản text nhập vào chƣơng trình.
* Hạn chế
- Chƣơng trình thử nghiệm còn đơn giản, chƣơng trình chỉ dừng lại ở mức thực hiện đƣợc các thuật toán trên dữ liệu đầu vào là các đoạn văn bản đƣợc nhập vào, chƣa hỗ trợ việc đọc trực tiếp từ các file văn bản.
- Độ chính xác khi phân cụm văn bản tiếng Việt còn chƣa cao, tốc độ phân cụm với số lƣợng văn bản lớn còn chậm.
Hƣớng phát triển trong tƣơng lai:
Với những kết quả đã đạt đƣợc, tác giả đề xuất một số công việc tiếp theo trong thời gian tới nhƣ sau:
- Tiếp tục xử lý những vấn đề còn tồn tại trong chƣơng trình thử nghiệm đã cài đặt nhƣ: Vấn đề dữ liệu vào và dữ liệu đầu ra, xây dựng giao diện chƣơng trình thân thiện và dễ sử dụng hơn.
- Tiếp tục nghiên cứu các thuật toán tách từ tiếng Việt, phân cụm văn bản để tăng cƣờng hiệu năng và độ chính xác của quá trình phân cụm.
- Tiếp tục nghiên cứu để ứng dụng các thuật toán học nửa giám sát sang một số lĩnh vức khác nhƣ: Bài toán phân loại protein, bài toán nhận dạng hình ảnh, …
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] TS Nguyễn Tân Ân (2011), Bài giảng mạng noron nhân tạo, Trƣờng Đại học Sƣ phạm Hà Nội, Hà Nội.
[2] PGS. TS Đoàn Văn Ban, ThS Nguyễn Hiền Trinh (2009), Ngôn ngữ hình thức và ôtômát, NXB Đại học Thái Nguyên.
[3] Lê Hữu Đạt, Lê Phƣơng Lan, Hoàng Đức Hải (2000), Lập trình Windows, NXB giáo dục.
[4] PGS. TS. Hà Quang Thụy (2011), Bài giảng nhập môn khai phá dữ liệu,
Trƣờng Đại học Công nghệ Đại học Quốc gia Hà Nội, Hà Nội.
[5] B.Bouchon – Meunier, Hồ Thuần, Đặng Thanh Hà (2007), Logic mờ và ứng dụng, NXB Đại học Quốc Gia Hà Nội.
Tiếng Anh
[6] Avirm Blum, Shuchi Chawla (2001), Learning from labeled and Unlabeled Data using Graph Mincuts, Computer Science Department, Carnegie Mellon University, 5000 Forbes Avenue, Pittsburgh, PA15213USA.
[7] Amarnag Subramanya (2012), Partha Pratim Talukdar, A Tutorial on Graph-based Semi-Supervised Learning Algorithms for NLP, South Korea.
[8] Junhui Wang, Xiaotong Shen, Wei Pan (2007), On Transductive Support Vector Machines, School of Statistics University of Minnesota, Minneapolis, MN 55455.
[9] Olivier Chapelle, Bernhard Sch¨olkopf, Alexander Zien (2006), Semi- Supervised Learning.
[10] Partha Pratim Talukdar (July 16, 2010), Experiments in Graph-based Semi-Supervised Learning Methods for Class-Instance Acquisition, Search Labs, Microsoft Research Mountain View, CA 94043, Fernando Pereira Google, Inc.Mountain View, CA 94043.
[11] Xiaojin Zhu (2005), Semi-supervised learning literature survey, University of Wisconsin-Madison Department of Computer Science, page 1530.
[12] Xiaojin Zhu (May 2005), Semi-Supervised Learning with Graphs.
[13] Xiaojin Zhu, Zoubin Ghahramani, John Lafferty (2003), Semi-Supervised Learning Using Gaussian Fields and Harmonic Functions, School of Computer Science, Carnegie Mellon University, Pittsburgh PA 15213, USA.
[14] Zoubin Ghahramani (2012), Graph-based Semi-supervised Learning, Department of Engineering University of Cambridge, UK, La Palma.
[15] Zoubin Ghahramani (September 16, 2004), Unsupervised Learning, Gatsby Computational, Neuroscience Unit, University College London, UK.
[16] Zoubin Ghahramani (2012), Graph-based Semi-supervised Learning, Department of Engineering University of Cambridge, UK, La Palma.
[17] Alex Smola, S.V.N. Vishwanathan (2008), Introduction to Machine Learning, Departments of Statistics and Computer Science Purdue University, College of Engineering and Computer Science Australian National University.
[18] István Pilászy (2005), Text Categorization and Support Vector Machines, Department of Measurement and Information Systems Budapest University of Technology and Economics.