搜狗细胞词库处理代码(可用于scel转txt)

搜狗细胞词库处理代码(可用于scel转txt)

2010-07-05 18:46

http://hi.baidu.com/guangbinw/blog/item/86d61009de07f28fd0581b11.html

今天先贴个简单代码,稍后再详细叙述…… 

基于QT实现,主要是考虑Unicode字符处理的方便,

可以稍加处理用于C或C++语言。

 

// 取连续两字节,转换为short类型的值,字节顺序是低字节-高字节

inline unsigned short GetUShort(QByteArray &fData, int startPos)

{

unsigned char low = fData.at(startPos);

unsigned char high = fData.at(startPos + 1);

unsigned short st = low + (high * 256);

 

return st;

}

 

//把 Unicode编码的值转换为字符串

inline QString GetStrvalue(QByteArray &fData, int startPos, int len)

{

QString temp;

 

for (int i = 0 ;i < len ; i+=2)

{

unsigned short st = GetUShort(fData,startPos + i);

QChar ch = QChar(st);

 

temp.append(ch);

if (st == 0)

{

break;

}

}

 

return temp;

}

 

//临时保存结果

class CHanzi

{

public:

void SetPy(QByteArray &py)

{

m_py = py;

}

 

void SetHz(QByteArray &hz)

{

m_hz = GetStrvalue(hz,0,hz.size());

}

 

void Debug()

{

QString py = "";

 

for (int i = 0 ; i < m_py.length() ; i += 2)

{

py += pyList.at(GetUShort(m_py,i));

}

 

qDebug() << m_hz << ":" << py;

}

 

private:

QByteArray m_py;

QString m_hz;

};

 

//1、读取拼音表

inline void ReadPyTable(QByteArray &fData,QList<QString> &pyList)

{

int startPos = 0x1540;

 

QByteArray fFlag = fData.mid(startPos,4);

if( fData.data() == "/x9D/x01/x00/x00")

{

qDebug() << "读取词库拼音表失败!";

return;

}

 

int pos = 4;

while (true)

{

//取bit的索引号,用于表示一个拼音信息

unsigned short n = GetUShort(fData,startPos + pos);

pos += 2;

 

//取bit的拼音长度,字母数的倍

unsigned short len = GetUShort(fData,startPos + pos);

pos += 2;

 

//每个字母占bit,Unicode编码

QString py = GetStrvalue(fData,startPos + pos,len);

qDebug() << n << ":" << py;

pyList.push_back(py);

pos += len;

 

//zuo是最后一个拼音,处理完成

if (py == "zuo" || pos + startPos >= fData.length())

{

break;

}

}

}

 

//2、读取汉字表

inline void ReadHzTable(QByteArray &fData,QList<CHanzi> &hzList)

{

int startPos = 0x2628;

int pos = 0;

 

while (true)

{

//偏移加权,16bit,用于计算下一记录的位置

unsigned short offset = GetUShort(fData,startPos + pos) - 1;

pos += 2;

 

//拼音长度,16bit,每个拼音用一个bit的short表示,其值是拼音表的索引号

unsigned short len1 = GetUShort(fData,startPos + pos);

pos += 2;

 

CHanzi hanzi;

//取拼音索引信息

hanzi.SetPy(fData.mid(startPos + pos,len1));

pos += len1;

 

//索引之后是词组的长度,字节数,字数乘

unsigned short len2 = GetUShort(fData,startPos + pos);

pos += 2;

 

//Unicode编码,每个汉字bit

hanzi.SetHz(fData.mid(startPos + pos,len2));

hzList.push_back(hanzi);

pos += len2;

 

//到下个字的偏移位置,没有再细分析,可能是词频或者类似信息

pos += (12 + offset * (12 + len2 + 2));

if (pos + startPos >= fData.length())

{

break;

}

}

}

 

//3、读取名称、类别、信息、示例

inline void ReadFileInfo(QByteArray &fData)

{

QByteArray fFlag = fData.mid(0,8);

if(fFlag.data() == "/x40/x15/x00/x00/x44/x43/x53/x01")

{

qDebug() << "确认你选择的是搜狗(.scel)词库?";

return ;

}

 

QString strName;

strName = GetStrvalue(fData,0x130,128);

qDebug() << "词库名:" << strName;

 

strName = GetStrvalue(fData,0x338,128);

qDebug() << "词库类型:" << strName;

strName = GetStrvalue(fData,0x540,128);

qDebug() << "描述信息:" << strName;

strName = GetStrvalue(fData,0xd40,128);

qDebug() << "词库示例:" << strName;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值