TF-IDF 找出文章关键词

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]

你可能感兴趣的:(python,大数据学习之旅,tf-idf,python)