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

📄 leftview.cpp

📁 基于SVM的文本分类算法
💻 CPP
字号:
// LeftView.cpp : implementation of the CLeftView class
//

#include "stdafx.h"
#include "svmcls.h"

#include "svmclsDoc.h"
#include "LeftView.h"
#include "svmclsView.h"
#include "classifier.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLeftView

IMPLEMENT_DYNCREATE(CLeftView, CTreeView)

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
	//{{AFX_MSG_MAP(CLeftView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction

CLeftView::CLeftView()
{
	// TODO: add construction code here

}

CLeftView::~CLeftView()
{
}

BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing

void CLeftView::OnDraw(CDC* pDC)
{
	CSvmclsDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}


/////////////////////////////////////////////////////////////////////////////
// CLeftView printing

BOOL CLeftView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CLeftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CLeftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CLeftView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();
	m_hImageList.DeleteImageList();
	m_hImageList.Create(16,16,NULL,2,0);
	
	CBitmap bm;
	bm.LoadBitmap(IDB_IMAGELIST);
	m_hImageList.Add(&bm,(COLORREF)0x0);
	bm.DeleteObject();

	CTreeCtrl &tc=GetTreeCtrl();
	tc.SetImageList(&m_hImageList,TVSIL_NORMAL);
	ListTrain();
}

BOOL CLeftView::ListTrain()
{
	CTreeCtrl& tc=GetTreeCtrl();
	HTREEITEM hItem=tc.GetSelectedItem();
	if(hItem!=NULL) tc.SetItemState(hItem,~TVIS_SELECTED,TVIS_SELECTED);
	tc.DeleteAllItems();

	TV_INSERTSTRUCT tvis;
	tvis.hParent=TVI_ROOT;
	tvis.hInsertAfter=TVI_LAST;
	tvis.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
	tvis.item.iImage=0;
	tvis.item.iSelectedImage=0;
	tvis.item.pszText=_T("文本分类器");
	m_hItemRoot=tc.InsertItem(&tvis);

	m_hItemCatalog=tc.InsertItem(_T("类别"),1,1,m_hItemRoot);
	m_hItemWord=tc.InsertItem(_T("特征项"),2,2,m_hItemRoot);
	m_hItemTrain=tc.InsertItem(_T("训练样本"),2,2,m_hItemRoot);
	m_hItemTest=tc.InsertItem(_T("测试样本"),2,2,m_hItemRoot);

	tc.Expand(m_hItemRoot,TVE_EXPAND);
	tc.SelectItem(m_hItemRoot);

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics

#ifdef _DEBUG
void CLeftView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CLeftView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CSvmclsDoc* CLeftView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSvmclsDoc)));
	return (CSvmclsDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers

int CLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	lpCreateStruct->style |= TVS_HASLINES | TVS_HASBUTTONS|TVS_LINESATROOT ;
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	return 0;
}

void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	CTreeCtrl& tc=GetTreeCtrl();

	HTREEITEM hItem=pNMTreeView->itemNew.hItem;
	if(hItem==NULL) return;
	HTREEITEM hParentItem=tc.GetParentItem(hItem);
	CSvmclsDoc* pDoc = GetDocument();

	CString strContent;
	if(hItem==m_hItemRoot)
	{
		theClassifier.m_paramClassifier.GetParamString(strContent);
	}
	else if(hItem==m_hItemTrain)
	{
		POSITION pos_cata = theClassifier.m_lstTrainCatalogList.GetFirstPosition();
		if(pos_cata != NULL)
		{
			CString tmp;
			int sum=0;
			strContent="类别名称                     文档数\r\n";		
			while(pos_cata != NULL)  // for each catalog 
			{
				//取类列表中的每一个类
				CCatalogNode& catanode = theClassifier.m_lstTrainCatalogList.GetNext(pos_cata);
				tmp.Format("%-30s%d\r\n",catanode.m_strCatalogName,catanode.GetDocNum());
				strContent=strContent+tmp;
				sum+=catanode.GetDocNum();
			}
			tmp.Format("\r\n%-30s%d","文档总数:",sum);
			strContent=strContent+tmp;
		}
		else
			strContent="请先打开一个分类模型文件!";
	}
	else if(hItem==m_hItemTest)
	{
		POSITION pos_cata = theClassifier.m_lstTestCatalogList.GetFirstPosition();
		if(pos_cata != NULL)
		{
			CString tmp;
			int sum=0;
			strContent="类别名称                     文档数\r\n";
			POSITION pos_cata = theClassifier.m_lstTestCatalogList.GetFirstPosition();
			while(pos_cata != NULL)  // for each catalog 
			{
				//取类列表中的每一个类
				CCatalogNode& catanode = theClassifier.m_lstTestCatalogList.GetNext(pos_cata);
				tmp.Format("%-30s%d\r\n",catanode.m_strCatalogName,catanode.GetDocNum());
				strContent=strContent+tmp;
				sum+=catanode.GetDocNum();
			}
			tmp.Format("\r\n%-30s%d","文档总数:",sum);
			strContent=strContent+tmp;
		}
		else
			strContent="请先指定需要进行分类的文件!";
	}
	else if (hItem==m_hItemCatalog)
	{
		POSITION pos_cata = theClassifier.m_lstTrainCatalogList.GetFirstPosition();
		if(pos_cata != NULL)
		{
			CString tmp;
			strContent="类别ID     类别名称\r\n";
			while(pos_cata != NULL)  // for each catalog 
			{
				//取类列表中的每一个类
				CCatalogNode& catanode = theClassifier.m_lstTrainCatalogList.GetNext(pos_cata);
				tmp.Format("%-14d%s\r\n",catanode.m_idxCata,catanode.m_strCatalogName);
				strContent=strContent+tmp;
			}
			tmp.Format("\r\n%s%d","类别总数:",theClassifier.m_lstTrainCatalogList.GetCataNum());
			strContent=strContent+tmp;
		}
		else
			strContent="请先打开一个分类模型文件!";			
	}
	else if(hItem==m_hItemWord)
	{
		POSITION pos_word = theClassifier.m_lstTrainWordList.GetFirstPosition();
		if(pos_word != NULL)
		{
			CString tmp;
			strContent="特征ID     特征名称\r\n";
			while(pos_word != NULL)  // for each catalog 
			{
				//取类列表中的每一个类
				CWordNode& wordnode = theClassifier.m_lstTrainWordList.GetNext(pos_word,tmp);
				tmp.Format("%-14d%s\r\n",wordnode.m_nWordID,tmp);
				strContent=strContent+tmp;
			}
			tmp.Format("\r\n%s%d","特征总数:",theClassifier.m_lstTrainWordList.GetCount());
			strContent=strContent+tmp;
		}
		else
			strContent="请先打开一个分类模型文件!";		
	}
	CSvmclsView *pView=GetSvmclsView();
	if(pView!=NULL)
		pView->SetWindowText(strContent);
}


void CLeftView::SetContent(char * fname)
{
	CSvmclsView *pView=GetSvmclsView();
	if(pView!=NULL)
	{
		CSvmclsDoc* pDoc=(CSvmclsDoc*)pView->GetDocument();
		CFile fin;
		if(!fin.Open(fname,CFile::modeRead))
		{
			CString temp=fname;
			AfxMessageBox(_T("文件")+temp+"不存在!");
			return;
		}
		DWORD flen=fin.GetLength();
		char *buffer=new char[flen+1];
		flen=fin.ReadHuge(buffer,flen);
		buffer[flen]='\0';
		pView->SetWindowText(buffer);
		fin.Close();
		delete[] buffer;			
	}
}

CSvmclsView* CLeftView::GetSvmclsView()
{
	CSvmclsView* pView=NULL;
	CSvmclsDoc* pDoc = GetDocument();
	POSITION pos = pDoc->GetFirstViewPosition();
	while (pos != NULL)
	{
		CView *pViews = pDoc->GetNextView(pos);
		if(pViews->IsKindOf(RUNTIME_CLASS(CSvmclsView)))
			pView=(CSvmclsView*)pViews;
	}
	return pView;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -