资源简介
算法解决的问题:通过观察序列来猜测背后最有可能的隐藏序列。viterbi译码算法是一种卷积码的解码算法。优点不说了。缺点就是随着约束长度的增加算法的复杂度增加很快。
代码片段和文件信息
#include “Viterbi.h“
#include
#include
#define ID_BOS 0
#define ID_EOS 1
#define MIN_VALUE -2000000000
void ViterbiNodeNet::GetBestPath() {
/* ViterbiNode* pVbBestNode = NULL;
for(int i = 0;i <= ;i--) {
}*/
}
void ViterbiNodeNet::AllocBuff(const int iLenSen) {
if(iLenSen <= 0) {
return ;
}
if(!m_pClassResult) {
m_pClassResult = new Result();
}
ClearNet();
m_pClassResult->Alloc(iLenSen - 2);// 没有
m_vbNodeMap = new ViterbiNode[iLenSen * MAX_UNIT_INDEX + 1];
m_iWordCount = iLenSen;
}
bool ViterbiNodeNet::InitVbNodeNet( WordMap* pWordMap) {
m_iWordCount = pWordMap->GetColCount() ;
if(pWordMap == NULL || m_iWordCount == 0) {
return false;
}
if(m_pClassResult) {
m_pClassResult->Clear();
}
m_WordUnitList.clear();
AllocBuff(m_iWordCount / 2 + 1 ); // 因为 只占了两列,所以要 + 1
// fprintf(stderr“begin InitVbNodeNet!\n“);
//m_iWordCount = pWordMap->clomn_len ;
for(int i = 0; i < m_iWordCount;i++) {
ClomnInfo* pColInfo = (ClomnInfo*)(pWordMap->GetColInfo(i));
if(!pColInfo) {
continue;
}
m_iRowSize[i] = pColInfo->GetWordNum();
for(int j = 0; j < m_iRowSize[i];j++) {
const WordUnit* pWordUnit = pColInfo->GetWordUnit(j);
if(!pWordUnit) {
continue;
}
ViterbiNode* pViterbiNode = GetViterbiNode(ij);
pViterbiNode->dScore = -2000000000;
pViterbiNode->iWordId = pWordUnit->word_id;
pViterbiNode->dFreq = pWordUnit->dFreq;
pViterbiNode->dRollBack = pWordUnit->dRollBack;
pViterbiNode->nodeTag = (NodeTag)pWordUnit->word_pos_type;
pViterbiNode->iWordLen = pWordUnit->word_len;
pViterbiNode->pUcsChar = pWordUnit->pUcsChar;
}
}
// fprintf(stderr“end InitVbNodeNet!\n“);
return true;
}
int ViterbiNodeNet::ForiPersonTag(const RoleShiftDict* pRoleShiftDictconst RoleTagModel* pRollMdl) {
if(pRoleShiftDict == NULL || pRollMdl == NULL || m_pRecPerName == NULL) {
return -1;
}
// m_pRecPerName->SetRecogType(REG_FORI_NAME);
return m_pForPerName->Mark(m_pClassResultpRoleShiftDictpRollMdl);
// return m_pRecPerName->Mark(m_pClassResultpRoleShiftDictpRollMdl);
}
int ViterbiNodeNet::CHSPersonTag(const RoleShiftDict* pRoleShiftDictconst RoleTagModel* pRollMdl) {
if(pRoleShiftDict == NULL || pRollMdl == NULL || m_pRecPerName == NULL) {
return -1;
}
m_pRecPerName->SetRecogType(REG_CHS_NAME);
return m_pRecPerName->Mark(m_pClassResultpRoleShiftDictpRollMdl);
}
int ViterbiNodeNet::PlaceTag(const RoleShiftDict* pRoleShiftDictconst RoleTagModel* pRollMdl) {
if(pRoleShiftDict == NULL || pRollMdl == NULL || m_pRecPerName == NULL) {
return -1;
}
return m_pRecPlace->Mark(m_pClassResultpRoleShiftDictpRollMdl);
}
int ViterbiNodeNet::GetBestSegment(const NGRramLMReader* pLMReaderconst RoleShiftDict* m_pRoleShiftDict) {
if(m_iWordCount <= 2 || pLMReader == NULL) {
fprintf(stderr“ 词语的个数不能小于等于0.\n“);
return -1; // 词语的个数不能小于等于0.
}
///
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7160 2012-07-20 16:50 Viterbi算法\Viterbi.cpp
文件 2864 2012-07-20 16:50 Viterbi算法\Viterbi.h
- 上一篇:Qt实现学生管理系统
- 下一篇:arm的s3c2410的游戏代码
评论
共有 条评论