• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: C/C++
  • 标签: Viterbi  

资源简介

算法解决的问题:通过观察序列来猜测背后最有可能的隐藏序列。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

评论

共有 条评论