这几天开始做毕业设计准备,先从分词开始吧。争取尽快把分词这部分做完。目标是把开源的linux/unix的分词代码移植到solaris,并改成ANSI C。 ICTCLAS系统中使用了索引表来存储词,这个索引表并没有采用哈希函数,而是基于GB2312编码规则,因为GB2312中一共有6768个汉字(6763个汉字+5个空字符)。所以定义了6768个数组。每个数组元素链接了这个字开头的词。 那么关于GB2312需要了解一下。 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。 GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率。GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 节结构在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。EUC名为Extended Unix Code,是一个使用8位编码来表示字符的方法。 它使用了一些兼容于ISO/IEC 2022区位码的94x94编码表,把每个区位加上0xA0来表示,以便兼容于ASCII。 举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。字每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。 “高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。 所以GB2312编码中汉字区码的十进制是从176到247,位码是从161到255.之所以存储了6763小于82*94=6768,是因为在区码为215,位码为250-254之间共五个编码没有汉字编码,所以6768-5=6763个。 ICTCLAS系统中,判断字符类型的时候,采用的都是十进制的比较。这样一开始使我迷糊了。程序中,先是判断第一个字符,也就是将个字符与区码进行比较,下面附录中的区码在实际存储中,前面要加0xA0(十进制为160)。这样就可以明白了,比如判断是数字的时候,查表可以知道数字位于第3区,也就是区码应该为0xA0+3 = 163,位码应该是从0xA0+16 = 176 到 0xA0 + 25 = 185。判断区码后,判断它的下一个字节,就是把这个字节与位码进行比较。 国标第01区 0 1 2 3 4 5 6 7 8 9 0 、 。 · ˉ ˇ ¨ 〃 々 1 — ~ ‖ … ‘ ’ “ ” 〔 〕 2 〈 〉 《 》 「 」 『 』 〖 〗 3 【 】 ± × ÷ ∶ ∧ ∨ ∑ ∏ 4 ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠ ⌒ ⊙ 5 ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯ 6 ≤ ≥ ∞ ∵ ∴ ♂ ♀ ° ′ ″ 7 ℃ $ ¤ ¢ £ ‰ § № ☆ ★ 8 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※ 9 → ← ↑ ↓ 〓 国标第02区 0 1 2 3 4 5 6 7 8 9 0 ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ 1 ⅹ ⒈ ⒉ ⒊ 2 ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ 3 ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⑴ ⑵ ⑶ 4 ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ 5 ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ① ② ③ 6 ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ㈠ 7 ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ 8 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ 9 Ⅹ Ⅺ Ⅻ 国标第03区 0 1 2 3 4 5 6 7 8 9 0 ! " # ¥ % & ' ( ) 1 * + , - . / 0 1 2 3 2 4 5 6 7 8 9 : ; < = 3 > ? @ A B C D E F G 4 H I J K L M N O P Q 5 R S T U V W X Y Z [ 6 \ ] ^ _ ` a b c d e 7 f g h i j k l m n o 8 p q r s t u v w x y 9 z { | }  ̄ 国标第04区 0 1 2 3 4 5 6 7 8 9 0 ぁ あ ぃ い ぅ う ぇ え ぉ 1 お か が き ぎ く ぐ け げ こ 2 ご さ ざ し じ す ず せ ぜ そ 3 ぞ た だ ち ぢ っ つ づ て で 4 と ど な に ぬ ね の は ば ぱ 5 ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ 6 ぼ ぽ ま み む め も ゃ や ゅ 7 ゆ ょ よ ら り る れ ろ ゎ わ 8 ゐ ゑ を ん 9 国标第05区 0 1 2 3 4 5 6 7 8 9 0 ァ ア ィ イ ゥ ウ ェ エ ォ 1 オ カ ガ キ ギ ク グ ケ ゲ コ 2 ゴ サ ザ シ ジ ス ズ セ ゼ ソ 3 ゾ タ ダ チ ヂ ッ ツ ヅ テ デ 4 ト ド ナ ニ ヌ ネ ノ ハ バ パ 5 ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ 6 ボ ポ マ ミ ム メ モ ャ ヤ ュ 7 ユ ョ ヨ ラ リ ル レ ロ ヮ ワ 8 ヰ ヱ ヲ ン ヴ ヵ ヶ 9 国标第06区 0 1 2 3 4 5 6 7 8 9 0 Α Β Γ Δ Ε Ζ Η Θ Ι 1 Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ 2 Υ Φ Χ Ψ Ω 3 α β γ δ ε ζ η 4 θ ι κ λ μ ν ξ ο π ρ 5 σ τ υ φ χ ψ ω 6 ︵ ︶ ︹ ︺ ︿ ﹀ 7 ︽ ︾ ﹁ ﹂ ﹃ ﹄ ︻ ︼ 8 ︷ ︸ ︱ ︳ ︴ 9 国标第07区 0 1 2 3 4 5 6 7 8 9 0 А Б В Г Д Е Ё Ж З 1 И Й К Л М Н О П Р С 2 Т У Ф Х Ц Ч Ш Щ Ъ Ы 3 Ь Э Ю Я 4 а 5 б в г д е ё ж з и й 6 к л м н о п р с т у 7 ф х ц ч ш щ ъ ы ь э 8 ю я 9 国标第08区(由于Mircosoft的原因,本区在此状态下排不齐) 0 1 2 3 4 5 6 7 8 9 0 ā á ǎ à ē é ě è ī 1 í ǐ ì ō ó ǒ ò ū ú ǔ 2 ù ǖ ǘ ǚ ǜ ü ê ɑ ń 3 ň ɡ ㄅ ㄆ ㄇ 4 ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ 5 ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ 6 ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ 7 ㄦ ㄧ ㄨ ㄩ 8 9 国标第09区 0 1 2 3 4 5 6 7 8 9 0 ─ ━ │ ┃ ┄ ┅ 1 ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ 2 ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ 3 ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ 4 ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ 5 ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ 6 ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ 7 ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ 8 9 第16区至55区为一级汉字,以拼音排序,共计3755字 国标第 16区 0 1 2 3 4 5 6 7 8 9 0 啊 阿 埃 挨 哎 唉 哀 皑 癌 1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺 2 按 暗 岸 胺 案 肮 昂 盎 凹 敖 3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒 4 叭 吧 笆 八 疤 巴 拔 跋 靶 把 5 耙 坝 霸 罢 爸 白 柏 百 摆 佰 6 败 拜 稗 斑 班 搬 扳 般 颁 板 7 版 扮 拌 伴 瓣 半 办 绊 邦 帮 8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 9 苞 胞 包 褒 剥 国标第 17区 0 1 2 3 4 5 6 7 8 9 0 薄 雹 保 堡 饱 宝 抱 报 暴 1 豹 鲍 爆 杯 碑 悲 卑 北 辈 背 2 贝 钡 倍 狈 备 惫 焙 被 奔 苯 3 本 笨 崩 绷 甭 泵 蹦 迸 逼 鼻 4 比 鄙 笔 彼 碧 蓖 蔽 毕 毙 毖 5 币 庇 痹 闭 敝 弊 必 辟 壁 臂 6 避 陛 鞭 边 编 贬 扁 便 变 卞 7 辨 辩 辫 遍 标 彪 膘 表 鳖 憋 8 别 瘪 彬 斌 濒 滨 宾 摈 兵 冰 9 柄 丙 秉 饼 炳 国标第 18区 0 1 2 3 4 5 6 7 8 9 0 病 并 玻 菠 播 拨 钵 波 博 1 勃 搏 铂 箔 伯 帛 舶 脖 膊 渤 2 泊