前几天读到google研究员吴军的数学之美系列篇,颇有感触。而恰好自己前段时间做了个基于统计语言模型的中文切分系统的课程项目,于是乎,帖出来与大家共同学习。
分词技术在搜索引擎,信息提取,机器翻译等领域的重要地位与应用就不敖述了。步入正题:)
本切分系统的统计语料是用我们学校自己开放的那部分,大家可以在 这里 下载,中文字符约184万,当然这都是已切分好了的,可以用此建立一个比较小的语料库。本系统我主要分下面四个步骤完成:
1、 语料预处理
2、 建立 2-gram(统计二元模型)
3、 实现全切分
4、 评估测试
下面我分别对这四个方面一一道来。
下载的已切分的语料都是形如“19980131-04-012-001/m 现实/n 的/u 顿悟/vn 却/d 被/p 描/v 出/v 形/Ng 来/v 。/w ” ,有的前面还保留了日期编号,因为这些切分语料的来源是人民日报。预处理主要是按标点符号分句,句子简单定义为( 。?! : ;)这五种标点符号结尾的词串,句子首尾分别添加<BOS>和<EOS>这两个表示句子开始和结束的标记,这在2-gram建模时要用的,后面会提到。处理过程中,忽略词类信息和前面的日期信息,因为我这个切分系统不考虑词类标注。如前面这句预处理后应该为下面形式 “<BOS>现实 的 顿悟 却 被 描 出 形 来 。<EOS>” ,当然切分词之间你可以用你想用的符号标记,而不必是空格。因为考虑到所有的英文字符和数字的ASCII,我用了下面方法实现之:
out ; //输出流 in; //输入流 StringBuffer s1 = new StringBuffer(); //缓冲 char a = in.read(); while (a != -1) //判断是否已到流的终点 { if ((a == '。' || a == '?' || a == '!' || a == ':' || a == ';' )) //一句结束 { String s2 = new String(s1); out.write("<BOS>"); //在句子前加 <BOS> out.write(s2); out.write("<EOS>"); //在句子末尾加 <EOS> out.write('/n'); //换行 s1 = new StringBuffer(); } else if ( a == '/') s1 = s1.append((char)32); //分词位置空格 else if (a > 256 ) s1 = s1.append((char)a); a = in.read(); } out.close(); in.close(); |
[1] [2] [3] 下一页