- 53
- 0
- 约1.44万字
- 约 18页
- 2021-06-20 发布于湖南
- 举报
基于 K-Means 的文本聚类算法
TF-IDF (term frequency –inverse document frequency )
这是一种用于信息检索的一种常用加权技术。它是一种统计方法,用以评估一个字词
对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件
中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
假如一篇文件的总词语数是 100 个,而词语“母牛”出现了 3 次,那么“母牛”一词
在该文件中的词频就是 0.03 (3/100) 。一个计算文件频率 (DF) 的方法是测定有多少份
文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词
在 1,000 份文件出现过,而文件总数是 10,000,000 份的话,其文件频率就是 0.0001
(1000/10,000,000) 。最后, TF-IDF 分数就可以由计算词频除以文件频率而得到。以上面
的例子来说,“母牛”一词在该文件集的 TF- IDF 分数会是 300 (0.03/0.0001) 。这条公
式的另一个形式是将文件频率取对数。
具体的计算原理,请参考维基百科 tf –idf 条目。下面简单介绍下基本的计算步骤:
1, 文档预处理 :1 )文档分词; 2 )移除停用词; 3 )单词正规化处理
2 ,分出的单词就作为索引项(或单词表),它们代表的就是向量空间的项向量
3 ,计算项权值:这包括要计算 1)词频 ; 2) 倒排文件频率; 3)TF-IDF 权值
4, 计算文档之间的相似度,一般用余弦相似度 (cosine similarity) 一同使用于向量
空间模型中,用以判断两份文件之间的相似性
#include ITokeniser.h
#include
class TFIDFMeasure
{
private:
StrVec _docs;// 文档集合,每一行字符串代表一份文档
int _numDocs;// 文档数目
int _numTerms;// 单词数目
StrVec _terms;// 单词集合
Int2DVec _termFreq;// 每个单词出现在每份文档中的频率
Double2DVec _termWeight;// 每个单词在每份文档的权重
IntVec _maxTermFreq;// 记录每一份文档的最大词频
IntVec _docFreq;// 出现单词的文档频率
ITokeniser* _tokenizer;// 分词器
map _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 freq); // 实际统计词频函数
int CountWords(string word, const StrVec words);// 统计词数
int GetTermIndex(const stri
原创力文档

文档评论(0)