⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wordres.cpp

📁 计算机英汉机器翻译系统中的英语词性标注方法实现
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	pDictNode->m_pFirstChin->m_nCate=Cate_number;
	pDictNode->m_pFirstChin->m_nSlotNum = 1;
	pDictNode->m_pFirstChin->m_pwSlotLink = 
		new WORD[pDictNode->m_pFirstChin->m_nSlotNum*2+1];
	memcpy( pDictNode->m_pFirstChin->m_pwSlotLink,&Sem_OrdnlNU,sizeof(WORD));
	Mystrcpy(pDictNode,"number",3);

	return	pDictNode;
}//cdq add end


void	DictWordInit(DictNode* pDictNode)	//called by Caim
{	//in diction.cpp	DictWordInit(m_pDictNode);
	pDictNode->m_pNextWordNode = NULL;
	pDictNode->m_pPrevWordNode = NULL;

	pDictNode->m_byDictForm = Orig_Form;
	pDictNode->m_nLxhCate = NULL;
	pDictNode->m_nLxhCateLen = 0;
	pDictNode->m_byDictGenetive = No_Genetive;		//1:所有格
	pDictNode->m_cDictTense = Pre_Tense;			//时态:0现在,1过去,2将来,3过去将来
	pDictNode->m_cDictAspect = Simple_Aspect;		//体态:0一般,1进行,2完成,3完成进行
	pDictNode->m_cDictVoice = Active_Voice;			//0:主动,1:被动
	pDictNode->m_cDictNegative = Positive;			//0:肯定,1:否定,
	pDictNode->m_byDictPerson = Third_Person;		//1:第一人称,2:第二人称,3:第三人称
	pDictNode->m_byDictNumber = Sing_Number;		//0:单数,1:复数

	if(pDictNode->m_bIsExistOrig != FALSE)
		pDictNode->m_byDictForm = pDictNode->m_nWordStyle;
	else
		pDictNode->m_byDictForm = Orig_Form;
	pDictNode->m_byDictNumber = Sing_Number;
	pDictNode->m_byDictGenetive = No_Genetive;
	if(pDictNode->m_bIsExistOrig == FALSE || 
		pDictNode->m_pszOrig==NULL)
	{
		pDictNode->m_pszOrig = Mystrcpy(pDictNode,
			pDictNode->m_pszEnglish,2);

	}
	
}

void LxhFreeDictNode(DictNode *pDictNode)	//called by Caim
{
	if(pDictNode != NULL && pDictNode->m_nLxhCate != NULL)
	{
		delete pDictNode->m_nLxhCate;
		pDictNode->m_nLxhCate = NULL;
		pDictNode->m_nLxhCateLen = 0;
	}
}


BOOL	SearchCate(DictNode *pDictNode,int	Cate)
{
	DictChin *m_pChin;
	if(pDictNode == NULL)
		return	FALSE;
	m_pChin = pDictNode->m_pFirstChin;
	while(m_pChin != NULL)
	{
		if(Cate == Cate_v)
		{
			if(m_pChin->m_nCate == Cate_vd)
				return	TRUE;
			else if(m_pChin->m_nCate == Cate_ved)
				return	TRUE;
			else if(m_pChin->m_nCate == Cate_vi)
				return	TRUE;
			else if(m_pChin->m_nCate == Cate_ving)
				return	TRUE;
			else if(m_pChin->m_nCate == Cate_vl)
				return	TRUE;
			else if(m_pChin->m_nCate == Cate_vt)
				return	TRUE;
		}
		else
		if(m_pChin->m_nCate == Cate)
			return	TRUE;
		m_pChin = m_pChin->m_pNextChin;
	}
	return	FALSE;
}

BOOL SearchHead(DictNode *pDictNode,int	Head)
{
	DictChin *m_pChin;
	if(pDictNode == NULL)
		return	FALSE;
	m_pChin = pDictNode->m_pFirstChin;
	while(m_pChin != NULL)
	{
		if(m_pChin->m_nHead == Head)
			return	TRUE;
		else
			m_pChin = m_pChin->m_pNextChin;
	}
	return	FALSE;
}

BOOL SearchCase(DictNode *pDictNode,int	Case)
{
	DictChin *m_pChin;
	int	i;
	if(pDictNode == NULL)
		return	FALSE;
	m_pChin = pDictNode->m_pFirstChin;
	while(m_pChin != NULL)
	{
		for(i=0;i<m_pChin->m_nSlotNum;i++)
			if(m_pChin->m_pwSlotLink[i] == Case)
				break;
		if(i < m_pChin->m_nSlotNum)
			return	TRUE;
		else
			m_pChin = m_pChin->m_pNextChin;
	}
	return	FALSE;
}

char * Mystrcpy(DictNode *pDictNode,char *Word,int Option)
{	//Option:1, resource; 2: Original, 3: LxhCate
	int	StrLen = strlen(Word)+1;
	if(Option == 1)
	{
		if(pDictNode->m_pszEnglish != NULL)
			delete pDictNode->m_pszEnglish;
		pDictNode->m_pszEnglish = new char[StrLen];
		strcpy(pDictNode->m_pszEnglish,Word);
		pDictNode->m_nEnglishLen = StrLen-1;
		return	pDictNode->m_pszEnglish;
	}
	else if (Option ==2)
		{
		if(pDictNode->m_pszOrig != NULL)
			delete pDictNode->m_pszOrig;
		pDictNode->m_pszOrig = new char[StrLen];
		strcpy(pDictNode->m_pszOrig,Word);
		pDictNode->m_nOrigLen = StrLen-1;
		return	pDictNode->m_pszOrig;
	}
	else if (Option == 3)
		{
		if(pDictNode->m_nLxhCate != NULL)
			delete pDictNode->m_nLxhCate;
		pDictNode->m_nLxhCate = new char[StrLen];
		strcpy(pDictNode->m_nLxhCate,Word);
		pDictNode->m_nLxhCateLen = StrLen-1;
		return	pDictNode->m_pszOrig;
	}
	return	NULL;
}


void	FreeSentence(SentenceType * Sen)
{		//释放句子结点
	DictNode	* pDict1, *pDict2;
	pDict1 = Sen->m_pWordFirst;
	while(pDict1 != NULL)
	{
		pDict2 = pDict1->m_pNextWordNode;
		g_objLexSearch.FreeNode(pDict1);
		pDict1=pDict2;
	}
}

void	ModifyPreWord()
{	//确定为is或has, had或would
	if(g_objMorSent.m_pWordLast==NULL)
		return;
	if(g_objMorSent.m_pWordLast->m_byDictForm==Is_Has_Form)
	{
		Mystrcpy(g_objMorSent.m_pWordLast, "has",1);
		//g_objMorSent.m_pWordLast->m_pszOrig = new char[strlen("have")+1];
		g_objMorSent.m_pWordLast->m_pszOrig = 
			Mystrcpy(g_objMorSent.m_pWordLast, "have",2);
		g_objMorSent.m_pWordLast->m_byDictNumber=Sing_Number;
	}
	else if(g_objMorSent.m_pWordLast->m_byDictForm==Would_had_Form)
	{
		Mystrcpy(g_objMorSent.m_pWordLast, "had",1);
		g_objMorSent.m_pWordLast->m_pszOrig = 
			Mystrcpy(g_objMorSent.m_pWordLast, "have",2);
		g_objMorSent.m_pWordLast->m_byDictForm = Past_Tense;
		g_objMorSent.m_pWordLast->m_byDictNumber=Multi_Number;
	}
}

/*void	OutputDictInformation(DictNode	* pDict, FILE *fpres)
{
	//fputc('\n',fpres);
	fputs(" Tense:",fpres);
	switch(pDict->m_cDictTense)
	{
		case	Pre_Tense:
			fputs("现在",fpres);
			break;
		case	Past_Tense:
			fputs("过去",fpres);
			break;
		case	Future_Tense:
			fputs("将来",fpres);
			break;
		case	Pastfuture_Tense:
			fputs("过去将来",fpres);
			break;
	}
	fputs(" Aspect:",fpres);	   
	switch(pDict->m_cDictAspect)
	{		 //0一般,1进行,2完成,3完成进行
		case	Simple_Aspect:
			fputs("一般",fpres);
			break;
		case	Progressive_Aspect:
			fputs("进行",fpres);
			break;
		case	Perfect_Aspect:
			fputs("完成",fpres);
			break;
		case	PerfectProgressive_Aspect:
			fputs("完成进行",fpres);
			break;
	}
	fputs(" Voice:",fpres);	   
	switch(pDict->m_cDictVoice)
	{	//0:主动,1:被动
		case	Active_Voice:
			fputs("主动",fpres);
			break;
		case	Passive_Voice:
			fputs("被动",fpres);
			break;
	}
	fputs(" Negative:",fpres);	   
	switch(pDict->m_cDictNegative)
	{	//0:肯定,1:否定
		case	Positive:
			fputs("肯定",fpres);
			break;
		case	Negative:
			fputs("否定",fpres);
			break;
	}
	fputs("\n Person:",fpres);	   
	switch(pDict->m_byDictPerson)
	{	//1:第一人称,2:第二人称,3:第三人称
		case	First_Person:
			fputs("第一人称",fpres);
			break;
		case	Second_Person:
			fputs("第二人称",fpres);
			break;
		case	Third_Person:
			fputs("第三人称",fpres);
			break;
	}
	fputs(" Number:",fpres);	   
	switch(pDict->m_byDictNumber)
	{	//0:单数,1:复数
	case	Sing_Number:
		fputs("单数",fpres); 
		break;
	case	Multi_Number:
		fputs("复数",fpres); 
		break;
	}
	fputc('\n',fpres);
	fputs(" Ambig:",fpres);	 
	if(pDict->m_pszAmbig !=NULL)
		fputs(pDict->m_pszAmbig, fpres);
	fputs("   ",fpres);	 

	fputs(" LxhCate:",fpres);
	if(pDict->m_nLxhCate != NULL)
	fputs(pDict->m_nLxhCate, fpres);
	fputc('\n',fpres);
}
*/
int MorphorAnalyze(char	*sen)
{		//分析单个句子
	int		i=0,j=0,WordNo=0,IsWord[MaxWordNo];
	char	Words[MaxWordNo][MaxWordLength],*p,*head,str[32],numstr[128];
	struct	DictNode *NewDicNode,*pDict,*CurNode,*NumBegin,*NumEnd;
	int NewWordNo = 0;
	BOOL	FirstCharacter;
		
	g_objMorSent.m_pWordFirst=g_objMorSent.m_pWordLast = NULL;
	
	p =head =  sen;	//切词
	while(p[0] !=0)
	{
		FirstCharacter = TRUE;
		while(p[0]!= ' ' &&  p[0]!= '(' && p[0]!= ')' && 
			 p[0]!= '\"' && p[0] !='\0')
		{
			if(p[0] == '-' && p[1] == '-')
			{
				p+=2;
				break;
			}
			else if(p[0] == ':' || p[0]== ';' || p[0]== '!' || p[0]== '?')
			{
				if(p[1]==' ' || p[1]=='\n' || head[p-head+1]=='\0')
					break;
			}
			else if(p[0] == '.' )
			{
				if(FirstCharacter && p[0] == '.')
				{	//省略号的处理
					while(p[0] == '.')
						p++;
					break;
				}
				if(head[p-head+1]==' ' || head[p-head+1]=='\n'  || head[p-head+1]=='\0')
				{	//句号
					strncpy(str,head,p-head);
					str[p-head]='\0';
					if(IsAbreivWord(str))
						p++;
					break;
				}
				else if(head[p-head+1]=='.' && head[p-head+2]=='.')
					break;	//后为省略号

			}
			else if(p[0] == ',')
			{
				if(head[p-head+1]==' ' || head[p-head+1]=='\n' || head[p-head+1]=='\0')
					break;
			}
			p++;
			FirstCharacter = FALSE;
		}
		if(p-head < MaxWordLength)
		{		//词不能太长
			if(p == head)
				p++;	//标点
			IsWord[WordNo] = TRUE;
			strncpy(Words[WordNo],head,p-head);
			Words[WordNo++][p-head] = '\0';
		}
		while((*p == ' ' || *p == '\r' ||*p == '\n' )&& p[0] !='\0')
			p++;
		if(p[0] == '\0')	break;
		head = p;
		if(i>=MaxWordNo)
			break;	//词不能太多
	}	//切词

	if(bNoTranCapStr)
	{	// 不翻译连续大写的字符串
		for(i=0;i<WordNo;i++)
		{
			if(isupper(Words[i][0])  && !isAppellation(Words[i]) && i!=0) //cdq changed 12.28
			{
				if(NewWordNo != i)
					strcpy(Words[NewWordNo],Words[i]);
				j = i+1;
				while(j<WordNo && isupper(Words[j][0]) && 
					!(j==1 &&  strcmp(Words[j],"I")==0 )) 
				{
					strcat(Words[NewWordNo]," ");
					strcat(Words[NewWordNo],Words[j]);
					j++;
				}
				if(j<WordNo)
					strcpy(Words[++NewWordNo],Words[j]);
				i = j;
			}
			else
				strcpy(Words[NewWordNo],Words[i]);
			NewWordNo ++;
		}
		WordNo = NewWordNo;
	}	// 不翻译连续大写的字符串

	for(i=0;i<WordNo;i++)	//查词典,词形还原
	{    
		//cdq changed 12.11
		if(i==0)
		{
			if ( strcmp(Words[i],"May")==0 )
			{
				if ( strcmp(Words[i+1],"I")==0 ||
					strcmp(Words[i+1],"we")==0 )
					NewDicNode = WordRestore(Words[i],SEARCH_FIRSTCH);
				else
					NewDicNode = g_objLexSearch.SearchWord(Words[i]);
			}
			else
				NewDicNode = WordRestore(Words[i],SEARCH_FIRSTCH);
		}
		else
			NewDicNode = WordRestore(Words[i],SEARCH_ALLCH);
		if(NewDicNode==NULL)
			continue;
		if(g_objMorSent.m_pWordFirst==NULL)
			{
			g_objMorSent.m_pWordFirst = g_objMorSent.m_pWordLast = NewDicNode;
			while(g_objMorSent.m_pWordLast->m_pNextWordNode != NULL)
				g_objMorSent.m_pWordLast=g_objMorSent.m_pWordLast->m_pNextWordNode;
			}
		else
			{
			g_objMorSent.m_pWordLast->m_pNextWordNode = NewDicNode;
			NewDicNode->m_pPrevWordNode = g_objMorSent.m_pWordLast;
			g_objMorSent.m_pWordLast = NewDicNode;
			while(g_objMorSent.m_pWordLast->m_pNextWordNode != NULL)
				g_objMorSent.m_pWordLast=g_objMorSent.m_pWordLast->m_pNextWordNode;
			}
	}	//查词典,词形还原
	
	/*CurNode = g_objMorSent.m_pWordFirst;	//数字翻译
	while(CurNode!=NULL)
	{                      
		strcpy(numstr,"\0");
		i  = Cate_number;	//test
		if(SearchCate(CurNode,Cate_number) && CurNode->m_byDictForm==Orig_Form
			&& CurNode->m_byDictGenetive == No_Genetive
			&& SearchCate(CurNode->m_pNextWordNode,Cate_number))	//数词
			//&& !((CurNode->m_pszOrig,"one") == 0 && !SearchCate(CurNode->m_pNextWordNode,Cate_number)))	//数词
		{
			NumBegin = CurNode;
			strcpy(numstr,CurNode->m_pszEnglish);
			CurNode = NumEnd= CurNode->m_pNextWordNode;
			while(SearchCate(CurNode,Cate_number) && CurNode->m_byDictForm==Orig_Form
				&& CurNode->m_byDictGenetive == No_Genetive)	//数词
				{
				NumEnd = CurNode;
				strcat(numstr," ");
				strcat(numstr,CurNode->m_pszEnglish);
				NumBegin->m_pNextWordNode = NumEnd->m_pNextWordNode;
				if(NumEnd->m_pNextWordNode != NULL)
					NumEnd->m_pNextWordNode->m_pPrevWordNode = NumBegin;
				CurNode = CurNode->m_pNextWordNode;
				g_objLexSearch.FreeNode(NumEnd);	//释放
				if(CurNode != NULL && strcmp(CurNode->m_pszEnglish,"and")==0)
					CurNode = CurNode->m_pNextWordNode;
				}
			NumBegin->m_pszEnglish = Mystrcpy(NumBegin, numstr,1);
			NumBegin->m_pszOrig = Mystrcpy(NumBegin, ltoa(OuterNumTran(numstr),numstr,10),2);
			Mystrcpy(NumBegin,"dig",3);
		}
		if(CurNode != NULL)
			CurNode = CurNode->m_pNextWordNode;
	}		//数字翻译
	
	pDict = g_objMorSent.m_pWordFirst;
*/
	/*while(pDict != NULL)
	{
		pDict = TenseAnalyse(pDict);		//时态、语态分析
		if(pDict == NULL)	
			break;
		if(pDict->m_byDictForm == Ing_Form && 
			pDict->m_cDictAspect != Progressive_Aspect &&
			pDict->m_cDictAspect != PerfectProgressive_Aspect)
			Mystrcpy(pDict,"ving",3);
		if(pDict->m_pPrevWordNode== NULL)
			g_objMorSent.m_pWordFirst = pDict;
		if(pDict->m_pNextWordNode== NULL)
			g_objMorSent.m_pWordLast = pDict;
		pDict = pDict->m_pNextWordNode;
	}*/
return 1;
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -