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

📄 tense.cpp

📁 计算机英汉机器翻译系统中的英语词性标注方法实现
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	
#include "stdafx.h"
#include "PosTag.h"
#include "ChildFrm.h"
#include "mainstru.h"

#ifndef	_LXH_H
#include "lxh.h"
#endif

#ifndef DICTDEF_H 
#include "dictdef.h"
#endif
#define	Cate_v	Cate_END+100

/*
	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_byDictPerson;			//1:第一人称,2:第二人称,3:第三人称
	BYTE	m_byDictNumber;			//0:单数,1:复数
*/																	
extern	char * Mystrcpy(DictNode *pDictNode,char *Word,int Option);
//DictNode *CombineNodes(DictNode *Begin,DictNode *End,DictNode *Center);
DictNode *HaveWord(struct DictNode *begin, char *word,	int	form);
#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
int	MorphorAnalyze(char	*sen);
DictNode* WordRestore(char *inputword, int nSearchMod);
BOOL	SearchCate(DictNode *pDictNode,int	Cate);

void	DictWordInit(DictNode* pDictNode);	//called by Caim

//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 *HaveWord(struct DictNode *begin, char *word,	int	form)
{	// 在句子第begin个词是否为具有形态form的单词word,,失败返回-1,
	
	if(begin == NULL)
		return	NULL;
	if(word==NULL)           
	{
		if(begin->m_byDictForm==form || 
		((form==Ed1_Form || form ==Ed2_Form)&& begin->m_byDictForm==Ed1_2_Form))
			return	begin;
	}
	else if(form!=-1)	//查特定形态的词
	{
		if((begin->m_byDictForm==form ||
		((form==Ed1_Form || form ==Ed2_Form)&& begin->m_byDictForm==Ed1_2_Form)) &&
		strcmp(begin->m_pszEnglish,word)==0)
			return	begin;
	}
	else //form=-1		//查特定的词,形态任意
	{
		if((begin->m_pszOrig != NULL && strcmp(begin->m_pszOrig,word)==0) ||
		(begin->m_pszEnglish != NULL && strcmp(begin->m_pszEnglish,word)==0))
			return	begin;
	}
	return	NULL;
}
/*
BOOL	CompareWord(struct DictNode *Node,char	*word)
{
	// 句子第pos个词是否等于单词word
	if(Node==NULL)
		return	FALSE;
	return( !strcmp(Node->m_pszEnglish,word));
}

BOOL	CompareForm(struct DictNode *Node,int	form)
{	// 句子第pos个词是否为词形form
	if(Node==NULL)
		return	FALSE;
	if(Node->m_byDictForm==form || 
		((form==Ed1_Form || form ==Ed2_Form)&& Node->m_byDictForm==Ed1_2_Form))
		return	TRUE;
	else
		return	FALSE;
}


void	SetDefTense()
{
	g_objMorSent.m_cTense=Pre_Tense;	//default value
	g_objMorSent.m_cAspect=Simple_Aspect;
	g_objMorSent.m_cMood =Declarative_Mood;
	g_objMorSent.m_cVoice = Active_Voice;
	g_objMorSent.m_cNegative=Positive;
	g_objMorSent.m_byPerson=Third_Person;
	g_objMorSent.m_byNumber=Sing_Number;	//default value
}

DictNode *CombineNodes(DictNode *Begin,DictNode *End,DictNode *Center)
{
	DictNode * TobeDelete, *PrevNode, *NextNode;
	char	Phrase[150],PhraseOrig[150];
	Center->m_byDictForm	= Begin->m_byDictForm	;
	Center->m_byDictGenetive= Begin->m_byDictGenetive;
	Center->m_cDictTense	= Begin->m_cDictTense	;
	Center->m_cDictAspect	= Begin->m_cDictAspect	;
	Center->m_cDictVoice	= Begin->m_cDictVoice	;
	Center->m_cDictNegative	= Begin->m_cDictNegative;
	Center->m_byDictPerson	= Begin->m_byDictPerson	;
	Center->m_byDictNumber	= Begin->m_byDictNumber	;
	
	//cdq changed 12.10
	if ( strcmp(Begin->m_pszOrig,"have")==0 &&
		strcmp(End->m_pszEnglish,"been")==0 )
	{
		Mystrcpy(Center,"@Cate=be",3);
	}
	else
	{
		Mystrcpy(Center,"@Cate=v",3);
	}

	PrevNode = Begin->m_pPrevWordNode;
	NextNode = End->m_pNextWordNode;
	strcpy(Phrase,"\0");
	strcpy(PhraseOrig,"\0");
	while(Begin != End && Begin!=NULL)
	{
		TobeDelete = Begin;
		strcat(Phrase,Begin->m_pszEnglish);
		strcat(Phrase," ");
		strcat(PhraseOrig,Begin->m_pszOrig);
		strcat(PhraseOrig," ");
		
		Begin = Begin->m_pNextWordNode;
		if(TobeDelete != Center)
			g_objLexSearch.FreeNode(TobeDelete);
	}
	strcat(Phrase,End->m_pszEnglish);
	strcat(PhraseOrig,End->m_pszOrig);
	Mystrcpy(Center,Phrase,1);
	Mystrcpy(Center,PhraseOrig,2);
	if(End != Center)
		g_objLexSearch.FreeNode(End);
	Center->m_pPrevWordNode	= PrevNode;
	Center->m_pNextWordNode = NextNode;
	if(PrevNode != NULL)
		PrevNode->m_pNextWordNode = Center;
	if(NextNode != NULL)
		NextNode->m_pPrevWordNode = Center;

	return	Center;
}

DictNode *TenseAnalyse(DictNode *pDict)
{
	//int	CurPosOuter,CurPosMiddle,CurPosInner;
	struct DictNode *CurPosOuter,*CurPosMiddle,*end;
	if((CurPosOuter=HaveWord(pDict,"be",-1))!=NULL)	
	{	//is, am, are, was,were
		if(CompareForm(CurPosOuter,Ed1_Form))	//was,were
		{
			pDict->m_cDictTense=Past_Tense;
			if(CompareWord(CurPosOuter,"was"))	//was
			{
				pDict->m_byDictPerson=Third_Person;
				pDict->m_byDictNumber=Sing_Number;
			}
			else	//were
			{
				pDict->m_byDictNumber=Multi_Number;
			}
		}
		else if(CompareForm(CurPosOuter,Ed2_Form))	//been
			return	pDict;
		else 
		{
			if(CompareWord(CurPosOuter,"is"))	//is
			{
				pDict->m_byDictPerson=Third_Person;
				pDict->m_byDictNumber=Sing_Number;
			}
			else if(CompareWord(CurPosOuter,"am"))	//am
			{
				pDict->m_byDictPerson=First_Person;
				pDict->m_byDictNumber=Sing_Number;
			}
			else if(CompareWord(CurPosOuter,"are"))	//are
			{
				pDict->m_byDictNumber=Multi_Number;
			}
		}
		if(CompareWord(CurPosOuter->m_pNextWordNode,"not"))	//negative
		{

			pDict->m_cDictNegative=Negative;
			CurPosOuter = CurPosOuter->m_pNextWordNode;
		}
		if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ed2_Form))!=NULL)	//ed2
		{
			pDict->m_cDictVoice = Passive_Voice;
			pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
			return	pDict;		//state = 2 or 6, 一般现在(过去)被动
		}
		else if(CompareWord(CurPosOuter->m_pNextWordNode,"being"))//being  //cdq changed 12.22
		{
			end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
			if((HaveWord(end,NULL,Ed2_Form))!=NULL)	//ed2
			{
				pDict->m_cDictAspect=Progressive_Aspect;
				pDict->m_cDictVoice = Passive_Voice;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;		//state = 4 or 8	现在(过去)进行时,被动
			}
		}
		else if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ing_Form))!=NULL)//ing
		{
			pDict->m_cDictAspect=Progressive_Aspect;
			pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
			return	pDict;		//state = 3 or 7 现在(过去)进行
		}
	}
	else if((CurPosOuter=HaveWord(pDict,"have",-1))!=NULL)	//have,has,had
	{
		if(CompareForm(CurPosOuter,Ed1_2_Form))	//had
			pDict->m_cDictTense=Past_Tense;
		else
		{
			pDict->m_cDictTense=Pre_Tense;
			if(CompareWord(CurPosOuter,"has"))	//has
			{
				pDict->m_byDictPerson=Third_Person;
				pDict->m_byDictNumber=Sing_Number;
			}
			else	//have
			{
				pDict->m_byDictNumber=Multi_Number;
			}
		}
		if(CompareWord(CurPosOuter->m_pNextWordNode,"not"))	//negative
		{
			pDict->m_cDictNegative=Negative;
			CurPosOuter = CurPosOuter->m_pNextWordNode;
		}
		if(CompareWord(CurPosOuter->m_pNextWordNode,"been"))//been
		{
			end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;
			if(CompareForm(end,Ed2_Form))//ed2
			{
				pDict->m_cDictAspect =Perfect_Aspect;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;		//state = 12 or 13 现在(过去)完成时,被动
			}
			else
			if(CompareForm(end,Ing_Form))//ing
			{
				pDict->m_cDictAspect =PerfectProgressive_Aspect;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;		//state = 14 or 15 现在(过去)完成进行时
			}
			//cdq changed
			/*
			else
			if(CompareWord(end,"to"))
			{
					DictNode* pDictNode;
					int	i;
					pDictNode = new DictNode;
					i = strlen("been to");
					pDictNode->m_nLxhCate = NULL;

					pDictNode->m_pszEnglish = new char[i+1];
					pDictNode->m_pszOrig = new char[i+1]; 
					
					strcpy(pDictNode->m_pszEnglish,"been to");
					strcpy(pDictNode->m_pszOrig,"been to");
					pDictNode->m_byDictForm = STYLE_ORIG;
					pDictNode->m_byDictNumber = Sing_Number;
					pDictNode->m_byMaxPhraseLen = DefaMaxPhraseLen;
					pDictNode->m_pNextWordNode = end->m_pNextWordNode;
					pDictNode->m_pPrevWordNode = CurPosOuter;

					pDictNode->m_nEnglishLen = i;
					pDictNode->m_bIsExistOrig = TRUE;
					pDictNode->m_nOrigLen = i;
					pDictNode->m_nWordStyle = 0;
					pDictNode->m_bIsExistAmbig = 0;
					pDictNode->m_pszAmbig = NULL;
					pDictNode->m_nAmbigLen = 0;
					pDictNode->m_nChinNum = 1;
					pDictNode->m_pFirstChin = new DictChin;

					pDictNode->m_pFirstChin->m_pszChinese=new char[6];
					strcpy(pDictNode->m_pFirstChin->m_pszChinese,"去过");
					pDictNode->m_pFirstChin->m_nChineseLen=
							strlen(pDictNode->m_pFirstChin->m_pszChinese);
					pDictNode->m_pFirstChin->m_nCate=Cate_vt;

					end=pDictNode;
					CurPosOuter->m_pNextWordNode=end;
					CurPosOuter->m_pNextWordNode->m_pNextWordNode->m_pPrevWordNode=end;


				pDict->m_cDictAspect =PerfectProgressive_Aspect;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;
			}
			*/
/*			else
			{
				pDict->m_cDictAspect =Perfect_Aspect;
				end =CurPosOuter->m_pNextWordNode;
				pDict = CombineNodes(pDict,end,end);
				return	pDict;		//state = 10 or 11	现在(过去)完成时
			}
		}
		else if((CurPosMiddle=HaveWord(CurPosOuter->m_pNextWordNode,NULL,Ed2_Form))!=NULL)	//ed2
		{
			pDict->m_cDictAspect =Perfect_Aspect;
			pDict = CombineNodes(pDict,CurPosMiddle,CurPosMiddle);
			return	pDict;		//state = 10 or 11	现在(过去)完成时
		}
		
	}
	else if((CurPosOuter=HaveWord(pDict,"will",-1))!=NULL)	//will,would
	{
		if(CompareForm(CurPosOuter,Ed1_Form))
			pDict->m_cDictTense=Pastfuture_Tense;
		else
			pDict->m_cDictTense=Future_Tense;
		if(CompareWord(CurPosOuter->m_pNextWordNode,"not"))	//negative
		{
			pDict->m_cDictNegative=Negative;
			CurPosOuter = CurPosOuter->m_pNextWordNode;
		}
		if(CompareWord(CurPosOuter->m_pNextWordNode,"be"))	//be
		{
			end = CurPosOuter->m_pNextWordNode->m_pNextWordNode;

⌨️ 快捷键说明

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