转自:http://blog.csdn.net/simonyanix
本系列文章是我参考
宋柔
老师在上课时候的课件写的一些个人的总结,以期与大家共享自然语言处理的奇妙。(尽限于汉语处理) 原文引用
宋
老师的课件的部分我会用特殊颜色的字体标注出来。关于自然语言处理,本人还在刻苦学习之中,文中难免有不妥之处,还请各位高人不吝指点。
本篇是自然语言的起步,汉字的机内表示。为的是为了以后的学习打下基础。
我 们都知道,计算机内部用来存储信息的是1010的序列,不管你是存什么东西。图片也好,电影也好,文章也好。都是由1010按照一定的序列有序组合在一起 的。而且,我们知道,每一个我们可以看到的字符,其实都是以一种图形的方式呈现在我们的显示器上的。假如我们表示一个“大”字,如果用图形的方式,假设我 们有一个8*8的矩阵,那么这个字的表示方式可能就是下面的样子:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
假如我们用一个bit来表示每一个cell中的信息(1为黑,0为白),那么这个字就要用到8个byte来表示。再假设我们的常用汉字有3000 个,这样的表示这3000个汉字就需要3000*8=24,000B的空间。如果这样你觉得没什么的话,那么我们来想象一下,一篇1000字的文章如果这 样表示,那么你的文章大小将是1000*8=8,000B,也就是8kb。如果你还觉得没什么的话,你再想想,我们刚才假定的是用一个8*8的矩阵来表示 一个汉字,那么,请你想想,用一个8*8的矩阵怎么来表示一个“赢”字?呵呵,那恐怕把那64个格子里面都填满了也没办法。所以,我们要想用矩阵的方式表 示所有的汉字,那么那个矩阵的大小就必须能放得下横竖笔画都最多的汉字。你可以数数汉字里面横竖最多的字是什么。假定我们最后得到的是24*24的矩阵, 那么,每一个字就要用72Byte来表示,一篇1000字的文章就要用1000*72=72,000b=72kb来表示。也就是,如果你要存一篇10万字 的文章,就要占掉7mb的空间。有兴趣的同学还可以继续算下去。。。
谁的硬盘再大也经不住这么着折腾啊。于是乎,我们有了一种用编码的方式来存放 字符的方法。就是说,对每一个字符我们都用一个固定(或者非固定)长度的数字来表示。比如,在unicode(一种字符编码方式,稍后介绍)方法中, “我”字就可以用0x6211来表示。这样,每一个字符都可以用2byte轻松搞定,然后我们只要再有个表,可以查到每个码对应的是什么字符就行了。
再来说说编码的方式。我想大家对ASCII、GBK、GB2312、BIG5等等的编码方式已经看过不少次了,但是这几种编码方式到底有什么不同呢?下面我们来一起研究一下。
首先说说ASCII,它是用来给英文字符和一写英文标点以及一些控制符号做编码的。长度是1byte。经常写程序的同学应该知道,a对应的ASCII就是0x61。(我记得似乎是)
而GB2312和GBK还有BIG5,前两者来自于国家标准,后者来自于港澳台地区的编码标准。下面是宋老师课件里的内容,我懒得再打一遍了:
国家标准GB2312
GB2312是我国1980年发布的关于汉字编码字符集的国家标准,共6763个字,16位编码。其中一级汉字(常用字)3755个,区码从B0到D7,每个区中位码从A1到FE,但最后的D7区位码只到F9为止,全部按字的最常见读音的汉语拼音排序;二级汉字(非常用字)3008个,区码从D8到F7,每个区中位码从A1到FE,按字的部首笔画排序。
GB2312发布很早,它的发布使得国内汉字软件和汉字文档有了一个统一的编码标准,从此我国的社会信息化得到极大推进。
当时ISO10646尚未发布,国际上流通的拼音文字一般采用单字节(8个bit)编码,但汉字至少需要双字节16位编码,于是中英文混合文档必然是单双字节混合的文档。为了在这种文档中容易按内码区分中文和英文,从而便于加工处理,GB2312的字符编码中每个汉字的高字节的最高位与低字节的最高位统统设为1,同时拼音文字字母用单字节,其最高位统统设认为0。
国家标准GBK
后来,unicode的编码字符集发布,共20902个汉字,它包括了GB2312的全部汉字,但大大超出,而且即使是包含在GB2312中的汉字,两个标准所给的标码也不一样。为了易于过渡到这一国际标准,我国又发布了GBK编码字符集。GBK的汉字字符集与unicode完全相同,但两个标准中相同汉字的编码不同。GBK中凡是原在GB2312中的汉字,其内码不变,不在GB2312中的汉字则在GB2312的编码区的邻近区域给出编码。
下图给出了GBK与GB2312的代码分布细节。蓝色部分是GB2312一级汉字区,黄色部分是GB2312二级汉字区,灰色部分是GBK中的其余汉字的编码区域分布。
| 0 |
|
|
|
|
|
|
| 40 |
|
|
|
|
| 7e | 7f | 80 |
|
| a0 | a1 |
|
|
|
|
|
| f9 | fa |
| fe | ff |
81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aa |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
af |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fe |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 0 |
|
|
|
|
|
|
| 40 |
|
|
|
|
| 7e | 7f | 80 |
|
| a0 | a1 |
|
|
|
|
|
| f9 | fa |
| fe | ff |
█:GB2312中的一级汉字,3755个。
█:GB2312中的二级汉字,3008个。
█:GBK(Unicode)中的其它汉字,14139个
港澳台地区汉字标准BIG5(转贴自“FreeBSD Chinese HOWTO Chapter 3. 中文環境”,仅供参考)
Big5 是在 CCCII 不為政府單位採納, 國家頒布的中文標準碼又不堪用的情況下, 在民國 73 年,由台北市電腦公會 主導,聯合了十三家業者, 共同制定,又稱為 Big5_1984 (包括 5401 個常用字、7652 個次常用字、以及 441 個各式符號)。 Big5 的字符空間是個非連續的 94x157 矩陣,其容量為 14,758 位。
Big5_ETen 為倚天中文在原本的 Big5 碼上,增加了日文、俄文、輸入法特殊符號、七個擴充字、以及表格符號區。
CP950 是微軟在原本的 Big5 碼上, 全名是 Microsoft Windows Codepage 950 (Traditional Chinese Big5),增加了七個擴充字、以及表格符號區。
如不去考慮特殊符號,及後來的七個擴充字, 將所有的字分成兩大群: 常用字區與次常用字區,每一個字區分別用筆畫來排序, 同一個筆畫的字,依部首來排。
目前主推的是 Big5_ETen,每個字由兩個位元組(2 bytes)組成, 其第一位元組編碼範圍為 0xA1-0xF9, 第二位元組編碼範圍為 0x40-0x7E 與 0xA1-0xFE, 總計收入 13868 個字 (包括 5401 個常用字、7652 個次常用字、7 個擴充字、以及 808 個各式符號) ,其中可以大致劃分為以下幾個字區:
第一位元組 | 第二位元組 | 字區 | 制定 |
A1-A2 | 40-7E, A1-FE | 各種符號區 | 1984 |
A3 | 40-7E, A1-BF | 各種符號區 (包括標點符號、ASCII 全形符號、注音符號等) | 1984 |
A3 | E1 | 歐元符號 | CP950 |
A4-C5 | 40-7E, A1-FE | 常用字區 | 1984 |
C6 | 40-7E | 常用字區 | 1984 |
C6 | A1-FE | 罕用符號區 | 倚天 |
C7 | 40-7E, A1-FE | 罕用符號區 (包括日文、俄文等) | 倚天 |
C8 | 40-7E, A1-D3 | 罕用符號區 (包括俄文、輸入法特殊符號等) | 倚天 |
C9-F8 | 40-7E, A1-FE | 次常用字區 | 1984 |
F9 | 40-7E, A1-D5 | 次常用字區 | 1984 |
F9 | D6-DC | 七個擴充字 | 倚天 |
F9 | DD-FE | 表格符號區 | 倚天 |
Table 3-3. 七個擴充字
擴充字 | Big5 碼 | Unicode 碼 | Big5_1984 的同義字 |
碁 | 0xF9D6 | 0x88CF | 棋 |
銹 | 0xF9D7 | 0x92B9 | 鏽 |
裏 | 0xF9D8 | 0x7CA7 | 裡 |
墻 | 0xF9D9 | 0x58BB | 牆 |
恒 | 0xF9DA | 0x6052 | 恆 |
粧 | 0xF9DB | 0x7881 | 妝 |
嫺 | 0xF9DC | 0x5AFA | 嫻 |
Big5 有兩個重複編碼的漢字,分別是 A461, C 94a 和 DCD1, DDFC, CNS11643-1992 刪除了第二次編碼的漢字(C 94A 和 DDFC)。
Big5 最大的問題是字數不足。政府部分單位雖然有交換造字區,卻沒有把新的標準制定出來並大力推廣,雖然相繼出現 Big5+, Big5E,但是都未普及到業界,而且相關的資源也是無法公開取得的,像是與 Unicode 的轉碼表,範例字型等。
Note: 由於 CNS11643-1992 初期的不堪用, Big5 雖然不是國家標準,但是在台灣比 CNS11643-1992 的國家規格用的更廣。換句話說,Big5 是台灣的業界標準 (de facto standard)。
从上面可以看出,汉字编码真是纷繁复杂,看上去就让人觉得头疼。而且,大家不知道有没有注意到,在上边的引述中,有段话是这样说的:
当时ISO10646尚未发布,国际上流通的拼音文字一般采用单字节(8个bit)编码,但汉字至少需要双字节16位编码,于是中英文混合文档必然是单双字节混合的文档。为了在这种文档中容易按内码区分中文和英文,从而便于加工处理,GB2312的字符编码中每个汉字的高字节的最高位与低字节的最高位统统设为1,同时拼音文字字母用单字节,其最高位统统设认为0。
单 双字节的混排给文本处理带来了极大的不方便。比如:“计算机”三个字的内码分别是BCC6、CBE3、BBFA,连起来是BCC6CBE3BBFA。若用 “扑”来查找,它的内码是C6CB,若不能正确区分汉字内码的边界,就有可能从“计算机”中查出来。同样,“慊”的内码是E3BB,也是藏在“计算机” 中。Unicode的出现,很好地解决了这一问题。在unicode中,字符的编码实际上是处理为4byte的。究竟unicode是怎样工作的,我们将在下一篇文章中详细阐述。