Nén văn bản tiếng việt theo huffman

91 129 0
Nén văn bản tiếng việt theo huffman

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

i ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CNTT & TRUYỀN THÔNG PHẠM THU HƯỜNG NÉN VĂN BẢN TIẾNG VIỆT THEO HUFFMAN LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH Thái Nguyên - 2013 ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CNTT & TRUYỀN THÔNG PHẠM THU HƯỜNG NÉN VĂN BẢN TIẾNG VIỆT THEO HUFFMAN Chuyên ngành: Khoa học máy tính Mã số: 60 48 01 LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH Người hướng dẫn khoa học: PGS.TS Nguyễn Hữu Điển Thái Nguyên - 2013 ii LỜI CẢM ƠN Để đạt kết ngày hôm l cố gắng, nỗ lực lớn thân, giúp đỡ nhiệt tình q thầy cơ, bạn bè để tơi hồn thành luận văn Tôi xin trân trọng cảm ơn: - PGS.TS Nguyễn Hữu Điển – Giám đốc Trung tâm tính tốn hiệu cao Trường Đại học khoa học t ự nhiên Hà Nội - Các thầy cô hội đồng phản biện Cuối xin chân thành cảm ơn thầy, cô, bạn đ ã động viên giúp đỡ thời gian làm luận văn Xin trân trọng cám ơn quý thầy cô, bạn! DANH MỤC CÁC HÌNH Hình Quy trình nén liệu Hình Xây dựng nhị phân từ bảng mã không dạng tiền tố Hình Sắp xếp danh sách ký tự 20 Hình Xây dựng Hufman 22 Hình Cây Hufman điền đầy đủ thành phần 22 Hình Một trường hợp xây dựng khác 23 Hình Lưu đồ giả i mã 24 Hình Ý tưởng xây dựng theo phương pháp Shannon – Fano 26 Hình Xây dựng theo phương pháo Shannon -Fano 27 Hinh 10 Mã hóa phương pháp Hufman động 31 Hình 11 Giải m ã phương pháp Hufman động 33 Hình 12 Quá trình thự c nén LZ 43 Hình 13 Sơ đồ nén LZ 78 47 Hình 14 Sơ đồ giải nén LZ78 48 Hình 15 Sơ đồ nén LZW 51 Hình 16 Sơ đồ giải nén LZW 54 Hình 17 Phương pháp MTF ( tốt ) 57 Hình 18 Phương pháp MTF ( xấu) 57 Hình 19 Phương pháp BW tìm chuỗi s au mã hóa 59 Hình 20 Hai cách tìm chuỗi gốc 60 Hình 21 Giao diện chương trình 62 MỤC LỤC LỜI CẢM ƠN iii DANH MỤC CÁC HÌNH iv MỞ ĐẦU 1 Đặt vấn đề Đối tượng phạm vi nghiên cứu .1 2.1 Đối tượng .1 2.2 Phạm vi Hướng nghiên cứu đề tài Phương pháp nghiên cứu Ý nghĩa khoa học luận văn CHƯƠNG 1: TỔNG QUAN VỀ CÔNG NGHỆ NÉN DỮ LIỆU 1.1 Sơ lược nén liệu .3 1.1.1 Khái niệm nén liệu 1.1.2 Những vấn đề phải giải nén liệu 1.1.3 Phân loại chương trình nén 1.1.4 Đánh giá chất lượng chương trình nén 1.2 Mã nén liệu 1.2.1 Định nghĩa mã hoá 1.2.2 Các khái niệm ký tự mã hóa 1.2.3 Mã tổng mã phân tách .13 1.2.4 Định lý mã nén .18 CHƯƠNG MỘT SỐ MÃ NÉN CƠ BẢN 21 2.1 Mã hóa Huffman (Hufman coding) 21 2.1.1 Phương pháp mã hóa 21 2.1.2 Thuật toán tạo mã Huffman 21 2.1.3 Giải mã thuật toán Huffman : .25 2.2 Mã hóa Huffman động ( Adaptive Huffman coding ) 31 2.2.1 Phương pháp mã hóa: 31 2.2.2 Thuật toán nén .31 2.2.3 Thuật toán giải nén .33 2.3 Thuật toán xử lý lặp lại xâu (RLE) 36 2.3.1 Phương pháp: 36 2.3.2 Thuật toán tạo mã 36 2.3.3 Quá trình giải mã 36 2.4 Mã hóa kiểu từ điển (Dictionary -based compression) .39 2.4.1 Nguyên lý LZ 39 2.4.2.Từ điển 40 2.4.3 Quá trình thực nén mã LZ 41 2.4.4 Các thuật toán nén LZ 42 2.5 Một số phương pháp biến đổi (transform) 54 2.5.1 Phương pháp đẩy phía trước (Move to front): 54 2.5.2 Phương pháp Burrows – Wheeler (BW): 56 CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH NÉN TIẾNG VIỆT SỬ DỤNG PHƯƠNG PHÁP MÃ HÓA HUFFMAN 59 3.1 Bộ gõ Tiếng việt .59 3.2 Quy ước biểu diễn ký tự tiếng Việt 59 3.3 Chuẩn dấu Tiếng việt 60 3.3.1 Unicode 60 3.3.2 TCVN3 60 3.3.3 VNI 60 3.4 Phương pháp mã hóa Hufman 60 3.5 Giới thiệu chương trình 61 3.5.1 Hướng dẫn sử dụng .62 3.5.2 Kết kiểm thử chương trình 64 KẾT LUẬN 65 TÀI LIỆU THAM KHẢO 66 PHỤ LỤC 67 MỞ ĐẦU Đặt vấn đề Một chức máy tính xử lý liệu lưu trữ Bên cạnh việc xử lý nhanh, người ta quan tâm đến việc lưu trữ nhiều liệu lại tiết kiệm vùng nhớ giảm chi phí lưu trữ Về mặt lý thuyết thiết bị lưu trữ khơng có giới hạn ngày nhu cầu xử lý nhiều tập tin, nhiề u loại liệu tệp mà kích thước tệp trở nên lớn Những vấn đề nảy sinh khái niệm nén liệu , nén liệu q trình làm giảm lượng thơng tin “dư thừa” liệu gốc, lượng thông tin thu sau nén thường nhỏ liệu gốc nhiều Nén liệu giải pháp hợp lý nhằm mục đích giảm chi phí cho người sử dụng Như biết tiếng Việt ngôn thuộc hệ thống chữ Latin sử dụng nhiều dấu kèm với nguyên âm Với bảng mã ASCII bit sử dụng phổ biến máy tính, mã hóa 256 ký tự Để đưa tiếng Việt vào máy tính, phần mềm tiếng Việt sử dụng hai phương pháp mã hóa : mã dựng sẵn mã tổ hợp để xây dựng trang mã ký tự tiếng Việt Bảng mã phổ biến thường sử dụng bảng mã Unicode để thể tiếng Việt Nhưng bảng mã Unicode yêu cầu 16 bit để thể ký tự điều dẫn đến lãng phí dư thừa liệu Vì vậy, “ Nén văn tiếng Việt theo Hufman ” em chọn làm luận văn tốt nghiệp Đối tượng phạm vi nghiên cứu 2.1 Đối tượng − Các phần mềm nén liệu; − Các thuật toán nén liệu; − Các phương pháp mã hóa tiếng Việt; − Hệ thống phần mềm nén liệu từ ứng dụng vào để nén liệu cho tiếng Việt 2.2 Phạm vi − Các khái niệm ký tự mã hóa, thuật tốn nén văn Kiến trúc, chức n ãng thành phần nén liệu cụ thể cho toán nén văn Tiếng việt sử dụng phương pháp mã hóa Huffman − Các chức nãng quy trình thực thi tốn nén liệu; − Hệ thống chương trình cho tốn nén liệu; Vì thời gian có hạn, khuôn khổ luận văn tốt nghiệp cao học, việc giải toán nén liệu giới hạn vài thuật toán nén cổ điển Hướng nghiên cứu đề tài − Tìm hiểu tổng quan nén liệu nghiên cứu thuật tốn nén cụ thể − Tìm hiểu tốn nén liệu, tiến hành phân tích; − Thu thập số liệu có liên quan; − Phân tích, đánh giá thông qua số liệu thu thập được; − Cài đặt thực nghiệm Phương pháp nghiên cứu − Nghiên cứu tài liệu viết tổng quan; − Phương pháp khảo sát thực tế; − Phương pháp phân tích đánh giá thuật toán; − Nghiên cứu triển khai thu ật toán thử nghiệm hệ thống Ý nghĩa khoa học luận văn − Bản thân hiểu sâu áp dụng thuật toán nén liệu vào thực tế; − Triển khai số thuật tốn nén liệu qua ứng dụng phương pháp mã hóa Hufman vào tiếng Việt; − Xây dựng chương trình nén liệu dành cho tiếng Việt máy tính 3.5.1 Hướng dẫn sử dụng Giao diện chương trình Hình 21 Giao diện chương trình Để nén file thực theo bước sau: Bước 1: Chọn nút “ Đầu vào ” để mở văn c ần nén Bước 2: Kích vào nút “ Đầu ” để lưu văn cần nén Khi có hộp thoại Select output file xuất hiện, yêu cần bạn nhập tên mã thư mục lưu mã Bước 3: Kích vào nút “ Nén File ” Sau nén xong, khung báo cáo có thơng báo dung lượng văn bản, dung lượng mã hiệu nén Để giải nén mã, thực theo bước sau: Bước 1: Chọn nút “ Đầu vào ” để mở văn cần giải nén Bước 2: Kích vào nút “ Đầu ” để lưu văn mã giải Bước 3: Kích vào nút “ Giải nén ” 3.5.2 Kết kiểm thử chương trình Dung lượng Tên file TT (kiểu file) File ban đầu File nén Bài thu hoạch nhận thức Đảng (word) 41.5 KB 24.77 KB (41%) Book HTML (word) 3.77 MB 1.84 MB (52%) LT ma nen (word) 6.97 MB 4.23 MB (40%) NP TIENG ANH (word) 774.5 KB 527.92 KB (32%) Compression (txt) 1.08 MB 200.71 KB (82%) Hacking data compression – Lesson (txt) 23.84 KB 14.36 KB (40%) So sánh: Sau số liệu thống kê em sử dụng chương trình nén em tự lập trình chương trình nén WinRAR 7-Zip dành cho văn Tiếng việt có độ lớn 71218 byte Chương trình TT Kết nén Hao hụt Mã hóa Hufman 19034 73.27% WinRAR 14629 79.46% 7-Zip 13166 81.51% KẾT LUẬN Mã nén đời đưa phương pháp giảm dung lượng để lưu trữ liệu mà đảm bảo lưu trữ thông tin Điều có ý nghĩa to lớn việc giảm chi phí, thời gian truyền thơng tin mạng, tránh việc tắc nghẽn thơng tin, giảm chi phí cho việc lưu trữ Các phương pháp nén tiếp tục cải tiến để có hiệu nén tốt Ngày nay, với tốc độ tăng nhanh lượng thông tin tồn cầu phương pháp nén liệu ngày sử dụng rộng rãi Tình hình đặt yêu cầu phải phát triển lý thuyết nén nữa, từ xây dựng chương trình nén có hiệu cao phải áp dụng với nhiều kiểu liệu Qua thời gian làm luận văn, hướng dẫn tận tình thầy Nguyễn Hữu Điển, giúp đỡ nhiệt tình thầy bạn em hồn thành luận văn “ Nén văn Tiếng việt theo Hufman ” Đánh giá việc làm , em nhận thấy: - Luận văn trình bày nhữn g kiến thức nén liệu - Đã tìm hiểu số mã nén - Đã cài đặt thành cơng thuật tốn tốt nhấ t dành cho văn , từ khẳng định liệu dạng văn nén theo mơ hình Huffman đạt hiệu cao mơ hình thống kê Chương trình có giao diện quen thuộc, dễ sử dụng Tuy nhiên thời gian trình độ hạn chế, luận văn em số tồn sau: - Chưa tìm hiểu phương pháp nén t ổn hao để nén liệu âm tha nh hình ảnh - Chương trình có hiệu cao nén file văn mà chưa áp dụng tốt cho dạng liệu khác - Cần phải nghiên cứu việc kết hợp phương phá p nén, cách xử lý tiết kiệm dung lượng để đạt hiệu nén cao - Chương trình nén em viết tồi phần mềm nén có sẵn Em mong nhận nhận xét, dẫn thầy cơ, đóng góp ý kiến bạn cho luận văn Điều đ ó có ý nghĩa lớn em việ c tiếp tục nghiên cứu nén liệu hồn thiện chương trình Em xin chân thành cảm ơn thầy cô, bạn giúp đỡ, động viên em nhiều suốt thời gian qua TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt: [1] Phạm Hữu Khanh (2008), C# 2005 – Lập trình , NXB Lao động xã hội [2] Nguyễn Hữu Điển (2004), Một số vấn đề thuật toán , NXB Giáo dục [3] Nguyễn Tuệ Linh (1998), “Các cách mã hóa tiếng Việt”, http://www.echip.com.vn/echiproot/weblh/suutam/98/lt/bangmavn.htm [4] Phạm Kim Long (2004), Hướng dẫn sử dụng UniKey 3.5, http://unikey.org Tài liệu Tiếng Anh: [5] David Salomon (2004), Data Compression, Springer-Verlag, New York [6] Ida Mengyi Pu (2006), Fundamental Data Compression, Elsevier, Burlington [7] Khalid Sayood (2006), Introduction to Data compression, Elsevier [8] Darrel R.Hankerson, Greg A.Haris, Peter D.Johnson, Introduction to Information theory and compression, Chapman&Hall/CRC Các trang mạng tài liệu: [9] http://vi.wikipedia.org [10] http://www.fadden.com/techmisc/hdc/index.htm [11] http://oldwww.rasip.fer.hr/research/compress/index.html PHỤ LỤC File HufmanAlgorithm.cs public class HufmanAlgorithm: IDisposable { #region Internal classes // /// /// FrequencyTable /// [Serializable] internal class FrequencyTable { /// /// Lưu tất thay đổi loại byte (lên đến 256) tìm thấy dòng /// public Byte[] FoundBytes; /// /// Lưu lại số lần byte apears dòng /// public uint[] Frequency; thúc FrequencyTable class }//kết // /// /// Đây nút HufmanTree /// Nó sd để dịch byte bit chuỗi lưu trữ, bit thứ tự để byte giải nén /// internal class TreeNode { #region Members public TreeNode /// Con trỏ đến nốt bên trái. Lson=null, /// Con trỏ đến nốt bên phải. Rson=null, /// Con trỏ đến nôt cha. Parent=null; /// /// Giá trị Byte lá, có liên quan nút là/ thực tế /// public Byte ByteValue; /// /// Đây giá trị tần số nút /// public ulong Value; #endregion }//Kết thúc TreeNode class // /// /// HufmanTree iplementation thuật toán Hufman /// Nó sd để dịch byte bit chuỗi lưu trữ , bit thứ tự để byte giải nén /// internal class HufmanTree { #region Members /// /// Mảng giữ giá trị byte lâu bảng tần số /// public readonly TreeNode[] Leafs; /// Bảng tần số để xây dựng Hufman. public readonly FrequencyTable FT; /// /// giữ nút mà không cần nốt cha; /// private ArrayList OrphanNodes= new ArrayList(); /// /// Nút gốc xây dựng; /// public readonly TreeNode RootNode; #endregion /// Xây dựng Hufman khỏi bảng tần số internal HufmanTree(FrequencyTable FT) { ushort Length = (ushort)FT.FoundBytes.Length; this.FT= FT; Leafs = new TreeNode[Length]; if( Length > ) { for(ushort i=0; i< Length; ++i) { Leafs[i]=new TreeNode(); Leafs[i].ByteValue = FT.FoundBytes[i]; Leafs[i].Value = FT.Frequency[i]; } OrphanNodes.AddRange(Leafs); RootNode = BuildTree(); } else {//Không cần phải tạo (chỉ có nút rootnode) TreeNode TempNode = new TreeNode(); TempNode.ByteValue =FT.FoundBytes[0]; TempNode.Value = FT.Frequency[0]; RootNode = new TreeNode(); RootNode.Lson = RootNode.Rson =TempNode; } OrphanNodes.Clear(); OrphanNodes=null; } // -/// /// Chức xây dựng từ bảng tần số /// /// Gôc (tree). private TreeNode BuildTree() { TreeNode small, smaller, NewParentNode=null; /*dừng lại xây dựng đầy đủ (chỉ có gốc)*/ while( OrphanNodes.Count > ) { /*Điều trở lại với cha mẹ nút họ togather giá trị người nhỏ lo ại bỏ chúng khỏi ArrayList*/ FindSmallestOrphanNodes(out smaller,out small); NewParentNode = new TreeNode(); NewParentNode.Value = small.Value + smaller.Value; NewParentNode.Lson = smaller; NewParentNode.Rson = small; smaller.Parent = small.Parent = NewParentNode; OrphanNodes.Add(NewParentNode); } //trở thư mục gốc (luôn nốt cha nhất) return NewParentNode; } // -/// /// Tìm thấy nút giá trị mồ côi nhỏ nhỏ ///Và loại bỏ chúng chúng từ ArrayList /// /// Nút nhỏ OrphanNodes list. /// Nút thứ hai nhỏ OrphanNodes list. private void FindSmallestOrphanNodes(out TreeNode Smallest, out TreeNode Small) { Smallest = Small = null; //quét ngược ulong Tempvalue=18446744073709551614; TreeNode TempNode=null; int i, j=0; int ArrSize = OrphanNodes.Count-1; //quét cho nút giá trị nhỏ for(i= ArrSize ; i!=-1 ; i ) { TempNode = (TreeNode)OrphanNodes[i]; if( TempNode.Value < Tempvalue ) { Tempvalue = TempNode.Value; Smallest = TempNode; j=i; } } OrphanNodes.RemoveAt(j); ArrSize; Tempvalue=18446744073709551614; //quét nhỏ nút giá trị thứ hai for(i= ArrSize; i>-1 ; i ) { TempNode = (TreeNode)OrphanNodes[i]; if( TempNode.Value < Tempvalue ) { Tempvalue = TempNode.Value; Small = TempNode; j=i; } } OrphanNodes.RemoveAt(j); } // -}//Kết thúc HufmanTree class File frmHuffman.cs public class frmHufman : Form { private OpenFileDialog openFileD; private SaveFileDialog saveFileD; private TextBox TboxSRC; private Button BTNopenSRC; private Button BTNSaveOut; private TextBox TboxOut; private Button BTNextract; private Button BTNshrink; private HufmanAlgorithm AL = new HufmanAlgorithm(); private CheckBox CHKBOXpassword; private TextBox TBOXpassword; private ImageList imageList1; private System.Windows.Forms.Button BTNshowProgress; private System.Windows.Forms.ProgressBar ProgBar; private GroupBox groupBox1; private Label lblPer; private Label lblVOutput; private Label label2; private Label label3; private Label lblVInput; private Label label1; private IContainer components; public frmHufman() { InitializeComponent(); } /// /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// //Sự kiện lưu lại file đầu private void BTNSaveOut_Click(object sender, EventArgs e) { saveFileD.DefaultExt = "*.hfs"; saveFileD.Filter = "Huffman Stream files(*.hfs)|*.hfs|All files|*.*"; saveFileD.CheckPathExists = false; saveFileD.ShowHelp=false; saveFileD.Title="Select output file"; saveFileD.ShowDialog(); TboxOut.Text = saveFileD.FileName; } //Sự kiện nén liệu private void BTNshrink_Click(object sender, EventArgs e) { if( !IsSourceAndOutputOK() )return; FileStream S = new FileStream(TboxSRC.Text, FileMode.Open); if(this.Height < 220) AL.Shrink(S, TboxOut.Text, CHKBOXpassword.Checked ? TBOXpassword.Text.ToCharArray() : null ); else AL.ShrinkWithProgress(S, TboxOut.Text, CHKBOXpassword.Checked ? TBOXpassword.Text.ToCharArray() : null ); MessageBox.Show("Nén (mã hóa liệu) file thành cơng.", "Nén (mã hóa)", MessageBoxButtons.OK, MessageBoxIcon.Information); TBOXpassword.Text = ""; TBOXpassword.Visible = CHKBOXpassword.Checked = false; S.Close(); ProgBar.Value = 0; FileInfo sourceFile, targetFile; sourceFile = new FileInfo (TboxSRC.Text); targetFile = new FileInfo(TboxOut.Text); lblVInput.Text =sourceFile.Length.ToString(); lblVOutput.Text = targetFile.Length.ToString(); lblPer.Text =string.Format("{0:0.00}",(Math.Abs(Convert.ToDouble(lblVInput.Text) Convert.ToDouble(lblVOutput.Text)) / Convert.ToDouble(lblVInput.Text))*100) + " %"; } kiện giải nén liệu //Sự private void BTNextract_Click(object sender, EventArgs e) { Fil eMode.Open); hỏng.", if( !IsSourceAndOutputOK() )return; FileStream S = new FileStream(TboxSRC.Text, if( ! AL.IsArchivedStream(S) ) { MessageBox.Show("File nguồn không lưu trữ bị MessageBoxIcon.Error); "Tập tin nguồn", MessageBoxButtons.OK, S.Close(); return; } string prompt, title, Key=null; if( AL.IsPasswardProtectedStream(S)){ prompt = "Nhập mật để mở file."; title = "File bảo vệ"; Key = Interaction.InputBox(prompt, title, "",this.Location.X, this.Location.Y + this.Size.Height/2 ); } if(Key!=null && Key.Length >8) { MessageBox.Show("Sai mật khẩu", "Lỗi mật khẩu",MessageBoxButtons.OK ,MessageBoxIcon.Error); S.Close(); return; } bool IsOk; if(this.Height < 220) IsOk=AL.Extract(S, TboxOut.Text, Key!=null ? Key.ToCharArray() : null); else IsOk=AL.ExtractWithProgress(S, TboxOut.Text, Key!=null ? Key.ToCharArray() : null); if( IsOk ) MessageBox.Show("Giải nén file thành công.", "Giải nén", MessageBoxButtons.OK, MessageBoxIcon.Information); ProgBar.Value = 0; S.Close(); FileInfo sourceFile, targetFile; sourceFile = new FileInfo(TboxSRC.Text); targetFile = new FileInfo(TboxOut.Text); lblVInput.Text = sourceFile.Length.ToString(); lblVOutput.Text = targetFile.Length.ToString(); lblPer.Text = string.Format("{0:0.00}", (Math.Abs(Convert.ToDouble(lblVInput.Text) - Convert.ToDouble(lblVOutput.Text)) / Convert.ToDouble(lblVInput.Text)) * 100) + " %"; } //Chọn Checkbox mật để nhập mật cho file nén private void CHKBOXpassword_CheckedChanged(object sender, EventArgs e) { TBOXpassword.Visible = CHKBOXpassword.Checked; BTNshrink.ImageIndex = CHKBOXpassword.Checked ? : 1; } //Load chương trình private void Form1_Load(object sender, EventArgs e) { imageList1.Images.Add(new Icon(@" \ \ICONS\UNSECUR.ico")); imageList1.Images.Add(new Icon(@" \ \ICONS\SECUR.ico")); BTNshrink.ImageIndex = 0; AL.WrongPassword+=new WrongPasswordEventHandler(AL_WrongPassword); AL.PercentCompleted+=new PercentCompletedEventHandler(AL_PercentCompleted); } // private void AL_WrongPassword() { this.Enabled = false; MessageBox.Show("Sai mật khẩu", "Lỗi mật khẩu",MessageBoxButtons.OK ,MessageBoxIcon.Error); this.Enabled = true; this.Activate(); } // - private void BTNshowProgress_Click(object sender, System.EventArgs e) { BTNshowProgress.Enabled = false; new Thread(new ThreadStart(Fold_Ufnold_Form)).Start(); } // private void Fold_Ufnold_Form() { short i; if(this.Size.Height < 230 ) { for(i=0; i

Ngày đăng: 27/02/2019, 12:37

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan