?? 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 + -