TF(词频):一个词在文章中出现的次数
词频标准化1:按占比处理
TF = 某个词在文章中出现的次数 / 文章的总词数
词频标准化2:按最大值处理
TF = 某个词在文章中出现的次数 / 该文出现次数最多的词的出现次数
IDF(反文档频率):log( 语料库的文档总数 / 包含该词的文档数 + 1)
TF-IDF = TF * IDF
TF-IDF与一个词在文档中的出现次数成正比,与包含该词的文档数成反比
相似文章
1.使用TF-IDF 算法,找出两篇文章的关键词:term-weight
2.每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个结合中的词的词频(为了避免文章长度的差异,可以使用相对词频)
3.生成两篇文章各自的词频向量
4.计算两个向量的余弦相似度,值越大就表示越相似
优点:简单快速,结果比较符合实际情况
缺点:单纯以词频做衡量标准,不够全面,有时重要的词可能出现的次数并不多(这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的,一种解决方法是,对全文的第一段和每一段的第一句话,给予较大权重)
import os
import math
# 文件夹
file_path = './allfiles'
# 定义每个词的文档
doc_words = dict()
# 标识文章数量
doc_num = 0
# 获取停用词集合
stop_set = set()
with open('stop_list.txt','r',encoding='utf-8') as f:
for word_list in f.readlines():
word = word_list[0]
stop_set.add(word)
# 读取文章
for filename in os.listdir(file_path):
if doc_num % 100 == 0:
print('%s docs finished!' % doc_num)
with open(file_path+'/'+filename,'r',encoding='utf-8') as f:
# 定义字典存词频
word_freq = dict()
# 按照 占比处理tf,文章的总次数
sum_cnt = 0
# 按照最大值处理tf,该词在文章中出现最多的词
max_tf = 0
# 按行读取每个文章,并按空格切词
for line in f.readlines():
words = line.strip(' ')
# 判断每个词是否是停用词
for word in words:
if len(word.strip()) < 1 or word in stop_set:
continue
if word_freq.get(word, -1) == -1:
word_freq[word] = 1
else:
word_freq[word] += 1
# 文章中出现次数最多的
if word_freq[word] > max_tf:
max_tf = word_freq[word]
# 文章总词数
sum_cnt += 1
for word in word_freq.keys():
# 按占比处理
#word_freq[word] /= sum_cnt
# 按最大值处理
word_freq[word] /= max_tf
#
doc_words[filename] = word_freq
# 文章数量
doc_num += 1
# 统计每个词的doc_freq
doc_freq = dict()
for doc in doc_words.keys():
# 获取单词对应的词频
for word in doc_words[doc].keys():
if doc_freq.get(word, -1) == -1:
doc_freq[word] = 1
else:
doc_freq[word] += 1
# 套用tf公式
for word in doc_freq.keys():
doc_freq[word] = math.log(doc_num/doc_freq[word]+1,10)
# print(doc_freq)
# 按照升序获取前十个
print(sorted(doc_freq.items(),key= lambda x:x[1],reverse=False))
print(sorted(doc_freq.items(),key= lambda x:x[1],reverse=True))
# 套用 tf * idf 公式
for doc in doc_words.keys():
for word in doc_words[doc].keys():
doc_words[doc][word] * doc_freq[word]