cpp读取word文件并比较重复率

cpp读取word文件并比较重复率

算法思路

我们先找到两个文件中出现个数最多的10个词语,然后
Vs中新建Win32控制台程序
添加类型库中的MFC并添加所需的类
利用strtok函数进行分词:
第一次分词考虑到中文和英文文档,故分隔标志符为“,”“。”“!”“?”“;”;英文第一次分隔符为“, ””. ””! ””? ””;”(英文我们在输入的时候习惯性地会在标点符号后面添加一个空格键)经过第一轮分词,我们的文档中所有的语句已经全部独立,并且去掉了所有的标点符号。
第二次分词对于中文来说,“我们”“我”“你”“他”“她”“的”“地”“得”“着”“和”“与”“虽然”“但是”“因为”等等这些人称代词、助词以及连接词,我们在寻找相似关键词的时候,要把这些平时比较常用的词语给删掉;第二次分词对于英文来说,“the””I””you””we””he””she””they”等等这些冠词和人称代词,我们也要全部删掉。由于我使用的是strtok函数,所以我在第一步的基础上,利用这些词来作为第二个分隔符,从而得到最后我想要的关键词
对比一篇文档出现的关键词,得到出现次数,将出现次数在前十位的关键词列出
对比两篇文档中的关键字并且利用次数得到一个百分比
百分比公式:

〖f(n)〗^ =(∑_(k=0)k▒〖(nk)/[max(m,n)]〗 )/k
n表示公共关键词出现的次数,分别为n1,n2,n3……
m为第一个文档中此关键词出现的次数,n为第二个关键词出现的次数

输出结果

在这里插入图片描述

代码

在这里插入图片描述

	int  nRetCode = 0;

	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		cerr << _T("Fatal  Error:  MFC  initialization  failed") << endl;
		nRetCode = 1;
	}
	else
	{
		if (CoInitialize(NULL) != S_OK)
		{
			AfxMessageBox(_T("初始化COM支持库失败!"));
			return  -1;
		}

		CApplication  wordApp;
		CDocuments  docs;
		CDocument0  doc;
		CRange  aRange;

		COleVariant  vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

		CString    strPath;
		GetModuleFileName(NULL, strPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
		strPath.ReleaseBuffer();
		int    nPos;
		nPos = strPath.ReverseFind('\\');
		strPath = strPath.Left(nPos);
		CString ini_file_name = strPath + "\\1.doc";

		wordApp.CreateDispatch(_T("Word.Application"), NULL);
		docs = wordApp.get_Documents();
		doc = docs.Open(COleVariant(ini_file_name), vFalse, vTrue, vFalse, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);

		aRange = doc.Range(vOpt, vOpt);

		AfxMessageBox(aRange.get_Text(), MB_OK | MB_ICONWARNING);

		doc.Close(vOpt, vOpt, vOpt);
		wordApp.Quit(vOpt, vOpt, vOpt);

		CoUninitialize();
	}

for (outer = strtok(str, ","); NULL != outer; outer = strtok(NULL, ","))
    {
        printf("Outer token: %s\n", outer);

       for( inner = strtok( outer, "的"); NULL != inner; inner = strtok( NULL, "的") )
       {
        printf( "Inner token: %s\n", inner );
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值