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

📄 diction.h

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

#ifndef PHRASE_H
#define PHRASE_H

#include "isammgr.h"
#include "DictMent.h"
#include "Huffman.h"

const int MAX_FILENAME_LEN = 100;
const int MAX_DICTLINE_LEN = 300;

const int DIC_WORD_LEN = 26; // 关键字的最大长度

const int DIC_OFFSET_LEN = 6; // 词条的内容保存的位置

const WORD RULE_CODE = 0xffff; // 词典中规则编码的保存标志
const WORD ADDQUALFR = 0xfffe; // 词典中量词编码的保存标志

const int SEARCH_ALLSAME = 0; // 严格匹配,查不到返回
const int SEARCH_FIRSTCH = 1; // 查不到,将第一个字母变成小写再查
const int SEARCH_ALLCH   = 2; // 查不到,将全部字母变成小写再查
 
// DTA文件中每个记录的长度
const int DIC_DTA_ITEM_LEN = DIC_OFFSET_LEN;

//yys 98.7.22 Bgn
const int SYSDICT = 1;		//系统词典代码
const int ADDTIONDICT = 2;		//附加词典代码
const int USERDICT = 3;		//用户词典代码
//yys 98.7.22 End

class SlotDecode {
public:
	SlotDecode();
	~SlotDecode();
	BOOL Init(LPSTR pszCodeTableName);
	void FreeMap(CMapStringToOb &mapName);
	void Exit();

	CStringArray m_astrCodeTable;
	CMapStringToOb m_mapCodeTable;

	int m_nTableSize;
	BOOL Decode(WORD wCode,CString &strOrigin);
	WORD EnCode(LPCSTR pszSlot);
};

class Dictionary : public IsamMgr
{
protected:

	virtual void read_data(void *block);
	virtual void write_data(void *block);
	virtual void fill_buffer(int idxno, long recno);
public:
	char *GetKeyWord() {
		return ifile[curidx]->GetNode()->get_cur_item(m_pszWord);
	}

	//Dictionary(int isMode = moOpen);
	Dictionary(char *dfname, char *ifname, int isMode = moOpen);
	~Dictionary(void) { delete idxfname; }
	void clear_buf(void);
	int GetKeyWordLen();

	char m_pszWord[DIC_WORD_LEN];
	char m_pszOffset[DIC_OFFSET_LEN];
};

// 说明:
// 编码后的词典的存储格式:
// 在IDX文件中存放英文单词,以HUFFMAN压缩,压缩后的最大长度为DIC_WORD_LEN,
// 超过这个长度的单词将被忽略,不加入到目标词典中
// 在DTA文件中保存的是:
//   m_pszOffset 上面是单词的译文及其他信息保存在
// DAT文件中的偏移位置
// DAT每个字段的文件结构:
// 最初的两个字节保存上面提到的余下部分的长度,
// 后面紧跟余下部分

// 单词的译文及其他信息的保存格式:
// 标志:
// 是否存在原形 ( 1 Byte )	m_bIsExistOrig
// 词的类型:过去式,进行式...(1 Byte) m_nWordStyle
// 原形长度 ( 1 Byte )
// 是否存在兼类(1Byte)
// 兼类的类型(1Byte)

const int DICT_FLAG_ORIGIN = 0; // 原形
const int DICT_FLAG_AMBIG = 1; // 兼类
const int DICT_FLAG_CHINESE = 2; // 中文部分

////////////////////////////////////////////////
//                                            //
//  			保存格式说明				  //
//											  //
////////////////////////////////////////////////
/*
typedef struct DictRecord{
	UCHAR m_byMaxPhraseLen;	//如果 m_pszEnglish为一个单词,记录短语第一个为该词的短语最大长度
	BOOL m_bIsExistOrig;// 是否存在原形 ( 1 Byte )
	BOOL m_bIsExistAmbig; // 是否存在兼类
	// 下面紧跟一个标志和标志相关的其他内容,参考下面说明
	// 原形的存储
	BYTE m_cFlag = DICT_FLAG_ORIGIN; // 紧接后面存储内容的标志
	BYTE m_cWordStyle;// 词的类型:过去式,进行式...(1 Byte) m_nWordStyle
	BYTE m_cOrigLen; // 原形长度 ( 1 Byte )
	LPSTR m_pszOrig; // 原形

	// 兼类的存储
	BYTE m_cFlag = DICT_FLAG_AMBIG; // 紧接后面存储内容的标志
	BYTE m_cAmbigLen; // 兼类长度
	LPSTR m_pszAmbig; // 兼类内容

	// 中文译文和相关信息的存储
	BYTE m_cFlag = DICT_FLAG_CHINESE; // 紧接后面存储内容的标志
	BYTE m_cChinPartNum; // 中文译文的个数
	// 后面依次保存每个中文译文及相关内容,对于每个译文,保存方式如下:
	BYTE m_cChineseLen; //中文译文长度
	LPSTR m_pszChinese; // 中文译文
	BYTE m_cCate; // 词性
	BYTE m_cHead; // 语义大类
	BYTE m_cSlotNum; // 槽的数量,将规则和量词也计算在内
	
	// 下面依次保存各个槽的信息
	WORD m_wSlotName&Value; // 槽名和槽值的统一编码值
	如果m_wSlotName&Value的值是RULE_CODE或ADDQUALFR,则不是下面内容为规则
	或量词,保存格式为:
	offset 0: 长度
	offset 1 - 上面长度: 规则或量词的内容
} DictRecord;
*/
const int MAX_RECORD_LEN = 2000;

typedef struct tagDictHeader{
	char szMagic[150];
	char szReserved[50];
	int nTotalRuleNum;

	int nHashTableOffset;
	int nHashTableSize;
} DictHeader;

const char szDictDataMagic[] = "WebTran Dict Data File.Designed by Cai Meng e-mail:caim@mtlab.hit.edu.cn        ";
const int BYTES_BIT_NUM = 8;

class CDictIndex {
public:
	CDictIndex();
	~CDictIndex();
	LPSTR m_pszWordInfoBuff;
	int m_nWordInfoBuffSize;

protected:
	CMapStringToOb m_mapCate; // Cate 的种类
	CMapStringToOb m_mapHead; // Head 的种类
	CMapStringToOb m_mapAmbig; // 兼类的种类
	CMapStringToOb m_mapNoValueSlot; // 没有槽值的槽的种类
	
	int m_nSlotNameNum; // 槽名的数量
	CStringArray m_arraySlotName; // 槽名的种类
	CMapStringToOb m_mapSlotName; // 槽名的种类
	CMapStringToOb m_mapSlotValue[100]; // 槽值
	int m_nDefineValue;
	char m_szSegmentName[50];
	int m_nQualfrCode; // 量词的编码

public:
	int m_nTotalWordsNum; // 索引中的词条总数

	BOOL FillMap(CMapStringToOb &mapName,FILE *fpInDefine,
					FILE *fpOutDefine,FILE *fpCodeTable,BOOL bWrtSegName);
	BOOL FillMapWithArray(CMapStringToOb &mapName,
								CStringArray &arrayName,
								int &nNameNum,FILE *fpInDefine,
								FILE *fpOutDefine);
	BOOL BuildIndexInit(LPSTR pszDefineName,LPSTR pszOutDefineName,
						LPSTR pszCodeTable);
	void FreeMap(CMapStringToOb &mapName);
	void BuildIndexExitInit();

	int EncodeSingleSlot(Slot *pSlot,LPSTR pszSingleSlot);
	int EncodeSlotLink(Slot *pFirstSlot,LPSTR pszSlotLink);
	int CalculateSlotNum(Slot *pFirstSlot);
	int EncodeSingleChinesePart(ChinesePart *pCurrChinese,
							LPSTR pszSinglePartInfo);
	int EncodeChinesePartInfo(COneWord *pOneWord,LPSTR pszChinesePartInfo);
	int CalcuChinPartNum(ChinesePart *pFirstChinese);
	int EncodeDictRecord(COneWord *pOneWord,LPSTR pszWordInfo);
	BOOL InsertOneWordToIndex(Dictionary *pobDiction,
									  FILE *fpIndexDat,
									  CHuffman *pHuffman,
									  COneWord *pOneWord);
	BOOL OutputOneWordToTempDatFile(FILE *fpEnglishInfo,
									FILE *fpTranDat,
									COneWord *pOneWord);

	BOOL SearchInit();
};

typedef struct DictChin {
	LPSTR m_pszChinese; // 中文译文
	int m_nChineseLen; // 中文译文长度
	int m_nCate; // 词性
	int m_nHead; // 语义大类
	
	int m_nSlotNum;
	LPWORD m_pwSlotLink;
	DictChin *m_pNextChin;

	LPSTR m_pszQualfr; // 量词
	int m_nQualfrLen;
	LPSTR m_pszDicRule;//规则
	// 规则格式:(根据xuned于1997.10.25的要求)
	//规则个数(1 byte),规则左部的长度(1 byte),规则左部,
	//规则右部的长度(1 byte),规则右部,
	int m_nDicRule; // 规则信息的长度
	//XUNED ADD END
	DictChin();
	~DictChin();
	//XUNED ADD END
} DictChin;

typedef struct DictNode {
	LPSTR m_pszEnglish; // 英文
	int m_nEnglishLen; //  英文长度
	BOOL m_bIsExistOrig; // 是否存在原形
	LPSTR m_pszOrig; // 原形,必须申请空间
	int m_nOrigLen;
	int m_nWordStyle; // 词的类型:过去式,进行式,
	BOOL m_bIsExistAmbig; // 是否存在兼类
	LPSTR m_pszAmbig; // 兼类内容
	int m_nAmbigLen;

⌨️ 快捷键说明

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