首先check out输入法项目的代码:
$ hg clone ssh://anon@hg.opensolaris.org/hg/nv-g11n/inputmethod

或者到www.opensolaris.org上的input-method项目,下载最新的代码仓库快照。(但是其中并不包括ime/data目录下那些较大的数据文件,你可以到这里下载它们)

inputmethod/sunpinyin目录下是SunPinyin的代码,其中包括两部分,slm目录下是统计语言模型的代码(slm: statistical language model),ime目录下是和输入法相关的接口(ime: input method engine)。

slm中的代码用来构建一个支持back-off(回退)的n-gram(n元语法)静态统计语言模型。

首先执行下面的步骤来编译各个工具:

$ ./autogen.sh --prefix=/usr
$ make

build:这个目录下保存编译好的各个工具(以及它们的object文件),例如ids2ngram、slmbuild等。通过查看这个目录下的Makefile.am,你可以了解如何一步一步地构建词库和统计语言模型的二进制文件。

$ export LC_ALL=zh_CN.UTF-8
因为语料库和词表都使用UTF-8的编码,因此在进行后续步骤之前,需要将当前的语言环境设置为任意一个UTF-8的locale。

$ make test_corpus (或real_corpus)
这一步在raw目录中,建立一个corpus.utf8的符号链接。你完全可以手工建立这个链接。

$ make trigram
这一步建立一个trigram语言模型。

  1. 首先使用mmseg(最大正向分词),根据词表,对语料库进行分词,并将词的ID序列输出到一个文件中(../swap/lm_sc.ids)。
  2. 然后使用ids2ngram,对所有3元组出现的次数进行统计,并输出到一个文件中。例如下面的句子:ABCEBCA。得到的3元序列包括:(<S> A B), (A B C), (B C E) ... ( B C A), (C A '。'), (A '。' </S>)。<S>和</S>分别表示句首和句尾。
  3. 使用slmbuild来构造一个back-off的trigram语言模型,但是未经裁剪。
  4. 使用slmprune对刚输出的trigram语言模型进行剪裁,使用的算法是基于熵的剪裁算法。
  5. 使用slmthread对剪裁后的语言模型进行线索化,加快back-off(回退)查找的速度。将最终的结果输出到../data/lm_sc.t3g。

$ make bs_trigram
这个目标和上面的类似,不同的是使用slmseg进行分词,它借助刚刚生成的基于最大正向分词得到的语言模型,对语料库进行重新分词。这样可以进一步提高语言模型的精确程度。

$ make lexicon
根据生成语言模型中的unigram数据,对词表进行处理,得到一个支持不完全拼音的词库文件。

代码的细节我们随后再详述。

评论:

I'm very interested in this thread. waiting for more :-)

发表于 tubo 在 2007年08月02日, 09:37 上午 CST #

Language model is common for input methods, right? For a specific language model, are there some tools which can genereate input method engine automaticlly? something like Lex/Yacc for lexical analysis/syntax analysis.

发表于 tubo 在 2007年08月02日, 09:42 上午 CST #

Gavin, I know you are working on compilers, do you have interests to contribute one? ;)

发表于 Yong Sun 在 2007年08月02日, 09:43 上午 CST #

请教一个问题:当我完成
autogen.sh
make
export LC_ALL=zh_CN.UTF-8
后,发现并没有test_corpus目录也没有trigram,因此下面的make就做不了了,
是我少做了什么?能指点一下吗?

发表于 palance 在 2007年11月03日, 04:27 下午 CST #

我们尚未开放内部使用的生语料库,您可以使用sogou的语料库来进行训练,但是要做一些预先的处理:

1. 删除部分标记和特殊字符
2. 将编码转换为UTF-8

发表于 Yong Sun 在 2007年11月03日, 08:16 下午 CST #

我刚写了一个很简单的python脚本,参见http://blogs.sun.com/yongsun/entry/a_simple_stript_to_extract

发表于 Yong Sun 在 2007年11月03日, 10:32 下午 CST #

发表一条评论:
该日志评论功能被禁用了。

This blog copyright 2009 by yongsun