中文信息处理中一个基础问题就是分词以及分词歧义消除问题。本文介绍一中最大概率分词法的C++实现问题。
在这一部分中先给出我的词典处理算法,最大概率分词法将在以后的博客中给出。
首先是构造一个分词词典类,我们的分词匹配算法都要利用分词词典提供的数据来进行:
class CWordSegDictionary
{
CDaoDatabase* pDatabase;
CDaoRecordset *pWords, *pTags; //指向词表和词性标记集的指针
CDaoTableDef *pWordsDef, *pTagsDef; //词表和词性表结构指针
public:
CWordSegDictionary(){}
~CWordsegDictionary()
{
if(pWords){
pWords->Colse();
delete pWords;
}
if(pTags){
pTags->Close();
delete pTags;
}
if(pWordsDef){
pWordsDef->Close();
delete pWordsDef;
}
if(pTagsDef) {
pTagsDef->Close();
delete pTagsDef;
}
if(pDatabase) {
pDatabase->Close();
delete pDatabase;
AfxDaoTerm();
}
myDatabaseName = "";
};
CString myDatabaseName; // 数据库文件名
BOOL OpenMDB(); //打开数据库,表结构和记录集
BOOL CloseMDB(); //关闭数据库,表结构和记录集,释放个指针申请的内存
long GetWordID(CString w); // 获取词语的代号
long GetFreq(CString w); // 获取词语的频度值
long GetFreq(CString w, CString t); // 获取词语在一定词性下的频度值
long GetFreq(CString w, CObArray& a); // 获取词语在任意词性下的频度值
long Insert(CString w, long freq=1); // 插入词频信息,包括新词的频度值信息
long Insert(CString w, CString t, long freq=1); // 插入词语,词性标记,词频信息
CString GetTagOfWord(CString w); // 新增成员函数:获取词语的词性标记
};
接下来定义我们的词典处理类
class CWordTagSet : public CDaoRecordset
{
public:
CWordTagSet(CDaoDatabase *pDatabase = NULL);
int GetFreq(CString w, CString t);
int GetFreqs(CString w, CObArrary &a);
CString m_szWordParam; //词性参数
CString m_szTagParam; //词性标记参数
long m