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 );
}