1、掌握选择term的方法;
2、权重计算(TermWeighting):即计算每篇文 权重计算(Term Weighting):即计算每篇文 档中每个term的权重,计算TF、IDF;
3、查询和文档的相似度计算(Siili • 查询和文档的相似度计算(Similarity Computation)。
5、相似度计算
实验中采用的是Jaccard方法。
其中q代表文本的特征向量。d代表另一个文本的特征向量。
计算特征空间中两个向量之间的夹角,夹角越小,说明两个特征向量内容越相似,夹角越大,说明两个向量内容越不同。
2、主要函数
计算相似度:
void CalcSimilarity()
{
cout << "正在计算相似度...";
ofstream fileout_one("相似度大于定值的文本.txt");
ofstream fileout_two("所有文本之间的相似度.txt");
map::iterator map_first;
map::iterator map_second;
map::iterator map_t_t;
double dq, d, q, d_sqrt, q_sqrt;
dq = d = q = 0.0;
for (int i = 0; i < allTxtTID.size()-1; i++)
{
for (int j = i + 1; j < allTxtTID.size(); j++)
{
dq = d = q = 0.0;
map map_second = allTxtTID[j];
for (map_first = allTxtTID[i].begin(); map_first != allTxtTID[i].end(); map_first++)
{
map_t_t = map_second.find(map_first->first);
if (map_t_t == map_second.end())
{
d += map_first->second.result*map_first->second.result;
continue;
}
dq += map_first->second.result * map_t_t->second.result;
d += map_first->second.result * map_first->second.result;
q += map_t_t->second.result * map_t_t->second.result;
map_second.erase(map_first->first);
}
for (map_t_t = map_second.begin(); map_t_t != map_second.end(); map_t_t++)
{
q += map_t_t->second.result * map_t_t->second.result;
}
d_sqrt = sqrt(d);
q_sqrt = sqrt(q);
//Jaccard方法
double result_t = dq / (d + q - dq) * 100;
if (result_t >= 100.0)
{
cout <<"错误信息:"<< i << "和" << j << "相似度为:" << result_t << "%" << endl;
}
else if(result_t>=70.0)
{
fileout_one << "文本" << i << "和" << "文本" << j << "相似度为:" << result_t << "%" << endl;
}
fileout_two << "文本" << i << "和" << "文本" << j << "相似度为:" << result_t << "%" << endl;
}
}
cout << endl;
}
3、导入数据,编译运行,查看结果
整个实验耗时:16.28s。
查看输出文件:
输出所有的文本之间的相似度:
实验中设定的是相似度大于0.7的会输出到相似度大于定值的文本.txt,从结果可以看出,文本中只有15对文本之间相似度大于0.7。
本次实验计算的时候是采用了Jaccard相似度,还可以用dice、jaccad、cosine、内积相似度等方法 。
注:本博客源代码下载地址:http://download.csdn.net/detail/dmxexcalibur/9920653