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

📄 tense.cpp

📁 计算机英汉机器翻译系统中的英语词性标注方法实现
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if(CompareForm(end,Ed2_Form))	//ed2
			{
				pDict->m_cDictVoice = Passive_Voice;//state 18,19 一般(过去)将来时,被动
				pDict = CombineNodes(pDict,end,end);
				return	pDict;
			}
			else if(CompareWord(end,"being"))//being
			{
				end = end->m_pNextWordNode;
				if(CompareForm(end,Ed2_Form))	//ed2
				{//state 20,21	一般(过去)将来进行时,被动
					pDict->m_cDictAspect=Progressive_Aspect;
					pDict->m_cDictVoice = Passive_Voice;//state 20,21
					pDict = CombineNodes(pDict,end,end);
					return	pDict;
				}
				else
					return	pDict;		//may have erro
			}
			else if(CompareForm(end,Ing_Form))	//ing
			{	//state 22,23 	一般(过去)将来进行时,主动
				pDict->m_cDictAspect=Progressive_Aspect;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;
			}
		}
		else if(CompareWord(CurPosOuter->m_pNextWordNode,"have"))//have
		{
			end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
			if(CompareWord(end,"been"))//been
			{	
				end = end->m_pNextWordNode;
				if(CompareForm(end,Ed2_Form))	//ed2
				{	//state 26,27	一般(过去)将来完成时,被动
					pDict->m_cDictAspect=Perfect_Aspect;
					pDict->m_cDictVoice = Passive_Voice;
					pDict = CombineNodes(pDict,end,end);
					return	pDict;
				}
				else 
				if(CompareForm(end,Ing_Form))	//ing
				{	//state 26,27	一般(过去)将来完成进行时,主动
					pDict->m_cDictAspect=PerfectProgressive_Aspect;
					pDict->m_cDictVoice = Active_Voice;
					pDict = CombineNodes(pDict,end,end);
					return	pDict;
				}
				else
					return	pDict;		//may have erro
			}
			else
			if(CompareForm(end,Ed2_Form))	//ed2
			{	//24,25		一般(过去)将来完成时,主动
				pDict->m_cDictAspect=Perfect_Aspect;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;
			}
			
		}
		if(SearchCate(pDict->m_pNextWordNode,Cate_v))
		{
			if(pDict->m_pNextWordNode != NULL)
				pDict = CombineNodes(pDict,pDict->m_pNextWordNode,pDict->m_pNextWordNode);
			return	pDict;
		}
	}
	else if(CompareWord(pDict,"did")) 
	{
		CurPosOuter = pDict;
		if(CompareWord(CurPosOuter->m_pNextWordNode,"not"))	//negative
		{
			pDict->m_cDictNegative=Negative;
			CurPosOuter = CurPosOuter->m_pNextWordNode;
		}
		pDict->m_cDictTense=Past_Tense;	//state 31	一般过去时
		
		if(SearchCate(CurPosOuter->m_pNextWordNode,Cate_v))
		{	//did not mind;	应判断not后是否有动词
			CurPosOuter = CurPosOuter->m_pNextWordNode;
			pDict = CombineNodes(pDict,CurPosOuter,CurPosOuter);
		}
		else
			pDict = CombineNodes(pDict,CurPosOuter,pDict);
		return	pDict;
	}
	else if(CompareWord(pDict,"do") || CompareWord(pDict,"does")) 
	{	//state 32
		CurPosOuter = pDict;
		if(CompareWord(CurPosOuter,"does"))
		{
			pDict->m_byDictPerson=Third_Person;
			pDict->m_byDictNumber=Sing_Number;
		}
		if(CompareWord(CurPosOuter->m_pNextWordNode,"not"))	//negative
		{
			pDict->m_cDictNegative=Negative;
			CurPosOuter = CurPosOuter->m_pNextWordNode;
		}
		if(SearchCate(CurPosOuter->m_pNextWordNode,Cate_v))
		{	//do not mind
			CurPosOuter = CurPosOuter->m_pNextWordNode;
			pDict = CombineNodes(pDict,CurPosOuter,CurPosOuter);
		}
		else	//do not
			pDict = CombineNodes(pDict,CurPosOuter,pDict);
		return	pDict;		//一般现在时
	}
	else if((CurPosOuter=HaveWord(pDict,NULL,Ed1_2_Form))!=NULL)	//ed1
	{	//state	30	一般过去时
		pDict->m_cDictTense=Past_Tense;
		return	pDict;
	}
	return	pDict;
}

*/

//蔡的程序中,要改动的函数:FreeNode(加入口参数,指明要释放的对象)
//SearchWord(去长度入口参数,对新的成员变量置初值), 返回指向DictNode的指针
//即使没有原型,	即m_bIsExistOrig=FALSE, 也将 m_pszEnglish 赋给 m_pszOrig

//DictNode中增加:BYTE		m_byMaxPhraseLen;
//表示:如果 m_pszEnglish为一个单词,记录短语第一个为该词的短语最大长度

/*
	int	m_byMaxPhraseLen;	//如果 m_pszEnglish为一个单词,记录短语第一个为该词的短语最大长度
	DictNode	*m_pNextWordNode;	//下一个 词结点
	DictNode	*m_pPrevWordNode;	//前一个 词结点 

	int		m_byDictForm;
	BYTE	m_byDictGenetive;		//1:所有格
	char	m_cDictTense;			//时态:0现在,1过去,2将来,3过去将来
	char	m_cDictAspect;			//体态:0一般,1进行,2完成,3完成进行
	char	m_cDictVoice;			//0:主动,1:被动
	char	m_cDictNegative;		//0:肯定,1:否定,
	BYTE	m_bDictyPerson;			//1:第一人称,2:第二人称,3:第三人称
	BYTE	m_byDictNumber;			//0:单数,1:复数
*/																	


DictNode* WordRestore(char *inputword, int nSearchMod)
{       
	// word:输入字符串中的词
	// wordth:还原以后,信息放入BTNode[wordth]中
	DictNode *pDictNode1, *pDictNode2;
	char	head[128],tail[30],*p;
	char	Word[150];
	int		WordLen;
	BOOL	Restore = TRUE;
	strcpy(Word,inputword);
	WordLen = strlen(inputword);
	if(WordLen == 0)
		return	NULL;
	if(IsDigitalWord(Word, WordLen))
	{
		if ( (p=strstr(Word,"st"))!=NULL ||
			(p=strstr(Word,"nd"))!=NULL ||
			(p=strstr(Word,"rd"))!=NULL ||
			(p=strstr(Word,"th"))!=NULL )
		{
			pDictNode1 = CreateNewWord(Word);
			pDictNode1->m_nChinNum = 1;
			pDictNode1->m_pFirstChin = new DictChin;
			p[0]='\0';
			pDictNode1->m_pFirstChin->m_pszChinese = new char[strlen(Word)+1];
			strcpy(pDictNode1->m_pFirstChin->m_pszChinese,Word);
			pDictNode1->m_pFirstChin->m_nChineseLen = 
				strlen(pDictNode1->m_pFirstChin->m_pszChinese);
			pDictNode1->m_pFirstChin->m_nCate = Cate_number;
			pDictNode1->m_pFirstChin->m_nSlotNum = 1;
			pDictNode1->m_pFirstChin->m_pwSlotLink = 
				new WORD[pDictNode1->m_pFirstChin->m_nSlotNum*2+1];
			memcpy( pDictNode1->m_pFirstChin->m_pwSlotLink,&Sem_OrdnlNU,sizeof(WORD));
		    Mystrcpy(pDictNode1,"number",3);
		}
		else
		{
			pDictNode1 = CreateNewWord(Word);
			pDictNode1->m_nChinNum = 1;
			pDictNode1->m_pFirstChin = new DictChin;
			pDictNode1->m_pFirstChin->m_pszChinese = new char[10];
			strcpy(pDictNode1->m_pFirstChin->m_pszChinese,pDictNode1->m_pszEnglish);
			pDictNode1->m_pFirstChin->m_nCate = Cate_dig;
			Mystrcpy(pDictNode1,"dig",3);
		}
		return	pDictNode1;
	}
	else
		if((pDictNode1=g_objLexSearch.SearchWord(Word,nSearchMod)) != NULL)
	{	//读入词典信息:词性,译文
		if(strcmp(Word,"May") ==0 && nSearchMod==SEARCH_FIRSTCH)
		{
			g_objLexSearch.FreeNode(pDictNode1);
			pDictNode1=g_objLexSearch.SearchWord("may",nSearchMod);
		}
		if(!pDictNode1->m_bIsExistOrig )
		{
			Restore = FALSE;		//原形,不还原
		}
		else if(pDictNode1->m_nWordStyle == STYLE_ED || 
			pDictNode1->m_nWordStyle == STYLE_ED1 || 
			pDictNode1->m_nWordStyle == STYLE_ED2 ) 
		{	//ed形式,
			if (SearchCate(g_objMorSent.m_pWordLast,Cate_adet) ||
				SearchCate(g_objMorSent.m_pWordLast,Cate_adj))			//cdq changed 12.29
				Restore = FALSE;	//前一个单词为冠词或形容词, 则该词为n,不还原
			else if(SearchCate(pDictNode1,Cate_adj) == NULL)
				Restore = TRUE;	//非形容词,还原
			else if (SearchCate(g_objMorSent.m_pWordLast,Cate_n) || 
				SearchCate(g_objMorSent.m_pWordLast,Cate_pron))
				Restore = TRUE;	//前面为代词、名词,还原
			else if(HaveWord(g_objMorSent.m_pWordLast,"have",-1)!=NULL)
				Restore = TRUE;		//have done
			else if(g_objMorSent.m_pWordLast !=NULL && 
				HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"have",-1)!=NULL)
				Restore = TRUE;		//have ... done
			else if(HaveWord(g_objMorSent.m_pWordLast,"be",-1)!=NULL)
				Restore = TRUE;		//be done
			else if(g_objMorSent.m_pWordLast !=NULL && 
				HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"be",-1)!=NULL)
				Restore = TRUE;		//be ... done
			else if(g_objMorSent.m_pWordLast !=NULL &&
				(HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"very",-1)!=NULL || 
				HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"so",-1)!=NULL ))
			{
				Restore = FALSE;	//前一个单词为so, very, 则该词为adj
				Mystrcpy(pDictNode1,"adj",3);
			}
			else if((pDictNode2=g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod)) != NULL &&
				SearchCate(pDictNode2,Cate_vt) != NULL)
			{
				Restore = FALSE;	//ved为最后一个词,且其动词为vt,作adj.
				Mystrcpy(pDictNode1,"adj",3);
				g_objLexSearch.FreeNode(pDictNode2);	
			}
			else
			{
				if(pDictNode2 != NULL)	
					g_objLexSearch.FreeNode(pDictNode2);	
				Restore = TRUE;
			}
			if(Restore)
				Mystrcpy(pDictNode1,"!Cate=adj",3);
		}
		else if(pDictNode1->m_nWordStyle == STYLE_ING && SearchCate(pDictNode1,Cate_adj)!=NULL)
		{//ing形式,可能形容词
			/*
			if(HaveWord(g_objMorSent.m_pWordLast,"be",-1)!=NULL)
				Restore = FALSE;		//be adj
			else if(g_objMorSent.m_pWordLast != NULL && 
				HaveWord(g_objMorSent.m_pWordLast->m_pPrevWordNode,"be",-1)!=NULL)
				Restore = FALSE;		//be ... adj
			else		//old rules
			*/
			//new rules
			if((pDictNode2=g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod)) != NULL &&
				SearchCate(pDictNode2,Cate_vi) != NULL)
			{
				Restore = TRUE;		//ving为最后一个词,且其动词为Vi,作ving
				g_objLexSearch.FreeNode(pDictNode2);	
			}
			else
			{
				if(pDictNode2 != NULL)	
					g_objLexSearch.FreeNode(pDictNode2);	
				Restore = FALSE;
			}
			if(Restore)
				Mystrcpy(pDictNode1,"!Cate=adj",3);
			else
				Mystrcpy(pDictNode1,"adj",3);

		}
		if(! Restore )		//不还原
		{	
			if(pDictNode1->m_pszOrig == NULL)
				pDictNode1->m_pszOrig = Mystrcpy(pDictNode1,pDictNode1->m_pszEnglish,2);
			pDictNode1->m_byDictForm = Orig_Form;
		}
		else
		{	//不规则变化的词,二次查词典:
			if(g_objLexSearch.SearchWord(pDictNode1->m_pszOrig,nSearchMod) != NULL)
			{
				g_objLexSearch.m_pDictNode->m_pszEnglish = 
					Mystrcpy(g_objLexSearch.m_pDictNode,inputword,1);	//98.3.10
				g_objLexSearch.m_pDictNode->m_pszOrig = 
					Mystrcpy(g_objLexSearch.m_pDictNode,pDictNode1->m_pszOrig,2);
				g_objLexSearch.m_pDictNode->m_byDictForm = pDictNode1->m_byDictForm;
				g_objLexSearch.m_pDictNode->m_byDictNumber = pDictNode1->m_byDictNumber;
				g_objLexSearch.m_pDictNode->m_bIsExistOrig = TRUE;
				g_objLexSearch.FreeNode(pDictNode1);	
				pDictNode1 = g_objLexSearch.m_pDictNode;
			}
		}
		if((pDictNode1->m_byDictForm == Ed2_Form || 
			pDictNode1->m_byDictForm == Ed1_2_Form) )
			ModifyPreWord();
			
		return	pDictNode1;
	}
	else if((p=strchr(Word,'\''))!=NULL)
	{	//有符号'
		if(strcmp(Word,"Let's")==0 || strcmp(Word,"let's")==0)
		{	//let's                                    
			pDictNode1 = g_objLexSearch.SearchWord("let",nSearchMod);
			pDictNode2 = g_objLexSearch.SearchWord("us",nSearchMod);
			pDictNode1->m_pNextWordNode = pDictNode2;
			pDictNode2->m_pPrevWordNode = pDictNode1;
			pDictNode1->m_byDictForm = Orig_Form;
			pDictNode2->m_byDictForm = Orig_Form;
			/*g_objMorSent.m_cDictAspect=Pre_Tense;
			g_objMorSent.m_cDictAspect=Simple_Aspect;
			g_objMorSent.m_cMood=Imperative_Mood;*/
		}
		else if(strcmp(Word,"can't")==0 || strcmp(Word,"Can't")==0)
		{	//can't
			pDictNode1 = g_objLexSearch.SearchWord("can",nSearchMod);
			pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
			pDictNode1->m_pNextWordNode = pDictNode2;
			pDictNode2->m_pPrevWordNode = pDictNode1;
			pDictNode1->m_byDictForm = Orig_Form;
			pDictNode2->m_byDictForm = Orig_Form;
			//g_objMorSent.m_cDictNegative=Negative;
		}
		else if(strcmp(Word,"won't")==0 || strcmp(Word,"Won't")==0)
		{	//won't
			pDictNode1 = g_objLexSearch.SearchWord("will",nSearchMod);
			pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
			pDictNode1->m_pNextWordNode = pDictNode2;
			pDictNode2->m_pPrevWordNode = pDictNode1;
			pDictNode1->m_byDictForm = Orig_Form;
			pDictNode2->m_byDictForm = Orig_Form;
			//g_objMorSent.m_cDictAspect=Future_Tense;
			//g_objMorSent.m_cDictAspect=Simple_Aspect;
			//g_objMorSent.m_cDictNegative=Negative;
		}
		else if(strcmp(Word,"I'm")==0 )
		{	//I'm
			pDictNode1 = g_objLexSearch.SearchWord("I",nSearchMod);
			ASSERT(pDictNode1 != NULL);
			pDictNode2 = g_objLexSearch.SearchWord("am",nSearchMod);
			//pDictNode2->m_pszOrig = new char[3];
			pDictNode2->m_pszOrig= Mystrcpy(pDictNode2,"be",2);
			pDictNode1->m_pNextWordNode = pDictNode2;
			pDictNode2->m_pPrevWordNode = pDictNode1;
			pDictNode1->m_byDictForm = Orig_Form;
			pDictNode2->m_byDictForm = Orig_Form;
			/*g_objMorSent.m_cDictAspect=Pre_Tense;
			g_objMorSent.m_cDictAspect=Simple_Aspect;
			g_objMorSent.m_byDictPerson=First_Person;
			g_objMorSent.m_byDictNumber=Sing_Number;	*/
		}
		else
		{
			strcpy(tail,p+1);
			p[0]='\0';
			strcpy(head,Word);
			if( tail[0] == '\0')
			{	//Ws'
				if(head[p-Word-1]=='s')
				{
					head[p-Word-1] = '\0';
					if((pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod))!=NULL)
					{
						pDictNode1->m_pszEnglish = Mystrcpy(pDictNode1,inputword,1);
						head[p-Word-1]=='\0';
						//pDictNode1->m_pszOrig = new char[strlen(head)+1];
						pDictNode1->m_pszOrig = Mystrcpy(pDictNode1,head,2);
						pDictNode1->m_byDictGenetive = Have_Genetive;
						Mystrcpy(pDictNode1,"ns",3);
						pDictNode1->m_byDictNumber = Multi_Number;
						pDictNode1->m_byDictForm = Orig_Form;
					}
					else
						return	CreateNewWord(inputword);
				}
			}
			else if(strcmp(tail,"t")==0)
			{	//n't
				if(Word[WordLen-3] == 'n')
				{
					Word[WordLen-3] = '\0';
					pDictNode1 = WordRestore(Word,SEARCH_FIRSTCH);
					if(pDictNode1 != NULL)
					{
						//pDictNode1->m_cDictNegative = Negative;
						pDictNode2 = g_objLexSearch.SearchWord("not",nSearchMod);
						pDictNode1->m_pNextWordNode = pDictNode2;
						pDictNode2->m_pPrevWordNode = pDictNode1;
		
						return	pDictNode1;
					}
				}
			}
			else if(strcmp(tail,"s")==0)
			{	//W's
				if( strcmp(head,"it")==0   || strcmp(head,"It")==0    ||
					strcmp(head,"that")==0 || strcmp(head,"That")==0  ||
					strcmp(head,"this")==0 || strcmp(head,"This")==0  ||
					strcmp(head,"there")==0|| strcmp(head,"There")==0 ||
					strcmp(head,"here")==0|| strcmp(head,"Here")==0 ||
					strcmp(head,"what")==0 || strcmp(head,"What")==0  ||
					strcmp(head,"where")==0|| strcmp(head,"Where")==0)
				{
					pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
					pDictNode1->m_byDictForm = Orig_Form;
					ASSERT(pDictNode1 != NULL);
					pDictNode2 = g_objLexSearch.SearchWord("is",nSearchMod);
					//pDictNode2->m_pszOrig = new char[3];
					pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
					pDictNode1->m_byDictForm = Orig_Form;
					pDictNode1->m_byDictNumber = Sing_Number;
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;

				}
				else if(strcmp(head,"he")==0 ||strcmp(head,"He")==0 ||
					strcmp(head,"she")==0 || strcmp(head,"She")==0  )
				{
					pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
					ASSERT(pDictNode1 != NULL);

⌨️ 快捷键说明

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