更新词汇至Unigram词表进行识别

来源:互联网 发布:javascript decorator 编辑:程序博客网 时间:2024/05/16 07:10

from:http://blog.csdn.net/lifesider/article/details/6553096

完成CMU Sphinx Toolkit到UNICODE的移植后,由于其自身支持的中文词汇太少且过于简单,实际生活中的很多词汇无法识别,由于其缺少开发文档,只能在代码跟踪的过程里心烦了。

 

于是想,肯定需要在词典文件中增加新词汇吧,如果其本身是按照Ciphone序列进行识别的话,应该就能识别出新词汇。

后来在词典文件中增加了几个特定词汇,发现识别结果未发生任何变化。

 

于是又对DMP模型文件进行分析,发现里面也有词典中的部分词汇(默认为5000个,简体中文,UNIGRAM),于是猜测是否需要更新词汇到DMP模型文件中呢?

 

由于DMP模型文件本身是二进制写入的,于是在运行过程中,进行手动改写原有部分词汇为新词汇(不以内存映射文件打开即可),最终发现最后识别出新词汇了。

 

OK!

 

结论:

由于CMU Sphinx Toolkit的开发文档几乎没有,而源代码中的注释信息也不充分,于是纯粹的跟踪代码的是件费神的事儿,看来某些时候还得有怀疑的心态并去尝试,也许会得到意想不到的结果。

通过这次尝试,最终确定Sphinx是将DMP模型文件和词典文件绑定在一起(内部建立索引),对于新词汇两者需要同时更新,下一步需要进行DMP模型文件的剖析工作。当然DMP模型文件中其实是存在其它信息的,比如概率信息等。想得到更精确的识别结果,可能也并不是简单的更新词汇就行,但至少也有了个突破口吧!

 

续。。。


通过在运行时修改某一词汇至特定词汇进行识别,然而当需要测试的新词汇较多时,并且新增词汇相近时,对于运行时手动修改的工作量是巨大的。为了具有更好的扩展性,这里提出一种对新增词汇进行统一处理的方法。

 

在语言模型目录(及与DMP模型和DICT词典文件相同的目录)下新增一个文本文件,如new_dict.txt,对于需要新增的词汇只需要手动加入到new_dict.txt中,一行一个词及音元序列,如

 

守波 sh ou b o

赖守波 l ai sh ou b o

.............

 

同时需要在词典和模型处理的源代码文件中,添加对new_dict.txt进行处理的代码:

在词典的创建过程中,需要读取new_dict.txt文件,并将词语和音元序列进行对应,这里需要注意的是音元必须是70个基本音元之一,同时词语不能有重复;

在模型的创建过程中,可优先读出new_dict.txt文件中的词语数目,并自动丢弃原模型文件中5000个词语中与新词汇相同数目的词语。

这样,则在运行时进行了对词典和模型文件的自动更新,并且我们需要测试新的词汇时,只需要手动添加到new_dict.txt文件中一次即可,便可看到识别效果。

 

目前的测试结果仍是基于修改Unigram词表,更进一步的是,需要对Bigram和Trigram词表进行分析及更新,这样既能节省词表空间,同时结合HMM模型使识别结果更精确。



0 0
原创粉丝点击