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

81 9 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! iii 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 Huffman 22 Hình Cây Huffman đ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 Huffman động 31 Hình 11 Giải mã phương pháp Huffman độ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 sau 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 iv 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 (Huffman 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 v 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 Huffman 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 vi 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 Huffman ” 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 toá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, khn 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 tố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 toán nén liệu qua ứng dụng phương pháp mã hóa Huffman 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 CHƯƠNG 1: TỔNG QUAN VỀ CƠNG NGHỆ NÉN DỮ LIỆU 1.1 Sơ lược nén liệu 1.1.1 Khái niệm nén liệu Nén trình giảm lượng khơng gian cần thiết để biểu diễn lượng thơng tin cho trước Người ta cịn gọi nén biến đổi luồng ký hiệu thành luồng từ mã Quá trình nén sau: Văn Mơ hình Mã hố Bản mã Hình Quy trình nén liệu Trong đó: - Văn văn ban đầu cần nén - Mơ hình tập hợp chữ quy tắc sử dụng để xử lý chữ vào đưa từ mã Một mơ hình xác định xác xác suất xuất chữ mã tạo từ mã dựa xác suất - Mã hố trình thay chữ văn ban đầu từ mã tương ứng để đưa mã xác Như vậy, q trình nén diễn sau: q trình mơ hình vào văn cần nén tạo từ mã Sau đó, từ từ mã vừa tạo văn ban đầu trình nén đưa mã Mã hố mơ hình hai giai đoạn hồn tồn khác giai đoạn mơ hình có nhiều cách để xử lý chữ văn mà sử dụng phương pháp xây dựng mã từ mã Nếu mã có kích thước nhỏ văn phương pháp nén có hiệu Ví dụ : Chúng ta sử dụng phương pháp mã Huffman cho hai mơ hình khác nhau: - Mơ hình 1: dựa xác suất độc lập chữ xuất văn - Mơ hình 2: cần tính xác suất phụ thuộc dựa chữ nhận lúc văn Do mơ hình khác nên sử dụng mã Huffman để đưa từ mã hiệu nén chún g khác Tuy nhiên, quen dùng từ mã hoá trình nén văn giai đoạn q trình nén Người ta thường mã hố thơng qua từ mã bảng chữ Có thể có nhiều thuật tốn nén liệu khác Mỗi thuật tốn có kiểu liệu định số modem có đặc điểm nén thích ứng có nghĩa chúng có khả chọn thuật tốn nén thích hợp phụ thuộc vào kiểu liệu cần nén Trong số cách mã cách mã ngắn nói nén tốt (so với cách mã khác) 1.1.2 Những vấn đề phải giải nén liệu Mục tiêu nén liệu đưa thuật toán để giảm thiểu l ãng phí từ phần giống biểu diễn liệu Thơng th ường chương trình né n cần quan tâm đến khả n ãng cẳt triết nhiều hay dung lư ợng liệu sau nén, điều phụ thuộc vào thuật toán, điều kiện đầu vào liệu Nh liệu đầu vào khác địi hỏi thuật tốn khác để nhận diện nhậy chỗ tiêu sài lãng phí nhớ Cần nhận Thuật toán tạo mã: INPUT: Một danh sách nhị phân xếp (t1, t2,…, tn) cho bảng chữ (s1,…, sn) với tần số ( w 1,…, wn) OUTPUT: Một Huffman với n từ mã Khởi tạo danh sách nhị phân (t 1, t2,…, tn) với trọng lượng tương ứng ( w1,w2,…, wn) for k=1; k ) { 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(); } 68 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. 69 /// 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 khơng có 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); } // -ết thúc HuffmanTree class }//K 70 File frmHuffman.cs public class frmHuffman : 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 HuffmanAlgorithm AL = new HuffmanAlgorithm(); 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 frmHuffman() { InitializeComponent(); } /// /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code 71 /// /// //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) 72 { if( !IsSourceAndOutputOK() )return; FileStream S = new FileStream(TboxSRC.Text, FileMode.Open); if( ! AL.IsArchivedStream(S) ) { MessageBox.Show("File nguồn không lưu trữ bị hỏng.", "Tập tin nguồn", MessageBoxButtons.OK, MessageBoxIcon.Error); 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) - 73 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() { 74 short i; if(this.Size.Height < 230 ) { for(i=0; i

Ngày đăng: 25/02/2021, 08:56

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

  • Đang cập nhật ...

Tài liệu liên quan