NShortPath.cpp
上传用户:yxl0916
上传日期:2007-05-25
资源大小:2245k
文件大小:7k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. //ICTCLAS简介:计算所汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),
  3. //             功能有:中文分词;词性标注;未登录词识别。
  4. //             分词正确率高达97.58%(973专家评测结果),
  5. //             未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%;
  6. //             处理速度为31.5Kbytes/s。
  7. //著作权:  Copyright?2002-2005中科院计算所 职务著作权人:张华平 刘群
  8. //遵循协议:自然语言处理开放资源许可证1.0
  9. //Email: zhanghp@software.ict.ac.cn
  10. //Homepage:www.nlp.org.cn;mtgroup.ict.ac.cn
  11. /****************************************************************************
  12.  *
  13.  * Copyright (c) 2000, 2001 
  14.  *     Software Research Lab.
  15.  *     Institute of Computing Tech.
  16.  *     Chinese Academy of Sciences
  17.  *     All rights reserved.
  18.  *
  19.  * This file is the confidential and proprietary property of 
  20.  * Institute of Computing Tech. and the posession or use of this file requires 
  21.  * a written license from the author.
  22.  *
  23.  * Abstract:
  24.  *      N-Shortest Path Problem for graph in word segement
  25.  *
  26.  * Author: Kevin Chang (zhanghp@software.ict.ac.cn)
  27.  *
  28.  * Notes:
  29.  *
  30.  ****************************************************************************/
  31. // NShortPath.cpp: implementation of the CNShortPath class.
  32. //
  33. //////////////////////////////////////////////////////////////////////
  34. #include "stdafx.h"
  35. #include "NShortPath.h"
  36. #include "Segment.h"
  37. #include <memory.h>
  38. #include <string.h>
  39. //#include <stdlib.h>
  40. //////////////////////////////////////////////////////////////////////
  41. // Construction/Destruction
  42. //////////////////////////////////////////////////////////////////////
  43. CNShortPath::CNShortPath(CDynamicArray *apCost,unsigned int nValueKind)
  44. {
  45.        m_apCost=apCost;//Set the cost
  46.    m_nValueKind=nValueKind;//Set the value kind
  47.    m_nVertex=apCost->m_nCol+1;
  48.        if(m_nVertex<apCost->m_nRow+1)
  49.    m_nVertex=apCost->m_nRow+1;//Get the vertex numbers
  50.    m_pParent=new CQueue*[m_nVertex-1];//not including the first node
  51.    m_pWeight=new ELEMENT_TYPE *[m_nVertex-1];
  52. //    m_pParent=(CQueue **)malloc((m_nVertex-1)*sizeof(CQueue *));//not including the first node
  53. //    m_pWeight=(ELEMENT_TYPE **)malloc(sizeof(ELEMENT_TYPE *)*(m_nVertex-1));
  54. for(unsigned int i=0;i<m_nVertex-1;i++)//The queue array for every node
  55. {
  56. m_pParent[i]=new CQueue[nValueKind];
  57. m_pWeight[i]=new ELEMENT_TYPE[nValueKind];
  58. // m_pParent[i]=(CQueue *)malloc(sizeof(CQueue)*nValueKind);
  59. // m_pWeight[i]=(ELEMENT_TYPE *)malloc(sizeof(ELEMENT_TYPE)*nValueKind);
  60. }
  61. }
  62. CNShortPath::~CNShortPath()
  63. {
  64.  for(unsigned int i=0;i<m_nVertex-1;i++)//The queue array for every node
  65.  {
  66.  delete [] m_pWeight[i];
  67. //  free(m_pWeight[i]);
  68. /*  for(unsigned int j=0;j<m_nValueKind;j++)
  69.  {
  70.  m_pParent[i][j].~CQueue();//;delete 
  71.  }*/
  72. //  free(m_pParent[i]);
  73.          delete [] m_pParent[i];
  74.  }
  75.  delete [] m_pWeight;
  76.  delete [] m_pParent;//not including the first node
  77. //  free(m_pWeight);
  78. //  free(m_pParent);
  79. }
  80. int CNShortPath::ShortPath()
  81. {
  82. unsigned int nCurNode=1,nPreNode,i,nIndex;
  83. ELEMENT_TYPE eWeight;
  84. PARRAY_CHAIN pEdgeList;
  85.     for(;nCurNode<m_nVertex;nCurNode++)
  86. {
  87.    CQueue queWork;
  88.    eWeight=m_apCost->GetElement(-1,nCurNode,0,&pEdgeList);//Get all the edges
  89.        while(pEdgeList!=0 && pEdgeList->col==nCurNode)
  90.    {
  91.    nPreNode=pEdgeList->row;
  92.    eWeight=pEdgeList->value;//Get the value of edges
  93.            for(i=0;i<m_nValueKind;i++)
  94.    {
  95.    if(nPreNode>0)//Push the weight and the pre node infomation
  96.    {
  97.    if(m_pWeight[nPreNode-1][i]==INFINITE_VALUE)
  98.    break;
  99.            queWork.Push(nPreNode,i,eWeight+m_pWeight[nPreNode-1][i]);
  100.    }
  101.    else
  102.    {
  103.    queWork.Push(nPreNode,i,eWeight);
  104.    break;
  105.    }
  106.    }//end for
  107.            pEdgeList=pEdgeList->next;
  108.    
  109.    }//end while
  110.        
  111.    //Now get the result queue which sort as weight.
  112.    //Set the current node information
  113.    for(i=0;i<m_nValueKind;i++)
  114.    {
  115. m_pWeight[nCurNode-1][i]=INFINITE_VALUE;
  116.    }
  117.    //memset((void *),(int),sizeof(ELEMENT_TYPE)*);
  118.        //init the weight
  119.    i=0;    
  120.        while(i<m_nValueKind&&queWork.Pop(&nPreNode,&nIndex,&eWeight)!=-1)
  121.    {//Set the current node weight and parent
  122.    if(m_pWeight[nCurNode-1][i]==INFINITE_VALUE)
  123.    m_pWeight[nCurNode-1][i]=eWeight;
  124.    else if(m_pWeight[nCurNode-1][i]<eWeight)//Next queue
  125.    {
  126.    i++;//Go next queue and record next weight
  127.    if(i==m_nValueKind)//Get the last position
  128.    break;
  129.    m_pWeight[nCurNode-1][i]=eWeight;
  130.    }
  131.            m_pParent[nCurNode-1][i].Push(nPreNode,nIndex);
  132.    }
  133. }//end for
  134. return 1;
  135. }
  136. //bBest=true: only get one best result and ignore others
  137. //Added in 2002-1-24
  138. void CNShortPath::GetPaths(unsigned int nNode,unsigned int nIndex,int **nResult,bool bBest)
  139. {
  140.     CQueue queResult;
  141. unsigned int nCurNode,nCurIndex,nParentNode,nParentIndex,nResultIndex=0;
  142.     
  143. if(m_nResultCount>=MAX_SEGMENT_NUM)//Only need 10 result
  144. return ;
  145. nResult[m_nResultCount][nResultIndex]=-1;//Init the result 
  146. queResult.Push(nNode,nIndex);
  147.     nCurNode=nNode;
  148. nCurIndex=nIndex;
  149.     bool bFirstGet;
  150.     while(!queResult.IsEmpty())
  151. {
  152. while(nCurNode>0)//
  153. {//Get its parent and store them in nParentNode,nParentIndex
  154. if(m_pParent[nCurNode-1][nCurIndex].Pop(&nParentNode,&nParentIndex,0,false,true)!=-1)
  155. {
  156.    nCurNode=nParentNode;
  157.    nCurIndex=nParentIndex;
  158. }
  159. if(nCurNode>0)
  160.                 queResult.Push(nCurNode,nCurIndex);
  161. }
  162. if(nCurNode==0)
  163. { //Get a path and output
  164.       nResult[m_nResultCount][nResultIndex++]=nCurNode;//Get the first node
  165.    bFirstGet=true;
  166.    nParentNode=nCurNode;
  167.    while(queResult.Pop(&nCurNode,&nCurIndex,0,false,bFirstGet)!=-1)
  168.    {
  169.    nResult[m_nResultCount][nResultIndex++]=nCurNode;
  170.             bFirstGet=false;
  171.    nParentNode=nCurNode;
  172.    }
  173.    nResult[m_nResultCount][nResultIndex]=-1;//Set the end
  174.    m_nResultCount+=1;//The number of result add by 1
  175.    if(m_nResultCount>=MAX_SEGMENT_NUM)//Only need 10 result
  176. return ;
  177.    nResultIndex=0;
  178.    nResult[m_nResultCount][nResultIndex]=-1;//Init the result 
  179.    if(bBest)//Return the best result, ignore others
  180.    return ;
  181. }
  182. queResult.Pop(&nCurNode,&nCurIndex,0,false,true);//Read the top node
  183.         while(queResult.IsEmpty()==false&&(m_pParent[nCurNode-1][nCurIndex].IsSingle()||m_pParent[nCurNode-1][nCurIndex].IsEmpty(true)))
  184. {
  185.        queResult.Pop(&nCurNode,&nCurIndex,0);//Get rid of it
  186.    queResult.Pop(&nCurNode,&nCurIndex,0,false,true);//Read the top node
  187. }
  188.         if(queResult.IsEmpty()==false&&m_pParent[nCurNode-1][nCurIndex].IsEmpty(true)==false)
  189. {
  190.    m_pParent[nCurNode-1][nCurIndex].Pop(&nParentNode,&nParentIndex,0,false,false);
  191.    nCurNode=nParentNode;
  192.    nCurIndex=nParentIndex;
  193.    if(nCurNode>0)
  194.        queResult.Push(nCurNode,nCurIndex);
  195. }
  196. }
  197. }
  198. int CNShortPath::Output(int **nResult,bool bBest,int *npCount)
  199. {//sResult is a string array
  200.   unsigned int i;
  201.   
  202.   m_nResultCount=0;//The 
  203.   if(m_nVertex<2)
  204.   {
  205.   nResult[0][0]=0;
  206.   nResult[0][1]=1;
  207.   *npCount=1;
  208.   return 1;
  209.   }
  210.   for(i=0;i<m_nValueKind&&m_pWeight[m_nVertex-2][i]<INFINITE_VALUE;i++)
  211.   {
  212.   GetPaths(m_nVertex-1,i,nResult,bBest);
  213.   *npCount=m_nResultCount;
  214.   if(nResult[i][0]!=-1&&bBest)//Get the best answer
  215.   return 1;
  216.       if(m_nResultCount>=MAX_SEGMENT_NUM)//Only need 10 result
  217.     return 1;
  218.   }
  219.   return 1;
  220. }