📄 diction.h
字号:
#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 + -