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

📄 fencidlg.cpp

📁 关键词抽取技术广泛应用于信息检索、文本分类/聚类、信息过滤
💻 CPP
字号:
// FenCiDlg.cpp : implementation file
//

#include "stdafx.h"
#include "HLSwknlTool.h"
#include "FenCiDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CFenCiDlg dialog


CFenCiDlg::CFenCiDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFenCiDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFenCiDlg)
	m_strSegSource = _T("");
	m_strSegResult = _T("");
	//}}AFX_DATA_INIT
}


void CFenCiDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFenCiDlg)
	DDX_Control(pDX, IDC_RICHEDIT_SEGRESULT, m_cSegResult);
	DDX_Text(pDX, IDC_EDIT_SEGSOURCE, m_strSegSource);
	DDX_Text(pDX, IDC_RICHEDIT_SEGRESULT, m_strSegResult);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFenCiDlg, CDialog)
	//{{AFX_MSG_MAP(CFenCiDlg)
	ON_BN_CLICKED(IDC_BUTTON_SEGLOAD, OnButtonLoad)
	ON_BN_CLICKED(IDC_BUTTON_SEGANALYSE, OnButtonAnalyse)
	ON_BN_CLICKED(IDC_BUTTON_SEGERASE, OnButtonErase)
	ON_WM_CAPTURECHANGED()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFenCiDlg message handlers

BOOL CFenCiDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	((CButton*)GetDlgItem(IDC_RADIO_SEARCHMODE))->SetCheck(BST_CHECKED);
	((CButton*)GetDlgItem(IDC_RADIO_MARKMODE))->SetCheck(BST_UNCHECKED);
	((CButton*)GetDlgItem(IDC_RADIO_SEARCHMODE))->SetWindowText("检索模式");
	((CButton*)GetDlgItem(IDC_RADIO_MARKMODE))->SetWindowText("语意计算模式");
	GetDlgItem(IDC_BUTTON_SEGLOAD)->SetWindowText("载入(&L)");
	GetDlgItem(IDC_BUTTON_SEGANALYSE)->SetWindowText("分析(&S)");
	GetDlgItem(IDC_BUTTON_SEGERASE)->SetWindowText("清空(&E)");
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CFenCiDlg::OnButtonLoad() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	//选择文件
	CFileDialog cdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All File(*.*)|*.*||",this);
	if(cdlg.DoModal()==IDOK)
	{
		CFile file ;
		CString strFile = cdlg.GetFileName();
		if(!file.Open(strFile,CFile::modeRead))//打开选择的文件
		{
			AfxMessageBox("文件打开失败!");
			return ;
		}
		int nLen = file.GetLength();//获得文件长度
		LPSTR lpTemp = m_strSegSource.GetBuffer(nLen+1);
		file.Read(lpTemp,nLen);//读取文件内容
		lpTemp[nLen] = _T('\0');
		m_strSegSource.ReleaseBuffer() ;
		file.Close();
		
		m_strSegResult = "";
		m_cSegResult.SetWindowText("");
		
		UpdateData(FALSE);//显示在界面中
	}
}

void CFenCiDlg::OnButtonAnalyse() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	
	m_strSegResult = "";
	m_cSegResult.SetWindowText(" ");
	
	///打开分词句柄
	HANDLE hHandle = HLOpenSplit();
	if(hHandle == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("分词句柄打开失败!");
		return ;
	}
	int nExtra = 0;
	nExtra |= HL_CAL_OPT_POS;
	UINT nMode = GetCheckedRadioButton(IDC_RADIO_SEARCHMODE,IDC_RADIO_MARKMODE);
	if (nMode == IDC_RADIO_SEARCHMODE)
		nExtra |= HL_CAL_OPT_SEARCH;
	DWORD dwStart = GetTickCount();
	bool bOK = HLSplitWord(hHandle,(LPCTSTR)m_strSegSource,nExtra);//进行分词
	if (!bOK)
	{
		AfxMessageBox("分词失败!");
		return ;
	}
	DWORD dwEnd = GetTickCount();
	CString strMsg ;
	strMsg.Format("字节:%d  耗时:%dms",m_strSegSource.GetLength(),(dwEnd-dwStart));
	AfxMessageBox(strMsg);
	int nCnt = 0 ; 
	nCnt= HLGetWordCnt(hHandle) ;//获得分词结果个数
	SHLSegWord* pWord = NULL ;
	for(int i = 0 ; i < nCnt ; i++)
	{//获得分词结果
		CString strWord;
		pWord = HLGetWordAt(hHandle,i);//获得指定的分词结果
		strWord = pWord->s_szWord ;
		AddNatureColour(strWord,pWord->s_dwPOS);
	}//for i
	HLCloseSplit(hHandle);//关闭分词句柄
	
	//UpdateData(FALSE);
}

void CFenCiDlg::OnButtonErase() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	
	m_strSegSource = _T("");
	GetDlgItem(IDC_EDIT_SEGSOURCE)->SetFocus();
	m_strSegResult = _T("");
	m_cSegResult.SetWindowText("");
	
	UpdateData(FALSE);
}

BOOL CFenCiDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))
		return true;
	return CDialog::PreTranslateMessage(pMsg);
}
void CFenCiDlg::AddNatureColour(CString &strWord, DWORD dwPOS)
{
	COLORREF crText;

	if((dwPOS & NATURE_A_NS) == NATURE_A_NS)
	{
		crText = COL_PLACESTR;
	}
	else if((dwPOS & NATURE_D_N) == NATURE_D_N)
	{
		crText = COL_NOUN;
	}
	else if((dwPOS & NATURE_A_NR) == NATURE_A_NR)
	{
		crText = COL_NAME;
	}
	else if((dwPOS & NATURE_D_E) == NATURE_D_E)
	{
		crText = COL_PRODUCTSTR;
	}
	else if((dwPOS & NATURE_D_MQ) == NATURE_D_MQ)
	{
		crText = COL_QUANTITY;
	}
	else if((dwPOS & NATURE_D_V) == NATURE_D_V)
	{
		crText = COL_VERB;
	}
	else if((dwPOS & NATURE_D_T) == NATURE_D_T)
	{
		crText = COL_TIME;
	}
	else if((dwPOS & NATURE_A_NT) == NATURE_A_NT)
	{
		crText = COL_ORGANIZATIONSTR;
	}
	else
	{
		crText = COL_EXTERN;
	}

	CString strSegResult;
	m_cSegResult.GetWindowText(strSegResult);
	int iTextLen = m_cSegResult.GetWindowTextLength();
	if(iTextLen > 0)
		m_cSegResult.SetSel((iTextLen - 1)*sizeof(TCHAR), (iTextLen - 1) * sizeof(TCHAR));
	
	CHARFORMAT cf;
	cf.cbSize = sizeof(CHARFORMAT);
	cf.dwMask = CFM_COLOR;
	cf.dwEffects = 0;
	cf.crTextColor = crText;
	m_cSegResult.SetSelectionCharFormat(cf);
	strWord += _T(" ");
	m_cSegResult.ReplaceSel(strWord);
}

⌨️ 快捷键说明

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