更新词汇至Unigram词表进行识别
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模型使識別結果更精確。
總結
以上是生活随笔為你收集整理的更新词汇至Unigram词表进行识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灰度图像--图像增强 双边滤波 Bila
- 下一篇: 图像平滑处理(归一化块滤波、高斯滤波、中