⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 基于径向基函数的神经网络文本自动分类系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -