ICTCLAS_WinDlg.cpp
上传用户:sunyong76
上传日期:2021-10-03
资源大小:2236k
文件大小:12k
源码类别:

多国语言处理

开发平台:

Java

  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.     char *sSource;
  203. UpdateData();
  204. if(m_sSource.IsEmpty())
  205. {//Empty sentence and return.
  206. return ;
  207. }
  208. m_ICTCLAS.m_nOutputFormat=m_nOutputFormat;
  209. m_ICTCLAS.m_nOperateType=m_nOperateType;
  210. clock_t start, finish;
  211. /*if(m_nOutputFormat!=2)
  212. sResult=new char [(strlen((char *)(LPCTSTR)m_sSource)+13)*3];
  213. else
  214. sResult=new char [(strlen((char *)(LPCTSTR)m_sSource)+13)*50];
  215.     */
  216.     CString sResult;
  217. if(m_nResultNum==1)
  218. {
  219. start=clock();
  220. if(!m_ICTCLAS.ParagraphProcessing((char *)(LPCTSTR)m_sSource,sResult))
  221. m_sResult.Format("错误:程序初始化异常!");
  222. else
  223. //m_sResult.Format("%s",sResult.c_str());
  224.                 m_sResult=sResult;
  225. finish=clock();
  226. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  227. m_sScore.Format("%f",m_ICTCLAS.m_dResultPossibility[0]);
  228. UpdateData(FALSE);
  229. //write  log file
  230. }
  231. else
  232. {
  233. if(m_sSource.GetLength()>1024)
  234. {
  235. m_sResult.Format("多个结果处理的文本不能超过1K!");
  236. UpdateData(FALSE);
  237. /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  238. //delete []sResult;
  239. //sResult = NULL;
  240. /*-----------------------------------------------*/
  241. return;
  242. }
  243. else if(m_nResultNum>10)
  244. {
  245. m_sResult.Format("结果数不能超过10!");
  246. UpdateData(FALSE);
  247. /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  248. //delete []sResult;
  249. //sResult = NULL;
  250. /*-----------------------------------------------*/
  251. return;
  252. }
  253. start=clock();
  254. sSource=new char[strlen((char *)(LPCTSTR)m_sSource)+20];
  255. strcpy(sSource,SENTENCE_BEGIN);
  256. strcat(sSource,(char *)(LPCTSTR)m_sSource);
  257. strcat(sSource,SENTENCE_END);
  258. if(!m_ICTCLAS.Processing(sSource,m_nResultNum))
  259. m_sResult.Format("错误:程序初始化异常!");
  260. else
  261. {
  262. finish=clock();
  263. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  264. m_sResult.Empty();
  265. CString sTemp;
  266. for(int i=0;i<m_ICTCLAS.m_nResultCount;i++)
  267. {
  268. sTemp.Format("Result %d(Score=%f):",i+1,m_ICTCLAS.m_dResultPossibility[i]);
  269. m_sResult+=sTemp;
  270. m_ICTCLAS.Output(m_ICTCLAS.m_pResult[i],sResult,true);
  271. m_sResult+=sResult;
  272. m_sResult+="rn";
  273. }
  274. }
  275. delete [] sSource;
  276. /*----Added By huangjin@ict.ac.cn 2006-5-30----*/
  277. sSource=NULL;
  278.         /*-----------------------------------------------*/
  279. UpdateData(FALSE);
  280. }
  281.     //delete [] sResult;
  282. /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  283. //sResult=NULL;
  284. /*-----------------------------------------------*/
  285. m_fileLog.WriteString((LPCTSTR)m_sSource);//Record the source sentence in the log file
  286. m_fileLog.WriteString("rn");
  287. m_fileLog.WriteString((LPCTSTR)m_sResult);//Record the result in the log file
  288. m_fileLog.WriteString("rn");
  289. }
  290. void CICTCLAS_WinDlg::OnBtnFileopen() 
  291. {
  292. // TODO: Add your control notification handler code here
  293. if(m_bDisable)
  294. return;
  295. CFileDialog dlg(true,(LPCTSTR)("txt"),(LPCTSTR)("test"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text File (*.txt)|*.txt");
  296. /* 
  297.      * ----- commented by huangjin@ict.ac.cn 2006-5-29 ------ 
  298.      * 
  299.      *  char sSourceFile[100],sResultFile[100];
  300.      *
  301.      */
  302. if(dlg.DoModal()==IDOK)
  303. {
  304. UpdateData();
  305. m_ICTCLAS.m_nOutputFormat=m_nOutputFormat;
  306. m_ICTCLAS.m_nOperateType=m_nOperateType;
  307. clock_t start, finish;
  308. /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  309. char *sSourceFile=new char[strlen((char*)(LPCSTR)dlg.GetPathName())+10];
  310. char *sResultFile=new char[strlen((char*)(LPCSTR)dlg.GetPathName())+10];
  311. /*-----------------------------------------------*/
  312.   strcpy(sSourceFile,(LPCTSTR)dlg.GetPathName());//Get file name and path
  313. strcpy(sResultFile,sSourceFile);//Set the result file name and path
  314. unsigned int nLen=strlen(sSourceFile);
  315. strncpy(sResultFile+nLen-4,"_cla.txt",10);//Change the extension
  316.         sResultFile[nLen+4]=0;
  317. start=clock();
  318. if(!m_ICTCLAS.FileProcessing(sSourceFile,sResultFile))
  319. m_sResult.Format("错误:程序初始化异常!");
  320. else
  321. {
  322. finish=clock();
  323. m_nTime=1000*(finish-start)/CLOCKS_PER_SEC;
  324. m_sResult.Format("处理结果已经存在文件%s中!",sResultFile);
  325. }
  326.   UpdateData(FALSE);
  327. /*----Added By huangjin@ict.ac.cn 2006-5-29----*/
  328. delete []sSourceFile;
  329. sSourceFile=NULL;
  330. delete []sResultFile;
  331. sResultFile=NULL;
  332. }
  333. }
  334. //DEL void CICTCLAS_WinDlg::OnBtnFilesave() 
  335. //DEL {
  336. //DEL  // TODO: Add your control notification handler code here
  337. //DEL  CFileDialog dlg(false,(LPCTSTR)("cla"),(LPCTSTR)("temp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "CLA File (*.cla)|*.cla");
  338. //DEL  if(dlg.DoModal()==IDOK)
  339. //DEL  {
  340. //DEL  CStdioFile file((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate);
  341. //DEL  file.SeekToEnd();
  342. //DEL  file.WriteString("rn");
  343. //DEL  file.WriteString((LPCTSTR)m_sResult);
  344. //DEL  }
  345. //DEL }
  346. void CICTCLAS_WinDlg::OnClose() 
  347. {
  348. // TODO: Add your message handler code here and/or call default
  349. m_fileLog.Close();
  350. CDialog::OnClose();
  351. }
  352. void CICTCLAS_WinDlg::OnDestroy() 
  353. {
  354. CDialog::OnDestroy();
  355. // TODO: Add your message handler code here
  356. }
  357. BOOL CICTCLAS_WinDlg::PreCreateWindow(CREATESTRUCT& cs) 
  358. {
  359. // TODO: Add your specialized code here and/or call the base class
  360. //cs.
  361. return CDialog::PreCreateWindow(cs);
  362. }
  363. bool CICTCLAS_WinDlg::IsDataExists()
  364. {
  365. char sDataFiles[][40]={"data\BigramDict.dct",
  366.                    "data\coreDict.dct",
  367.    "data\lexical.ctx",
  368.                    "data\nr.dct",
  369.    "data\nr.ctx",
  370.                    "data\ns.dct",
  371.    "data\ns.ctx",
  372.                    "data\tr.dct",
  373.    "data\tr.ctx",
  374.    ""
  375. };
  376. int i=0;
  377. while(sDataFiles[i][0]!=0)
  378. {
  379. if((_access( sDataFiles[i], 0 ))==-1) //Existence only
  380. return false;
  381. i++;
  382. }
  383. m_bDisable=false;
  384. return true;
  385. }