Chương trỡnh được cài đặt bằng ngụn ngữ C++, sử dụng cỏc thư viện STL, BOOST và một số thư viện ThirdParty khỏc, mụi trường chạy là Windows. Ngồi ra, để tiến hành so sỏnh với một số phương phỏp khỏc, tỏc giả sử dụng thờm một số cụng cụ bổ trợ sau:
• SenseCluster: là một tiện ớch viết bằng ngụn ngữ Perl cho phộp phõn nhúm cỏc đối tượng giống nhau dựa trờn phương phỏp học khụng
giỏm sỏt (unsupervised learning). Tiện ớch này cũng hỗ trợ việc phõn tớch trị riờng và vector riờng. Ngồi ra nú cũng hỗ trợ kỹ thuật LSA.
• Graphical Clustering Toolkit (gCLUTO): Là ứng dụng giao diện đồ họa cho phộp clustering cỏc dữ liệu đa chiều và phõn tớch cỏc đặc trưng của cỏc cluster. Nú cũng cung cấp cỏc cụng cụ để trực quan húa dữ liệu dựa trờn ma trận, biểu diễn dữ liệu theo kiểu đỉnh nỳi (sử dụng OpenGL).
• SVDPACKC: là một thư viện mĩ nguồn mở (ngụn ngữ C) dựng để phõn tớch SVD.
Chương trỡnh gồm cú cỏc bước cơ bản như sau:
• Bước tiền xử lý văn bản: Cỏc văn bản đầu vào được tập hợp lại trong một thư mục trờn đĩa cứng, sau đo sẽ thực hiện quỏ trỡnh tỏch thuật ngữ cho cỏc văn bản, ở đõy tỏc giả luận văn sử dụng chương trỡnh
vnTokenizer được viết bởi tỏc giả Lờ Hụng Phương, đõy là chương trỡnh tỏch thuật ngữ tiếng Việt tương đối tốt. Trước khi tỏch từ, cỏc văn bản được chuyển về dạng chữ in thường, như vậy cỏc thuật ngữđược tỏch sẽ là chữ thường. Cỏc từ dừng trong tiếng Việt cũng được loại bỏ. Khi kết thỳc bước này, ta sẽ cú ma trận tần số-tài liệu dựng để biểu diễn số lần xuất hiện của một thuật ngữ trong một tài liệu, ký hiện ma trận này là TF.
• Tớnh cỏc lớp dung sai của cỏc thuật ngữ: Với một ngưỡng θ cho trước, ta sẽ tớnh cỏc lớp dung sai cho cỏc thuật ngữ. Kết thỳc quỏ trỡnh này ta thu được một ma trận nhị phõn để biểu diễn cỏc lớp dung sai của cỏc thuật ngữ; đõy là một ma trận kớch thước NìN với N là tổng số thuật ngữ, phần tử (i, j) =1 núi lờn rằng thuật ngữ j thuộc về lớp dung sai của thuật ngữi, bằng 0 nếu ngược lại, ký hiệu ma trận này là TOL.
• Tớnh xấp xỉ trờn, xấp xỉ dưới của cỏc tài liệu: Dựa vào ma trận tần suất và ma trận biểu diễn lớp dung sai của cỏc thuật ngữ đĩ thu được từ 2 bước ở trờn, ta tiến hành tớnh cỏc xấp xỉ trờn và xấp xỉ dưới cho cỏc tài
liệu. Kết thỳc bước này ta cú một ma trận nhị phõn kớch thước NìM với
N là tổng số thuật ngữ, M là tổng số tài liệu, ký hiệu ma trận này là
UPPER, nếu phần tửUPPER[i, j] = 1 thỡ cú nghĩa là thuật ngữi thuộc về xấp xỉ trờn của tài liệu j, nếu ngược lại UPPER[i, j] = 0. Tương tự, ta cú
LOWER là ma trận nhị phõn để biểu diễn xấp xỉ dưới cho cỏc tài liệu.
• Xõy dựng mụ tả cho cỏc tài liệu: Căn cứ vào cỏc kết quả đĩ cú ở cỏc bước ở trờn, ta sẽ biểu diễn cỏc văn bản theo mụ hỡnh TRSM, như vậy kết thỳc bươc này ta cú ma trận trọng số, ký hiệu là WEIGHT. Mỗi phần tử
WEIGHT[i, j] sẽ cho biết trọng số của thuật ngữi trong tài liệu j.
• Xử lý đồng nghĩa: Sử dụng giải phỏp thứ nhất như đĩ trỡnh bày ở phần trờn. Nhỡn chung cả 2 giải phỏp đều cần đến bước phõn tớch SVDđể rỳt gọn khụng gian của ma trận đầu vào sang một khụng gian xấp xỉ mới cú số chiều bộ hơn. Sau đú tỡnh toỏn cỏc giỏ trị tương tự giữa cỏc từ trong khụng gian đĩ rỳt gọn này.
Chương trỡnh cú cỏc lớp cơ bản sau:
• Lớp IndexTerm dựng để lưu trữ một thuật ngữ, trong lớp này cú một member để lưu lại danh sỏch cỏc tài liệu chứa thuật ngữ này cựng với cỏc đặc trưng thống kờ khỏc chẳng hạn như số lần xuất hiện của thuật ngữ trong tài liệu hay trọng số của thuật ngữ trong tài liệu.
class IndexTerm
{
public:
IndexTerm(const std::wstring&); ~IndexTerm(void);
// Toan tu so sanh 2 thuat ngu
bool operator == (const std::wstring&);
bool operator == (const IndexTerm&);
// Toan tu lay ve trong so cua thuat ngu trong tai lieu // nIndex
double& operator [](int nIndex);
// Phuong thuc lay so lan xuat hien cua thuat ngu trong 1 tai // lieu
int GetNumOccurrence(int iDocIndex);
public:
// Tong so thuat ngu
static int N;
// Index cua thuat ngu
int m_nIndex;
std::wstring m_sTerm;
// Danh sach cac tai lieu chua thuat ngu nay cung cac dac // trung thong ke khac
std::vector<Statistic> m_vDocList;
// Lop dung sai cua thuat ngu
std::vector<IndexTermPtr_t> m_vToleranceClass; };
• Lớp Document: Dựng để lưu trữ một tài liệu, nú cú một thuộc tớnh để lưu trữ tất cả cỏc thuật ngữ xuất hiện trong tài liệu, mặt khỏc cũng cú cỏc thành viờn để lưu trữ cỏc xấp xỉ trờn và xấp xỉ dưới của tài liệu.
class Document
{
public:
Document(const std::string& strFileName); ~Document(void);
// Toan tu tinh so lan xuat hien cua thuat ngu pTerm trong
// tai lieu
int operator [] (IndexTermPtr_t pTerm);
// Dua them mot thuat ngu vao danh sach
void AddTerm(IndexTermPtr_t pTerm);
public:
// Tong so tai lieu thu thap duoc
static int M;
// Chi so cua tai lieu
int m_nIndex;
// Ten file tuong ung voi tai lieu nay
std::string m_sFileName;
// Danh sach thuat ngu xuat hien trong tai lieu
std::vector<IndexTermPtr_t> m_vTerms;
// Xap xi tren cua tai lieu nay
std::vector<IndexTermPtr_t> m_vUpperApproximation;
// Xap xi duoi cua tai lieu nay
std::vector<IndexTermPtr_t> m_vLowerApproximation; };
• Lớp DocCollection: Dựng để lưu trữ tồn bộ tập cỏc văn bản đầu vào, nú cú cỏc phương thức để tớnh toỏn cỏc lớp dung sai, tớnh giỏ trị cho ma trận tần suất, ma trận trọng số tài liệu-thuật ngữ.
class DocCollection
{
public:
DocCollection(const std::string& sPath);
DocCollection(std::string sPath, int iThreshold); ~DocCollection(void);
// Doc thu muc chua tap cac van ban dau vao, trich xuat noi
// dung cac file
void Init();
// Tach cac thuat ngu trong 1 chuoi
// Ghi ra stream
friend std::wofstream& operator << (std::wofstream& aStream,
const DocCollection& docs);
// So tai lieu chua dong thoi 2 thuat ngu
int NumOccur(IndexTermPtr_t pTerm1, IndexTermPtr_t pTerm2);
// So tai lieu chua thuat ngu
int NumOccur(IndexTermPtr_t pTerm);
// So lan xuat hien cua 1 thuat ngu trong 1 tai lieu
int NumOccur(IndexTermPtr_t pTerm, DocumentPtr_t pDoc);
// Lop dung sai cua mot thuat ngu
std::vector<IndexTermPtr_t>
ToleranceClassOfTerm(IndexTermPtr_t pTerm);
// Inclusion function, ham chua
double InclusionFunction(std::vector<IndexTermPtr_t> vt1,
std::vector<IndexTermPtr_t> vt2);
// MembershipFunction cua mot thuat ngu doi voi 1 tap hop
double MembershipFunction(IndexTermPtr_t pTerm,
std::vector<IndexTermPtr_t> vOneSet);
// Tinh toan xap xi tren cua 1 tap hop
std::vector<IndexTermPtr_t>
UpperApproximationCalculate(std::vector<IndexTermPtr_t> vSetOfTerms);
// Tinh toan xap xi tren cua 1 tai lieu
void UpperApproximationCalculate(DocumentPtr_t pDoc);
// Tinh toan xap xi duoi cua 1 tap hop
std::vector<IndexTermPtr_t>
LowerApproximationCalculate(std::vector<IndexTermPtr_t> vSetOfTerms);
// Tinh toan xap xi duoi cua 1 tai lieu
void LowerApproximationCalculate(DocumentPtr_t pDoc);
// Tinh trong so cua mot thuat ngu trong mot tai lieu
double TermWeight(IndexTermPtr_t pTerm, DocumentPtr_t pDoc);
// Gan trong so cho tat ca cac thuat ngu xuat hien trong mot
// tai lieu
void TermWeight(DocumentPtr_t pDoc);
// Gan trong so cho cac thuat ngu trong tai lieu
void AssignTermWeight(); void AssignTermCooccurrenceMatrix(); void AssignToleranceClassesMatrix(); public: / /Nguong int m_nThreshold;
// Thu muc chua cac tap van ban dau vao
std::string m_sDir;
// Tap cac tai lieu
std::vector<DocumentPtr_t> m_vDocuments;
// Danh sach cac IndexTerm
std::vector<IndexTermPtr_t> m_vIndexTerms;
// Ma tran tan suat tai lieu-thuat ngu ( dung mang 1 chieu de // bieu dien mang 2 chieu)
int *m_nTermDocNumOccurMatrix;
// Ma tran term co-occurrence (dung mang 1 chieu de bieu dien // mang 2 chieu)
int *m_nTermCooccurrence;
// Ma tran luu cac lop dung sai cua cac thuat ngu (dug mang 1
// chieu de bieu dien mang 2 chieu)
// Ma tran trong so tai lieu - thuat ngu (dung mang 1 // chieu de bieu dien mang 2 chieu)
double *m_TermDocMatrix;
};
• Lớp clusterđể biểu diễn một cluster
// Lop bieu dien mot cluster
class Cluster
{
public:
// Ham khoi tao
Cluster(DocumentPtr_t, DocCollection&); ~Cluster(void);
// So tai lieu trong cluster chua thuat ngu pTerm
int operator [] (IndexTermPtr_t pTerm);
// Thuc hien viec mo ta lai cluster
void ReDetermineRepresentation(DocCollection&);
public:
// Ngưỡng dung trong viec tao cluster
static double threshold;
// Luu tru cac tai lieu cung voi gia tri membership
std::vector<DocMembership_t> m_vMemberships;
// Bieu dien mot cluster duoi dang cac thuat ngu va trong so // di kem
std::vector<IndexTermWeight_t> m_vRepresentation;
// Chua tham chieu den mot tap cac doi tuong can clustering
DocCollection & collection; };