余弦相似度

/****************************************/
//创建人:李航前
//时间:2014,9,11
//内容:余弦相似度,做法思路参见http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
/****************************************/

#include <string>
#include <iostream>
#include <set>
#include <map>
#include <math.h>
using namespace std;

void Insert_Sum(string sentence,set<string>& s){
	//该函数可以向set数组中存入两句话中所有词,形成词库
		int pos1;
		int pos2;
		string word;
		pos1=0;
		while(true){
			pos2=sentence.find(" ",pos1);
			word=sentence.substr(pos1,pos2-pos1);
			s.insert(word);
			pos1=pos2+1;
			if((int)pos2==-1)  
					break;  
		}
}

void Count(map<string,int>& s,string sentence){
	int pos1;
	int pos2;
	string word;
	pos1=0;
	while(true){
		pos2=sentence.find(" ",pos1);
		word=sentence.substr(pos1,pos2-pos1);
		s[word]++;
		pos1=pos2+1;
		if((int)pos2==-1)  
				break;  
	}
}


int main(){
	string sen1;
	string sen2;
	set<string> word_sum;//两个句子所有词语的总集合
	set<string>::iterator word_sumIter;

	cout<<"请输入句子1"<<endl;
	getline(cin,sen1);

	cout<<"请输入句子2"<<endl;
	getline(cin,sen2);

	Insert_Sum(sen1,word_sum);
	Insert_Sum(sen2,word_sum);

	map<string,int> word1;//统计两个句子的词频
	map<string,int>::iterator wordIter1;
	map<string,int> word2;
	map<string,int>::iterator wordIter2;
	
	for(word_sumIter=word_sum.begin();word_sumIter!=word_sum.end();word_sumIter++){
		word1[*word_sumIter]=0;
		word2[*word_sumIter]=0;
	}
	Count(word1,sen1);
	Count(word2,sen2);
	
	for(wordIter1=word1.begin();wordIter1!=word1.end();wordIter1++)
		cout<<(*wordIter1).first<<(*wordIter1).second<<endl;

	for(wordIter2=word2.begin();wordIter2!=word2.end();wordIter2++)
		cout<<(*wordIter2).first<<(*wordIter2).second<<endl;

	//下面计算word1,word2向量之间的夹角
	double a;
	double b;
	double c;
	a=0,b=0,c=0;
	double result;
	for(wordIter1=word1.begin(),wordIter2=word2.begin();wordIter1!=word1.end(),wordIter2!=word2.end();wordIter1++,wordIter2++){
		a=(*wordIter1).second*(*wordIter2).second+a;
		b=pow((double)(*wordIter1).second,2)+b;
		c=pow((double)(*wordIter2).second,2)+c;
	}
	cout<<a<<endl;
	cout<<b<<endl;
	cout<<c<<endl;
	cout<<pow(b,1.0/2.0)*pow(c,1.0/2.0);

	result=a/(pow(b,1.0/2.0)*pow(c,1.0/2.0));
	cout<<"余弦相似度为:  "<<result;
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值