?? segtofile(sen).c
字號:
double GetElementValue(pDynamicArray p,int nRow, int nCol,PARRAY_CHAIN pStart,PARRAY_CHAIN *pRet)
{
PARRAY_CHAIN pCur=pStart;
if(pStart==0)
pCur=p->m_pHead;
if(pRet!=0)
*pRet=NULL;
if(nRow>(int)p->m_nRow||nCol>(int)p->m_nCol)
return INFINITE_VALUE;
/*如果是動態數組行的頭,則指向下一個行*/
if(p->m_bRowFirst)
{
while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
{
if(pRet!=0)
*pRet=pCur;
pCur=pCur->next;
}
}
/*如果是動態數組列的頭,則指向下一個列*/
else
{
while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
{
if(pRet!=0)
*pRet=pCur;
pCur=pCur->next;
}
}
if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))
{
if(pRet!=0)
*pRet=pCur;
return pCur->value;
}
return INFINITE_VALUE;
}
/**************************************************************************************
28.從動態數組中相應的行列查找其元素的值,沒有的行列加入,并把詞也加入動態數組
***************************************************************************************/
int SetElement(pDynamicArray p,unsigned int nRow, unsigned int nCol, double fValue,int nPOS,char *sWord)
{
PARRAY_CHAIN pCur=p->m_pHead;
PARRAY_CHAIN pAdd ,pPre=NULL;
/*得到行列*/
if(nRow>p->m_nRow)
p->m_nRow=nRow;
if(nCol>p->m_nCol)
p->m_nCol=nCol;
/*從行或列的頭遍歷行列*/
if(p->m_bRowFirst)
{
while(pCur!=NULL&&(pCur->row<nRow||(pCur->row==nRow&&pCur->col<nCol)))
{
pPre=pCur;
pCur=pCur->next;
}
}
else
{
while(pCur!=NULL&&(pCur->col<nCol||(pCur->col==nCol&&pCur->row<nRow)))
{
pPre=pCur;
pCur=pCur->next;
}
}
/*指定的行列位置找到元素值*/
if(pCur!=NULL&&pCur->row==nRow&&pCur->col==nCol)
{
pCur->value=fValue;
pCur->nPOS=nPOS;
}
/*沒有此行列則加入行列*/
else
{
pAdd=(PARRAY_CHAIN)malloc(sizeof(ARRAY_CHAIN));
pAdd->col=nCol;
pAdd->row=nRow;
pAdd->value=fValue;
pAdd->nPOS=nPOS;
/*sWord存在,直接加入*/
if(sWord)
{
pAdd->nWordLen=strlen(sWord);
pAdd->sWord=(char *)malloc((pAdd->nWordLen+1)*sizeof(char));
strcpy(pAdd->sWord,sWord);
}
/*sWord不存在,則詞為空*/
else
{
pAdd->nWordLen=0;
pAdd->sWord=NULL;
}
pAdd->next=pCur;
if(pPre==NULL)
p->m_pHead=pAdd;
else
pPre->next=pAdd;
pAdd=NULL;
}
return 0;
}
/**************************************************************************************
29.釋放動態數組的指針,包括多個sWord指針及動態數組的頭指針
***************************************************************************************/
void SetEmpty(pDynamicArray p)
{
PARRAY_CHAIN pTemp ,pCur=p->m_pHead;
while(pCur!=NULL)
{
pTemp=pCur->next;
if(pCur->sWord)
{
free(pCur->sWord);
pCur->sWord=NULL;
}
free(pCur);
pCur=pTemp;
}
pTemp=NULL;
p->m_pHead=NULL;
p->m_nCol=0;
p->m_nRow=0;
}
/**************************************************************************************
30. 得到行列中動態數組的元素,由RetWord返回詞,由pRetPOS返回位置
***************************************************************************************/
int GetElement(pDynamicArray p,int nRow, int nCol, double *pRetValue, int *pRetPOS,char *sRetWord)
{
PARRAY_CHAIN pCur=p->m_pHead;
*pRetValue=INFINITE_VALUE;
*pRetPOS=0;
if(nRow>(int)p->m_nRow||nCol>(int)p->m_nCol)
return FALSE;
if(p->m_bRowFirst)
{
while(pCur!=NULL&&(nRow!=-1&&(int)pCur->row<nRow||(nCol!=-1&&(int)pCur->row==nRow&&(int)pCur->col<nCol)))
{
pCur=pCur->next;
}
}
else
{
while(pCur!=NULL&&(nCol!=-1&&(int)pCur->col<nCol||((int)pCur->col==nCol&&nRow!=-1&&(int)pCur->row<nRow)))
{
pCur=pCur->next;
}
}
if(pCur!=NULL&&((int)pCur->row==nRow||nRow==-1)&&((int)pCur->col==nCol||nCol==-1))
{
*pRetValue=pCur->value;
if(pRetPOS)
*pRetPOS=pCur->nPOS;
if(sRetWord)
{
strcpy(sRetWord,pCur->sWord);
}
}
return TRUE;
}
/**************************************************************************************
31. 得到動態數組的頭指針
***************************************************************************************/
PARRAY_CHAIN GetHead(pDynamicArray p)
{
return p->m_pHead;
}
/**************************************************************************************
32. 得到動態數組的節點個數
***************************************************************************************/
unsigned int GetTail(pDynamicArray p,PARRAY_CHAIN *pTailRet)
{
PARRAY_CHAIN pPrev=NULL;
PARRAY_CHAIN pCur=p->m_pHead;
unsigned int nCount=0;
while(pCur!=NULL)
{
nCount+=1;
pPrev=pCur;
pCur=pCur->next;
}
*pTailRet=pPrev;
return nCount;
}
/**************************************************************************************
33. 得到動態數組的行指針
***************************************************************************************/
int SetRowFirst(pDynamicArray p,int RowFirst)
{
p->m_bRowFirst=RowFirst;
return TRUE;
}
/**************************************************************************************
34. 釋放動態數組的指針
***************************************************************************************/
void UDynamicArray(pDynamicArray p)
{
PARRAY_CHAIN pTemp ,pCur=p->m_pHead;
while(pCur!=NULL)
{
pTemp=pCur->next;
if(pCur->sWord)
{
free(pCur->sWord);
pCur->sWord=NULL;
}
free(pCur);
pCur=pTemp;
}
free(pTemp);
pTemp=NULL;
p->m_pHead=NULL;
}
/**************************************************************************************
35. 初始化動態數組的頭指針為NULL,行列均為0,賦值給第一個行指針
***************************************************************************************/
void IDynamicArray(pDynamicArray p,int bRowFirst)
{
p->m_pHead=NULL;
p->m_nRow=0;
p->m_nCol=0;
p->m_bRowFirst=bRowFirst;
}
/**************************************************************************************
36. 釋放隊列的各個節點指針,頭指針和p->m_pLastAccess指針
***************************************************************************************/
void UQueue(pQueue p)
{
PQUEUE_ELEMENT pTemp,pCur=p->m_pHead;
while(pCur!=NULL)
{
pTemp=pCur->next;
free(pCur);
pCur=pTemp;
}
pTemp=NULL;
free(p->m_pHead);
p->m_pHead=NULL;
free(p->m_pLastAccess);
p->m_pLastAccess=NULL;
}
/**************************************************************************************
37. 初始化隊列的各個節點指針,頭指針和p->m_pLastAccess指針
***************************************************************************************/
int Push(pQueue p,unsigned int nValue,unsigned int nIndex, double eWeight)
{
PQUEUE_ELEMENT pAdd,pCur=p->m_pHead;
PQUEUE_ELEMENT pPre=NULL;
while(pCur!=NULL&&pCur->eWeight<eWeight)
{
pPre=pCur;
pCur=pCur->next;
}
pAdd=(PQUEUE_ELEMENT)malloc(sizeof(QUEUE_ELEMENT));
pAdd->nParent=nValue;
pAdd->nIndex=nIndex;
pAdd->eWeight=eWeight;
pAdd->next=pCur;
if(pPre==0)
p->m_pHead=pAdd;
else
pPre->next=pAdd;
pAdd=NULL;
return 1;
}
/**************************************************************************************
38. 將Queue中內容讀出
***************************************************************************************/
int Pop(pQueue p,unsigned int *npValue,unsigned int *npIndex,double *epWeight, int bModify,int bFirstGet)
{
PQUEUE_ELEMENT pTemp;
/*如果修改,頭指針指向臨時指針*/
if(bModify)
pTemp=p->m_pHead;
/*如果不修改,頭指針指向最后訪問指針*/
else
{
if(bFirstGet)
p->m_pLastAccess=p->m_pHead;
pTemp=p->m_pLastAccess;
}
if(pTemp==NULL)
return -1;
/*Parent賦值pValue*/
if(npValue!=0)
*npValue=pTemp->nParent;
/*Index付給nIndex*/
if(npIndex!=0)
*npIndex=pTemp->nIndex;
/*Weight付給pWeight*/
if(epWeight!=0)
*epWeight=pTemp->eWeight;
if(bModify)
{
p->m_pHead=pTemp->next;
}
else
{
p->m_pLastAccess=pTemp->next;
}
return 1;
}
/**************************************************************************************
39. 將Queue的指針為NULL
***************************************************************************************/
int IsEmpty(pQueue p,int bBrowsed)
{
if(bBrowsed==TRUE)
return (p->m_pLastAccess==NULL);
return (p->m_pHead==NULL);
}
/**************************************************************************************
39. Queue為單節點
***************************************************************************************/
int IsSingle(pQueue p)
{
return (p->m_pHead!=NULL&&p->m_pHead->next==NULL);
}
/**************************************************************************************
40. 初始化Queue的指針為NULL
***************************************************************************************/
void IQueue(pQueue p)
{
p->m_pHead=NULL;
p->m_pLastAccess=NULL;
}
/**************************************************************************************
41. 釋放Queue的指針為NULL
***************************************************************************************/
void USpan(pSpan p)
{
free(p->m_context);
p->m_context=NULL;
}
/**************************************************************************************
42. 得到最佳前驅權重和頻率
***************************************************************************************/
int Disamb(pSpan p)
{
int i,j,k,nMinCandidate;
double dMinFee=0,dTmp;
for(i=1;i<p->m_nCurLength;i++)
{
for(j=0;p->m_nTags[i][j]>=0;j++)
{
nMinCandidate=MAX_POS_PER_WORD+1;
for(k=0;p->m_nTags[i-1][k]>=0;k++)
{
dTmp=-log(GetContextPossibility(p->m_context,0,p->m_nTags[i-1][k],p->m_nTags[i][j]));
dTmp+=p->m_dFrequency[i-1][k];
if(nMinCandidate>10||dTmp<dMinFee)
{
nMinCandidate=k;
dMinFee=dTmp;
}
}
p->m_nBestPrev[i][j]=nMinCandidate;
p->m_dFrequency[i][j]=p->m_dFrequency[i][j]+dMinFee;
}
}
return TRUE;
}
/**************************************************************************************
43. 詞性標注初始化
***************************************************************************************/
int Reset(pSpan p,int bContinue)
{
if(!bContinue)
{
if(p->m_tagType!=TT_NORMAL)
p->m_nTags[0][0]=100;
else
p->m_nTags[0][0]=0;
p->m_nUnknownIndex=0;
p->m_dFrequency[0][0]=0;
p->m_nStartPos=0;
}
else
{
p->m_nTags[0][0]=p->m_nTags[p->m_nCurLength-1][0];
p->m_dFrequency[0][0]=p->m_dFrequency[p->m_nCurLength-1][0];
}
p->m_nTags[0][1]=-1;
p->m_nCurLength=1;
p->m_nWordPosition[1]=p->m_nStartPos;
p->m_sWords[0][0]=0;
return TRUE;
}
/**************************************************************************************
44. 文件的內容load到詞性標注的結構中
***************************************************************************************/
int LoadContext(pSpan p,char *sFilename)
{
return LoadContextState(p->m_context,sFilename);
}
/**************************************************************************************
45. 詞性標注最好位置 m_nBestTag[詞數] 每個句詞的最好標注數組
m_sWords[詞數][詞長] 每個句中的詞內容,m_nTags[詞數][每詞的位置]元素為詞標注,行是句中詞數,列是詞位置
m_nBestPrev[詞數][每詞的位置] 元素為最佳前驅詞,m_nCurLength 當前長度
***************************************************************************************/
int GetBestPOS(pSpan p)
{
int i,j,nEnd;
/*得到最佳前驅權重和頻率*/
Disamb(p);
for(i=p->m_nCurLength-1,j=0;i>0;i--)
{
if(p->m_sWords[i][0])
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -