上节课给大家介绍了TF-IDF的计算公式,这节课方便大家理解,先用面向过程的方式,来实现这个算法。但是项目需求里面,还有动态装载语料库、维护停用词这样一些要求,后面还是需要封装成类。

代码示例

1、定义语料库

import math

corpus = [
    'my dog sat on my bed',
    'my cat sat on my knees',
]

2、分词

对语料库中的句子做分词,并统计所有词的词表。

all_words = []
vocab = set()
corpus_words = []

for sentence in corpus:
    words = sentence.strip().split(' ')
    corpus_words.append(words)
    all_words += words
    vocab.update(words)

3、计算TF

tf_list = []
for words in corpus_words:
    tf = {}
    for word in words:
        tf[word] = words.count(word) / len(words)
    tf_list.append(tf)

4、计算IDF

idf_dict = {}
N = len(corpus_words)
for word in vocab:
    num = sum([1 if word in words else 0 for words in corpus_words])
    idf_dict[word] = math.log(N/(num+1))

5、计算TF-IDF

tfidf_list = []
for tf in tf_list:
    tfidf = {}
    for word, tf_val in tf.items():
        tfidf[word] = tf_val * idf_dict[word]
    tfidf_list.append(tfidf)

6、提取topK关键词

for tfidf in tfidf_list:
    tfidf_topk = sorted([(v,k) for k,v in tfidf.items()], reverse=True)[:3]
    print([k for v,k in tfidf_topk])

好的,计算每个词的tfidf值,和根据tfidf值从大到小排序之后,提取topK关键词的功能已经完成了。但是仔细看下最终得到的结果,好像和之前分析的关键词结果不一致。这个问题其实是在介绍公式的时候,提到的为了避免除0错误,分母加了1之后,出现的一个bug,这个问题比较复杂,放在下节课来解决。

本文链接:http://www.ichenhua.cn/edu/note/552

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!