📄 mainfrm.cpp
字号:
if(theClassifier.m_paramClassifier.m_nClassifierType==CClassifierParam::nCT_KNN)
id=theClassifier.KNNCategory(strFile.GetBuffer(0));
else if(theClassifier.m_paramClassifier.m_nClassifierType==CClassifierParam::nCT_SVM)
id=theClassifier.SVMCategory(strFile.GetBuffer(0));
else
{
CMessage::PrintError("分类器类型不正确!");
return;
}
CMessage::ClearInfo();
if(id>=0) theClassifier.m_lstTrainCatalogList.GetCataName(id,strFile);
else strFile="无法识别";
CMessage::PrintInfo("文档的类别为: "+strFile);
}
}
void CMainFrame::OnMainTest()
{
CTestParamsDlg testParamsDlg;
if(theClassifier.m_paramClassifier.m_strTestDir.IsEmpty())
theClassifier.m_paramClassifier.m_strTestDir=theApp.m_strPath+"\\sample\\test";
if(theClassifier.m_paramClassifier.m_strResultDir.IsEmpty())
theClassifier.m_paramClassifier.m_strResultDir=theClassifier.m_paramClassifier.m_txtResultDir;
if((theClassifier.m_paramClassifier.m_nClassifierType==CClassifierParam::nCT_SVM)||
(theClassifier.m_paramClassifier.m_dThreshold>0))
{
theClassifier.m_paramClassifier.m_nKNN=35;
theClassifier.m_paramClassifier.m_dThreshold=0;
}
testParamsDlg.m_strTestDir = theClassifier.m_paramClassifier.m_strTestDir;
testParamsDlg.m_strResultDir = theClassifier.m_paramClassifier.m_strResultDir;
testParamsDlg.m_nDocFormat = theClassifier.m_paramClassifier.m_nDocFormat;
testParamsDlg.m_dThreshold = theClassifier.m_paramClassifier.m_dThreshold;
testParamsDlg.m_nKNN = theClassifier.m_paramClassifier.m_nKNN;
testParamsDlg.m_nClassifyType = theClassifier.m_paramClassifier.m_nClassifyType;
testParamsDlg.m_bEvaluation = theClassifier.m_paramClassifier.m_bEvaluation;
testParamsDlg.m_bCopyFiles = theClassifier.m_paramClassifier.m_bCopyFiles;
testParamsDlg.SetClassifierType(theClassifier.m_paramClassifier.m_nClassifierType);
if(testParamsDlg.DoModal()==IDOK)
{
if((testParamsDlg.m_nDocFormat==CClassifierParam::nDF_Directory)&&
!CheckPath(testParamsDlg.m_strTestDir)) return;
if(!CheckPath(testParamsDlg.m_strResultDir,true)) return;
theClassifier.m_paramClassifier.m_strTestDir = testParamsDlg.m_strTestDir;
theClassifier.m_paramClassifier.m_strResultDir = testParamsDlg.m_strResultDir;
theClassifier.m_paramClassifier.m_nDocFormat = testParamsDlg.m_nDocFormat;
theClassifier.m_paramClassifier.m_dThreshold = testParamsDlg.m_dThreshold;
theClassifier.m_paramClassifier.m_nKNN = testParamsDlg.m_nKNN ;
theClassifier.m_paramClassifier.m_nClassifyType = testParamsDlg.m_nClassifyType;
theClassifier.m_paramClassifier.m_bEvaluation = testParamsDlg.m_bEvaluation;
theClassifier.m_paramClassifier.m_bCopyFiles = testParamsDlg.m_bCopyFiles;
Test();
}
}
void CMainFrame::StopComputation()
{
if((m_nRunning>=1)&&(m_pThread!=NULL))
{
if(TerminateThread(m_pThread->m_hThread,1))
{
CeaseComputation();
}
else
AfxMessageBox("无法停止计算过程!");
}
}
void CMainFrame::OnUpdateMainReadFeatures(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnUpdateMainTrainknn(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnUpdateMainTrainsvm(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnUpdateMainTest(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0&&!m_strModel.IsEmpty());
}
void CMainFrame::OnUpdateMainClassify(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0&&!m_strModel.IsEmpty());
}
void CMainFrame::OnUpdateMainClassifySinglefile(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0&&!m_strModel.IsEmpty());
}
void CMainFrame::OnUpdateMainResults(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0&&!m_strResultDir.IsEmpty());
}
void CMainFrame::OnUpdateMainOpenmodel(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnUpdateMainStoprunning(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning);
}
void CMainFrame::OnUpdateMainPause(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning&&!m_bPaused);
}
void CMainFrame::OnUpdateMainResume(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning&&m_bPaused);
}
void CMainFrame::OnUpdateToolsConvert(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnUpdateToolsResults(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nRunning<=0);
}
void CMainFrame::OnMainStoprunning()
{
if(AfxMessageBox("正在进行计算,真的要停止吗?",MB_YESNO)==IDYES)
StopComputation();
}
void CMainFrame::OnMainOpenmodel()
{
static char BASED_CODE szModelFilter[] = "Model Files (*.prj)|*.prj|All Files (*.*)|*.*||";
CFileDialog cfd(TRUE,szModelFilter,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szModelFilter,NULL);
if (cfd.DoModal()==IDOK)
{
m_strModel=cfd.GetPathName();
CMessage::ClearInfo();
if(!theClassifier.OpenModel(m_strModel)) m_strModel.Empty();
}
}
void CMainFrame::OnMainPause()
{
if(!m_bPaused)
{
m_pThread->SuspendThread();
m_wndStatusBar.SetPaneText(0,"运算被用户暂停了!");
m_bPaused=true;
}
}
void CMainFrame::OnMainResume()
{
if(m_bPaused)
{
m_pThread->ResumeThread();
m_wndStatusBar.SetPaneText(0,"恢复正常运算了!");
m_bPaused=false;
}
}
void CMainFrame::OnMainResults()
{
if(theClassifier.m_paramClassifier.m_bEvaluation)
theClassifier.Evaluate(theApp.m_strPath);
else
{
CMessage::ClearInfo();
CFile fin;
CString fname=theClassifier.m_paramClassifier.m_strResultDir+"\\results.txt";
if(!fin.Open(fname,CFile::modeRead))
{
CMessage::PrintError(_T("分类结果文件")+fname+"不存在!");
return;
}
DWORD flen=fin.GetLength();
char *buffer=new char[flen+1];
flen=fin.ReadHuge(buffer,flen);
buffer[flen]='\0';
fin.Close();
CMessage::PrintInfo("----------------------分类结果----------------------\r\n");
CMessage::PrintInfo("文档ID\t名称\t\t所属类别\r\n");
CMessage::PrintInfo(buffer);
delete[] buffer;
}
}
void CMainFrame::OnToolsResults()
{
CString strFileName=theApp.m_strPath;
strFileName+="\\multieval.exe";
if(WinExec(strFileName,SW_SHOWNORMAL)<32)
AfxMessageBox("分类结果评测程序不存在!");
}
void CMainFrame::OnMainReadFeatures()
{
static char BASED_CODE szModelFilter[] = "Features Files (*.txt)|*.txt|All Files (*.*)|*.*||";
CFileDialog cfd(TRUE,szModelFilter,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szModelFilter,NULL);
if (cfd.DoModal()==IDOK)
{
CString strFileName;
strFileName=cfd.GetPathName();
CMessage::ClearInfo();
theClassifier.m_lstTrainWordList.GetListFromFile(strFileName);
}
}
void CMainFrame::OnMainTrainknn()
{
CPropertySheet paramsSheet;
CTrainParamsPage trainParamsPage;
if(theClassifier.m_paramClassifier.m_txtTrainDir.IsEmpty())
theClassifier.m_paramClassifier.m_txtTrainDir=theApp.m_strPath+"\\sample\\train";
if(theClassifier.m_paramClassifier.m_txtResultDir.IsEmpty())
theClassifier.m_paramClassifier.m_txtResultDir=theApp.m_strPath+"\\sample\\knn";
trainParamsPage.m_txtTrainDir = theClassifier.m_paramClassifier.m_txtTrainDir;
trainParamsPage.m_txtResultDir = theClassifier.m_paramClassifier.m_txtResultDir;
trainParamsPage.m_nFSMode = theClassifier.m_paramClassifier.m_nFSMode;
trainParamsPage.m_nWordSize = theClassifier.m_paramClassifier.m_nWordSize;
trainParamsPage.m_nSelMode = theClassifier.m_paramClassifier.m_nSelMode;
trainParamsPage.m_nOpMode = theClassifier.m_paramClassifier.m_nOpMode;
trainParamsPage.m_nLanguageType= theClassifier.m_paramClassifier.m_nLanguageType;
trainParamsPage.m_bStem = theClassifier.m_paramClassifier.m_bStem;
trainParamsPage.m_nWeightMode = theClassifier.m_paramClassifier.m_nWeightMode;
//paramsSheet.SetWizardMode();
paramsSheet.SetTitle("参数设置");
paramsSheet.AddPage(&trainParamsPage);
if(paramsSheet.DoModal()==IDOK)
{
if(!CheckPath(trainParamsPage.m_txtTrainDir)||
!CheckPath(trainParamsPage.m_txtResultDir,true))
return;
theClassifier.m_paramClassifier.m_txtTrainDir = trainParamsPage.m_txtTrainDir;
theClassifier.m_paramClassifier.m_txtResultDir = trainParamsPage.m_txtResultDir;
theClassifier.m_paramClassifier.m_nFSMode = trainParamsPage.m_nFSMode;
theClassifier.m_paramClassifier.m_nWordSize = trainParamsPage.m_nWordSize;
theClassifier.m_paramClassifier.m_nSelMode = trainParamsPage.m_nSelMode;
theClassifier.m_paramClassifier.m_nOpMode = trainParamsPage.m_nOpMode;
theClassifier.m_paramClassifier.m_nLanguageType = trainParamsPage.m_nLanguageType;
theClassifier.m_paramClassifier.m_bStem = trainParamsPage.m_bStem;
theClassifier.m_paramClassifier.m_nWeightMode = trainParamsPage.m_nWeightMode;
theClassifier.m_paramClassifier.m_nClassifierType= CClassifierParam::nCT_KNN;
Train();
m_strModel=theClassifier.m_paramClassifier.m_txtResultDir+"\\model.prj";
theClassifier.m_paramClassifier.m_strModelFile="model";
}
}
void CMainFrame::OnMainTrainsvm()
{
// TODO: Add your command handler code here
CPropertySheet paramsSheet;
CSVMParamsPage svmParamsPage;
CTrainParamsPage trainParamsPage;
if(theClassifier.m_paramClassifier.m_txtTrainDir.IsEmpty())
theClassifier.m_paramClassifier.m_txtTrainDir=theApp.m_strPath+"\\sample\\train";
if(theClassifier.m_paramClassifier.m_txtResultDir.IsEmpty())
theClassifier.m_paramClassifier.m_txtResultDir=theApp.m_strPath+"\\sample\\svm";
trainParamsPage.m_txtTrainDir = theClassifier.m_paramClassifier.m_txtTrainDir;
trainParamsPage.m_txtResultDir = theClassifier.m_paramClassifier.m_txtResultDir;
trainParamsPage.m_nFSMode = theClassifier.m_paramClassifier.m_nFSMode;
trainParamsPage.m_nWordSize = theClassifier.m_paramClassifier.m_nWordSize;
trainParamsPage.m_nSelMode = theClassifier.m_paramClassifier.m_nSelMode;
trainParamsPage.m_nOpMode = theClassifier.m_paramClassifier.m_nOpMode;
trainParamsPage.m_nLanguageType= theClassifier.m_paramClassifier.m_nLanguageType;
trainParamsPage.m_bStem = theClassifier.m_paramClassifier.m_bStem;
trainParamsPage.m_nWeightMode = theClassifier.m_paramClassifier.m_nWeightMode;
svmParamsPage.m_bB=theClassifier.m_theSVM.com_param.biased_Hyperplane;
svmParamsPage.m_bI=theClassifier.m_theSVM.com_param.remove_inconsitant;
svmParamsPage.m_dC=theClassifier.m_theSVM.com_param.C;
svmParamsPage.m_dJ=theClassifier.m_theSVM.com_param.cost_factor;
svmParamsPage.m_bX=theClassifier.m_theSVM.com_param.loo;
svmParamsPage.m_fK=theClassifier.m_theSVM.com_param.search_depth;
svmParamsPage.m_fO=theClassifier.m_theSVM.com_param.rho;
svmParamsPage.m_fP=theClassifier.m_theSVM.com_param.fraction;
svmParamsPage.m_fG=theClassifier.m_theSVM.com_param.rbf_gamma;
svmParamsPage.m_fC=theClassifier.m_theSVM.com_param.poly_c;
svmParamsPage.m_fS=theClassifier.m_theSVM.com_param.poly_s;
svmParamsPage.m_iD=theClassifier.m_theSVM.com_param.poly_degree;
svmParamsPage.m_iKernelType=theClassifier.m_theSVM.com_param.kernel_type;
svmParamsPage.m_fE=theClassifier.m_theSVM.com_param.epsion;
svmParamsPage.m_lgIterationTime=theClassifier.m_theSVM.com_param.iteration_time;
svmParamsPage.m_fM=theClassifier.m_theSVM.com_param.cache_size;
svmParamsPage.m_lgNewVariable=theClassifier.m_theSVM.com_param.new_variable;
svmParamsPage.m_lgMaxQPSize=theClassifier.m_theSVM.com_param.maximum_size;
svmParamsPage.m_bFinal=theClassifier.m_theSVM.com_param.final_test;
//paramsSheet.SetWizardMode();
paramsSheet.SetTitle("参数设置");
paramsSheet.AddPage(&trainParamsPage);
paramsSheet.AddPage(&svmParamsPage);
if(paramsSheet.DoModal()==IDOK)
{
if(!CheckPath(trainParamsPage.m_txtTrainDir)||
!CheckPath(trainParamsPage.m_txtResultDir,true))
return;
theClassifier.m_theSVM.com_param.biased_Hyperplane=svmParamsPage.m_bB ;
theClassifier.m_theSVM.com_param.remove_inconsitant=svmParamsPage.m_bI;
theClassifier.m_theSVM.com_param.C = svmParamsPage.m_dC;
theClassifier.m_theSVM.com_param.cost_factor = svmParamsPage.m_dJ;
theClassifier.m_theSVM.com_param.loo = svmParamsPage.m_bX;
theClassifier.m_theSVM.com_param.search_depth = svmParamsPage.m_fK;
theClassifier.m_theSVM.com_param.rho = svmParamsPage.m_fO;
theClassifier.m_theSVM.com_param.fraction = svmParamsPage.m_fP;
theClassifier.m_theSVM.com_param.rbf_gamma = svmParamsPage.m_fG ;
theClassifier.m_theSVM.com_param.poly_c = svmParamsPage.m_fC;
theClassifier.m_theSVM.com_param.poly_s = svmParamsPage.m_fS;
theClassifier.m_theSVM.com_param.poly_degree = svmParamsPage.m_iD ;
theClassifier.m_theSVM.com_param.kernel_type = svmParamsPage.m_iKernelType ;
theClassifier.m_theSVM.com_param.epsion = svmParamsPage.m_fE;
theClassifier.m_theSVM.com_param.iteration_time = svmParamsPage.m_lgIterationTime;
theClassifier.m_theSVM.com_param.cache_size = svmParamsPage.m_fM ;
theClassifier.m_theSVM.com_param.new_variable = svmParamsPage.m_lgNewVariable;
theClassifier.m_theSVM.com_param.maximum_size = svmParamsPage.m_lgMaxQPSize;
theClassifier.m_theSVM.com_param.final_test = svmParamsPage.m_bFinal ;
theClassifier.m_paramClassifier.m_txtTrainDir = trainParamsPage.m_txtTrainDir;
theClassifier.m_paramClassifier.m_txtResultDir = trainParamsPage.m_txtResultDir;
theClassifier.m_paramClassifier.m_nFSMode = trainParamsPage.m_nFSMode;
theClassifier.m_paramClassifier.m_nWordSize = trainParamsPage.m_nWordSize;
theClassifier.m_paramClassifier.m_nSelMode = trainParamsPage.m_nSelMode;
theClassifier.m_paramClassifier.m_nOpMode = trainParamsPage.m_nOpMode;
theClassifier.m_paramClassifier.m_nLanguageType = trainParamsPage.m_nLanguageType;
theClassifier.m_paramClassifier.m_bStem = trainParamsPage.m_bStem;
theClassifier.m_paramClassifier.m_nWeightMode = trainParamsPage.m_nWeightMode;
theClassifier.m_paramClassifier.m_nClassifierType= CClassifierParam::nCT_SVM;
Train();
m_strModel=theClassifier.m_paramClassifier.m_txtResultDir+"\\model.prj";
theClassifier.m_paramClassifier.m_strModelFile="model";
}
}
bool CMainFrame::CheckPath(CString &strPath, bool bCreateDir)
{
if(_chdir(strPath)<0)
{
if(bCreateDir)
{
if(_mkdir(strPath)<0)
{
CMessage::PrintError("无法创建目录"+strPath+"!");
return false;
}
}
else
{
CMessage::PrintError("目录"+strPath+"不存在!");
return false;
}
}
if(strPath[strPath.GetLength()-1]=='\\')
strPath=strPath.Left(strPath.GetLength()-1);
return true;
}
void CMainFrame::OnToolsConvert()
{
CConvertDlg dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_nSourceFormat==0&&!CheckPath(dlg.m_strSource)) return;
if(dlg.m_nTargetFormat==0&&!CheckPath(dlg.m_strTarget,true)) return;
strcpy(theSaxFileHandler.m_pTarget,dlg.m_strTarget);
strcpy(theSaxFileHandler.m_pSource,dlg.m_strSource);
theSaxFileHandler.m_nTargetFormat=dlg.m_nTargetFormat;
theSaxFileHandler.m_nSourceFormat=dlg.m_nSourceFormat;
theSaxFileHandler.m_bShowErrors=dlg.m_bShowErrors;
theSaxFileHandler.m_nSplitType=dlg.m_nSplitType;
theSaxFileHandler.m_nDocsSetType=dlg.m_nDocsSetType;
theSaxFileHandler.m_nCategoryNum=dlg.m_nCategoryNum;
CMessage::ClearInfo();
BeginComputation();
m_pThread=AfxBeginThread(ConvertThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
}
}
void CMainFrame::OnToolsSeldoc()
{
// TODO: Add your command handler code here
CDocSelDlg dlg;
dlg.m_strSource=theSelectDocs.m_strSource;
dlg.m_strTarget=theSelectDocs.m_strTarget;
dlg.m_nPercent=theSelectDocs.m_nPercent;
if(dlg.DoModal()==IDOK)
{
theSelectDocs.m_strSource=dlg.m_strSource;
theSelectDocs.m_strTarget=dlg.m_strTarget;
theSelectDocs.m_nPercent=dlg.m_nPercent;
CMessage::ClearInfo();
BeginComputation();
m_pThread=AfxBeginThread(SeldocsThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
}
}
void CMainFrame::OnToolsWordseg()
{
CSegDocDlg dlg;
if(dlg.DoModal()==IDOK)
{
CMessage::ClearInfo();
BeginComputation();
m_pThread=AfxBeginThread(SegDocsThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -