#include ""#include <map>class TFIDFMeasure{private: StrVec _docs;//文档集合,每一行字符串代表一份文档 int _numDocs;//文档数目 int _numTerms;//单词数目 StrVec _terms;//单词集合 Int2DVec _termFreq;//每个单词出现在每份文档中的频率 Double2DVec _termWeight;//每个单词在每份文档的权重 IntVec _maxTermFreq;//记录每一份文档的最大词频 IntVec _docFreq;//出现单词的文档频率 ITokeniser* _tokenizer;//分词器 map<string,int> _wordsIndex;//单词映射表,保存每一个单词及其对应的下标public: TFIDFMeasure(const StrVec& documents,ITokeniser* tokeniser);public: ~TFIDFMeasure(void);protected: void Init();//初始化TF-IDF计算器 void GenerateTerms(const StrVec& docs,StrVec& terms);//分词处理 void GenerateTermFrequency();//计算词频 void GenerateTermWeight();//计算词的权重 void GetWordFrequency(string& input,map<string,int>& freq); //实际统计词频函数 int CountWords(string& word, const StrVec& words);//统计词数 int GetTermIndex(const string& term);//查询词语对应的下标 puteTermWeight(int term, int doc);//计算词语在指定文档中的权重值 double GetTermFrequency(int term, int doc);//获取词语在指定文档的词频 double GetInverseDocumentFrequency(int term);//计算倒排文件频率public: inline int NumTerms()const { return this->_numTerms; } void GetTermVector(int doc,DoubleVec& vec);//获取项向量};TF-IDF具体实现代码:#include ""#include <limits>#include <cmath>using namespace std;TFIDFMeasure::~TFIDFMeasure(void){ //销毁分词器 if (this->_tokenizer!=NULL) { delete _tokenizer; _tokenizer = NULL; } //清空数据 (); (); ();}TFIDFMeasure::TFIDFMeasure(const StrVec& documents,ITokeniser* tokeniser){ _docs=documents; _numDocs=(); _tokenizer = tokeniser; this->Init();}void TFIDFMeasure::GenerateTerms(const StrVec& docs,StrVec& terms){ for (int i=0; i < () ; i++) { StrVec words; _tokenizer->Partition(docs[i],words);//分词 for (int j=0; j < (); j++) { //不在单词表中,则加入 if (find((),(),words[j])==())
k-means算法实现 来自淘豆网m.daumloan.com转载请标明出处.