ICTCLAS_WinDlg.cpp
上传用户:yxl0916
上传日期:2007-05-25
资源大小:2245k
文件大小:11k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. //ICTCLAS简介:计算所汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),
  3. //             功能有:中文分词;词性标注;未登录词识别。
  4. //             分词正确率高达97.58%(973专家评测结果),
  5. //             未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%;
  6. //             处理速度为31.5Kbytes/s。
  7. //著作权:  Copyright?2002-2005中科院计算所 职务著作权人:张华平 刘群
  8. //遵循协议:自然语言处理开放资源许可证1.0
  9. //Email: zhanghp@software.ict.ac.cn
  10. //Homepage:www.nlp.org.cn;mtgroup.ict.ac.cn
  11. // ICTCLAS_WinDlg.cpp : implementation file
  12. //
  13. #include "stdafx.h"
  14. #include "ICTCLAS_Win.h"
  15. #include "ICTCLAS_WinDlg.h"
  16. #include "Utility\Utility.h"
  17. #include <time.h>//Calculate the time
  18. #include  <io.h>
  19. #include  <stdio.h>
  20. #include  <stdlib.h>
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CAboutDlg dialog used for App About
  28. class CAboutDlg : public CDialog
  29. {
  30. public:
  31. CAboutDlg();
  32. // Dialog Data
  33. //{{AFX_DATA(CAboutDlg)
  34. enum { IDD = IDD_ABOUTBOX };
  35. //}}AFX_DATA
  36. // ClassWizard generated virtual function overrides
  37. //{{AFX_VIRTUAL(CAboutDlg)
  38. protected:
  39. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  40. //}}AFX_VIRTUAL
  41. // Implementation
  42. protected:
  43. //{{AFX_MSG(CAboutDlg)
  44. //}}AFX_MSG
  45. DECLARE_MESSAGE_MAP()
  46. };
  47. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  48. {
  49. //{{AFX_DATA_INIT(CAboutDlg)
  50. //}}AFX_DATA_INIT
  51. }
  52. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CDialog::DoDataExchange(pDX);
  55. //{{AFX_DATA_MAP(CAboutDlg)
  56. //}}AFX_DATA_MAP
  57. }
  58. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  59. //{{AFX_MSG_MAP(CAboutDlg)
  60. // No message handlers
  61. //}}AFX_MSG_MAP
  62. END_MESSAGE_MAP()
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CICTCLAS_WinDlg dialog
  65. CICTCLAS_WinDlg::CICTCLAS_WinDlg(CWnd* pParent /*=NULL*/)
  66. : CDialog(CICTCLAS_WinDlg::IDD, pParent)
  67. {
  68. //{{AFX_DATA_INIT(CICTCLAS_WinDlg)
  69. m_sResult = _T("");
  70. m_sSource = _T("");
  71. m_nTime = 0;
  72. m_nOutputFormat = -1;
  73. m_nOperateType = -1;
  74. m_nResultNum = 0;
  75. m_sScore = _T("");
  76. //}}AFX_DATA_INIT
  77. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  78. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  79. }
  80. void CICTCLAS_WinDlg::DoDataExchange(CDataExchange* pDX)
  81. {
  82. CDialog::DoDataExchange(pDX);
  83. //{{AFX_DATA_MAP(CICTCLAS_WinDlg)
  84. DDX_Text(pDX, IDC_EDT_RESULT, m_sResult);
  85. DDX_Text(pDX, IDC_EDT_SOURCE, m_sSource);
  86. DDV_MaxChars(pDX, m_sSource, 2048);
  87. DDX_Text(pDX, IDC_EDT_TIME, m_nTime);
  88. DDX_Radio(pDX, IDC_RADIO_PKU, m_nOutputFormat);
  89. DDX_Radio(pDX, IDC_RADIO_SEG, m_nOperateType);
  90. DDX_Text(pDX, IDC_EDT_RESULTNUM, m_nResultNum);
  91. DDV_MinMaxUInt(pDX, m_nResultNum, 1, 10);
  92. DDX_Text(pDX, IDC_EDT_SCORE, m_sScore);
  93. //}}AFX_DATA_MAP
  94. }
  95. BEGIN_MESSAGE_MAP(CICTCLAS_WinDlg, CDialog)
  96. //{{AFX_MSG_MAP(CICTCLAS_WinDlg)
  97. ON_WM_SYSCOMMAND()
  98. ON_WM_PAINT()
  99. ON_WM_QUERYDRAGICON()
  100. ON_BN_CLICKED(IDC_BTN_ABOUT, OnBtnAbout)
  101. ON_BN_CLICKED(IDC_BTN_RUN, OnBtnRun)
  102. ON_BN_CLICKED(IDC_BTN_FILEOPEN, OnBtnFileopen)
  103. ON_WM_CLOSE()
  104. ON_WM_DESTROY()
  105. //}}AFX_MSG_MAP
  106. END_MESSAGE_MAP()
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CICTCLAS_WinDlg message handlers
  109. BOOL CICTCLAS_WinDlg::OnInitDialog()
  110. {
  111. CDialog::OnInitDialog();
  112. // Add "About..." menu item to system menu.
  113. // IDM_ABOUTBOX must be in the system command range.
  114. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  115. ASSERT(IDM_ABOUTBOX < 0xF000);
  116. CMenu* pSysMenu = GetSystemMenu(FALSE);
  117. if (pSysMenu != NULL)
  118. {
  119. CString strAboutMenu;
  120. strAboutMenu.LoadString(IDS_ABOUTBOX);
  121. if (!strAboutMenu.IsEmpty())
  122. {
  123. pSysMenu->AppendMenu(MF_SEPARATOR);
  124. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  125. }
  126. }
  127. // Set the icon for this dialog.  The framework does this automatically
  128. //  when the application's main window is not a dialog
  129. SetIcon(m_hIcon, TRUE); // Set big icon
  130. SetIcon(m_hIcon, FALSE); // Set small icon
  131. // TODO: Add extra initialization here
  132. m_nOperateType=2;
  133. m_nOutputFormat=0;
  134. m_nTime=0;
  135. m_nResultNum=1;
  136. m_sScore.Format("None");
  137. m_bDisable=true;
  138. if(!IsDataExists())
  139. {
  140. m_sResult="错误:Data文件夹不存在或者缺少数据文件!";
  141. }
  142.     UpdateData(FALSE);
  143. m_fileLog.Open("log.txt",CFile::modeWrite|CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::shareDenyWrite);//Open log file to write
  144. m_fileLog.SeekToEnd();
  145. return TRUE;  // return TRUE  unless you set the focus to a control
  146. }
  147. void CICTCLAS_WinDlg::OnSysCommand(UINT nID, LPARAM lParam)
  148. {
  149. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  150. {
  151. CAboutDlg dlgAbout;
  152. dlgAbout.DoModal();
  153. }
  154. else
  155. {
  156. CDialog::OnSysCommand(nID, lParam);
  157. }
  158. }
  159. // If you add a minimize button to your dialog, you will need the code below
  160. //  to draw the icon.  For MFC applications using the document/view model,
  161. //  this is automatically done for you by the framework.
  162. void CICTCLAS_WinDlg::OnPaint() 
  163. {
  164. if (IsIconic())
  165. {
  166. CPaintDC dc(this); // device context for painting
  167. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  168. // Center icon in client rectangle
  169. int cxIcon = GetSystemMetrics(SM_CXICON);
  170. int cyIcon = GetSystemMetrics(SM_CYICON);
  171. CRect rect;
  172. GetClientRect(&rect);
  173. int x = (rect.Width() - cxIcon + 1) / 2;
  174. int y = (rect.Height() - cyIcon + 1) / 2;
  175. // Draw the icon
  176. dc.DrawIcon(x, y, m_hIcon);
  177. }
  178. else
  179. {
  180. CDialog::OnPaint();
  181. }
  182. }
  183. // The system calls this to obtain the cursor to display while the user drags
  184. //  the minimized window.
  185. HCURSOR CICTCLAS_WinDlg::OnQueryDragIcon()
  186. {
  187. return (HCURSOR) m_hIcon;
  188. }
  189. void CICTCLAS_WinDlg::OnBtnAbout() 
  190. {
  191. // TODO: Add your control notification handler code here
  192. CAboutDlg dlg;
  193. dlg.DoModal();
  194. //IDOK
  195. }
  196. void CICTCLAS_WinDlg::OnBtnRun() 
  197. {
  198. // TODO: Add your control notification handler code here
  199. if(m_bDisable)
  200. return;
  201. char *sResult,*sSource;
  202. UpdateData();
  203. if(m_sSource.IsEmpty())
  204. {//Empty sentence and return.
  205. return ;
  206. }
  207. m_ICTCLAS.m_nOutputFormat=m_nOutputFormat;
  208. m_ICTCLAS.m_nOperateType=m_nOperateType;
  209. clock_t start, finish;
  210. if(m_nOutputFormat!=2)
  211. sResult=new char [(strlen((char *)(LPCTSTR)m_sSource)+13)*3];
  212. else
  213. sResult=new char [(strlen((char *)(LPCTSTR)m_sSource)+13)*50];
  214. if(m_nResultNum==1)
  215. {
  216. start=clock();
  217. if(!m_ICTCLAS.ParagraphProcessing((char *)(LPCTSTR)m_sSource,sResult))
  218. m_sResult.Format("错误:程序初始化异常!");
  219. else
  220. m_sResult.Format("%s",sResult);
  221. finish=clock();
  222. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  223. m_sScore.Format("%f",m_ICTCLAS.m_dResultPossibility[0]);
  224. UpdateData(FALSE);
  225. //write  log file
  226. }
  227. else
  228. {
  229. if(m_sSource.GetLength()>1024)
  230. {
  231. m_sResult.Format("多个结果处理的文本不能超过1K!");
  232. UpdateData(FALSE);
  233. return;
  234. }
  235. else if(m_nResultNum>10)
  236. {
  237. m_sResult.Format("结果数不能超过10!");
  238. UpdateData(FALSE);
  239. return;
  240. }
  241. start=clock();
  242. sSource=new char[strlen((char *)(LPCTSTR)m_sSource)+20];
  243. strcpy(sSource,SENTENCE_BEGIN);
  244. strcat(sSource,(char *)(LPCTSTR)m_sSource);
  245. strcat(sSource,SENTENCE_END);
  246. if(!m_ICTCLAS.Processing(sSource,m_nResultNum))
  247. m_sResult.Format("错误:程序初始化异常!");
  248. else
  249. {
  250. finish=clock();
  251. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  252. m_sResult.Empty();
  253. CString sTemp;
  254. for(int i=0;i<m_ICTCLAS.m_nResultCount;i++)
  255. {
  256. sTemp.Format("Result %d(Score=%f):",i+1,m_ICTCLAS.m_dResultPossibility[i]);
  257. m_sResult+=sTemp;
  258. m_ICTCLAS.Output(m_ICTCLAS.m_pResult[i],sResult,true);
  259. m_sResult+=sResult;
  260. m_sResult+="rn";
  261. }
  262. }
  263. delete [] sSource;
  264. UpdateData(FALSE);
  265. }
  266. delete [] sResult;
  267. m_fileLog.WriteString((LPCTSTR)m_sSource);//Record the source sentence in the log file
  268. m_fileLog.WriteString("rn");
  269. m_fileLog.WriteString((LPCTSTR)m_sResult);//Record the result in the log file
  270. m_fileLog.WriteString("rn");
  271. }
  272. void CICTCLAS_WinDlg::OnBtnFileopen() 
  273. {
  274. // TODO: Add your control notification handler code here
  275. if(m_bDisable)
  276. return;
  277. CFileDialog dlg(true,(LPCTSTR)("txt"),(LPCTSTR)("test"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text File (*.txt)|*.txt");
  278. char sSourceFile[100],sResultFile[100];
  279. if(dlg.DoModal()==IDOK)
  280. {
  281. UpdateData();
  282. m_ICTCLAS.m_nOutputFormat=m_nOutputFormat;
  283. m_ICTCLAS.m_nOperateType=m_nOperateType;
  284. clock_t start, finish;
  285. strcpy(sSourceFile,(LPCTSTR)dlg.GetPathName());//Get file name and path
  286. strcpy(sResultFile,sSourceFile);//Set the result file name and path
  287. unsigned int nLen=strlen(sSourceFile);
  288. strncpy(sResultFile+nLen-4,"_cla.txt",10);//Change the extension
  289.         sResultFile[nLen+4]=0;
  290. start=clock();
  291. if(!m_ICTCLAS.FileProcessing(sSourceFile,sResultFile))
  292. m_sResult.Format("错误:程序初始化异常!");
  293. else
  294. {
  295. finish=clock();
  296. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  297. m_sResult.Format("处理结果已经存在文件%s中!",sResultFile);
  298. }
  299. UpdateData(FALSE);
  300. }
  301. }
  302. //DEL void CICTCLAS_WinDlg::OnBtnFilesave() 
  303. //DEL {
  304. //DEL  // TODO: Add your control notification handler code here
  305. //DEL  CFileDialog dlg(false,(LPCTSTR)("cla"),(LPCTSTR)("temp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "CLA File (*.cla)|*.cla");
  306. //DEL  if(dlg.DoModal()==IDOK)
  307. //DEL  {
  308. //DEL  CStdioFile file((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate);
  309. //DEL  file.SeekToEnd();
  310. //DEL  file.WriteString("rn");
  311. //DEL  file.WriteString((LPCTSTR)m_sResult);
  312. //DEL  }
  313. //DEL }
  314. void CICTCLAS_WinDlg::OnClose() 
  315. {
  316. // TODO: Add your message handler code here and/or call default
  317. m_fileLog.Close();
  318. CDialog::OnClose();
  319. }
  320. void CICTCLAS_WinDlg::OnDestroy() 
  321. {
  322. CDialog::OnDestroy();
  323. // TODO: Add your message handler code here
  324. }
  325. BOOL CICTCLAS_WinDlg::PreCreateWindow(CREATESTRUCT& cs) 
  326. {
  327. // TODO: Add your specialized code here and/or call the base class
  328. //cs.
  329. return CDialog::PreCreateWindow(cs);
  330. }
  331. bool CICTCLAS_WinDlg::IsDataExists()
  332. {
  333. char sDataFiles[][40]={"data\BigramDict.dct",
  334.                    "data\coreDict.dct",
  335.    "data\lexical.ctx",
  336.                    "data\nr.dct",
  337.    "data\nr.ctx",
  338.                    "data\ns.dct",
  339.    "data\ns.ctx",
  340.                    "data\tr.dct",
  341.    "data\tr.ctx",
  342.    ""
  343. };
  344. int i=0;
  345. while(sDataFiles[i][0]!=0)
  346. {
  347. if((_access( sDataFiles[i], 0 ))==-1)
  348. return false;
  349. i++;
  350. }
  351. m_bDisable=false;
  352. return true;
  353. }