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

📄 wordres.cpp

📁 计算机英汉机器翻译系统中的英语词性标注方法实现
💻 CPP
📖 第 1 页 / 共 4 页
字号:

//蔡的程序中,要改动的函数: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:复数
*/																	
#include "StdAfx.h"
//#include "MAINSTRU.H"
//#include "lxh.h"
//Xuned Change Begin
#include "dictdef.h"
#include "Diction.h"
#define	Tail_s	1
#define	Tail_d	2
#define	Tail_re	3
#define	Tail_ll	4
#define	Tail_ve	5
#define	Tail_m	6
#define	Tail_t	7
//Xuned Change End


#define	MaxWordNo	150
#define	MaxWordLength	200//xuned change
#define	TooManyWords	-1
#define	WordIsTooLong	-2
#define	SenIsOK		1
#define	Orig_Form	STYLE_ORIG
#define	Ed1_Form	STYLE_ED1
#define	Ed2_Form	STYLE_ED2
#define	Ing_Form	STYLE_ING
#define	S_Form		STYLE_S
#define	Ed1_2_Form	STYLE_ED
#define	Ing_Form		STYLE_ING
#define	Er_Form			906
#define	Est_Form		907
#define	Is_Has_Form		908	//'s 可能是is, 也可能是has
#define	Would_had_Form	909		//'s 可能是would, 也可能是had
#define	Unknown_Form	910
#define	Number_Form		911

#define	Sing_Number		0
#define	Multi_Number	1

#define	Pre_Tense		0
#define	Past_Tense		1
#define	Future_Tense	2
#define	Pastfuture_Tense	3

#define	Simple_Aspect		0
#define	Progressive_Aspect	1
#define	Perfect_Aspect		2
#define	PerfectProgressive_Aspect		3

#define	Declarative_Mood	0
#define	General_Question_Mood	1
#define	Special_Question_Mood	2
#define	Exclaim_Mood		3
#define	Imperative_Mood		4

#define	Active_Voice		0
#define	Passive_Voice		1

#define	Positive		0
#define	Negative		1

#define	First_Person	1
#define	Second_Person	2
#define	Third_Person	3
#define	No_Genetive		0
#define	Have_Genetive	1


//extern DictSearch g_objLexSearch;
//LookUp的返回信息尚未利用
//BTNode的m_pszAmbig属性不需从词典中读的未写,
SentenceType	g_objMorSent;
char * Mystrcpy(DictNode *pDictNode,char *Word,int Option);
void	ModifyPreWord();
DictNode* CreateNewWord(char * Word);
DictNode* CreateComposeWord(DictNode *pDictNode2,
							DictNode *pDictNode3,
							char * ComposeWord); // cdq add
DictNode* CreateOrdinalWord(DictNode *pDictNode2,char *Word);// cdq add
DictNode* WordRestore(char *inputword, int nSearchMod);
BOOL	SearchCate(DictNode *pDictNode,int	Cate);

void	DictWordInit(DictNode* pDictNode);	//called by Caim
int	MorphorAnalyze(char	*sen);//?int
//void	PhraseCombine();
BOOL	IsDigitalWord(char	*Word,int WordLen);
void	FreeSentence(SentenceType * Sen);
void	SearchLxh();
void	OutputDictInformation(DictNode	* pDict, FILE *fpres);
extern	void	SetDefTense();

#define	Cate_v	Cate_END+100
BOOL bNoTranCapStr=TRUE;

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_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,"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);
					pDictNode2 = g_objLexSearch.SearchWord("is",nSearchMod);
					//pDictNode2->m_pszOrig = new char[3];
					pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;
				    pDictNode2->m_byDictForm = Is_Has_Form;
					pDictNode2->m_byDictNumber = Sing_Number;
				}
				else
				{   //Word's
					if((pDictNode1 =g_objLexSearch.SearchWord(head,nSearchMod)) != NULL)
					{
						pDictNode1->m_byDictGenetive = Have_Genetive;
						Mystrcpy(pDictNode1,"ns",3);
						pDictNode1->m_byDictNumber = Sing_Number;
						Mystrcpy(pDictNode1,inputword,1);
					}
					else
						return	CreateNewWord(inputword);
				}
				
			}
			else if(strcmp(tail,"ve")==0)
			{	//W've
				pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
				if(pDictNode1 != NULL)
				{
					pDictNode2 = g_objLexSearch.SearchWord("have",nSearchMod);
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;
					pDictNode2->m_byDictNumber=Multi_Number;
				}
				else
					return	CreateNewWord(inputword);
			}
			else if(strcmp(tail,"ll")==0)
			{	//W'll
				pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
				if(pDictNode1 != NULL)
				{
					pDictNode2 = g_objLexSearch.SearchWord("will",nSearchMod);
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;
				}
				else
					return	CreateNewWord(inputword);
			}
			else if(strcmp(tail,"re")==0)
			{	//W're
				pDictNode1 = g_objLexSearch.SearchWord(head,nSearchMod);
				if(pDictNode1 != NULL)
				{
					pDictNode2 = g_objLexSearch.SearchWord("are",nSearchMod);
					pDictNode2->m_pszOrig = Mystrcpy(pDictNode2,"be",2);
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;
				}
				else
					return	CreateNewWord(inputword);
			}
			else if(strcmp(tail,"d")==0)
			{	//W'd
				if((pDictNode1=g_objLexSearch.SearchWord(head,nSearchMod)) != NULL)
				{                                        
					pDictNode2 = g_objLexSearch.SearchWord("would",nSearchMod);
					pDictNode1->m_pNextWordNode = pDictNode2;
					pDictNode2->m_pPrevWordNode = pDictNode1;
					pDictNode2->m_byDictForm = Would_had_Form;
		
				}
				else
					return	CreateNewWord(inputword);
			}
			else
				return	CreateNewWord(inputword);
		}

⌨️ 快捷键说明

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