“TF-IDF”算法--从零开始写个女朋友(一)

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

什么是TF-IDF?

TF-IDF(Term Frequency–Inverse Document Frequency,词频-逆文档频率)算法是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加。但同时会随着它在语料库中出现的频率反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

算法描述

假设我们现在有一篇文章《禅与摩托车维修技术》,我们想要知道该文章的关键词是什么。

首先,我们打算提取文章中每个词语的词频(TF),打算以词频为依据进行关键词判断。但是统计之后,我们发现词频最高的几个词分别是‘的’,‘是’,‘吧’ 等我们经常见的词。这类词明显对文章统计毫无帮助,需要我们对这些词进行过滤、筛选,这些词就叫停用词(Stop Words)

在将停用词筛选过后,我们得出文章中最经常出现的几个词,分别是“禅”、“摩托车”、“维修”等等。但是如果这几个词出现的频率一样的话,是否就意味着他们作为关键词的重要程度是相等的呢?当然不是,我们可以发现,相对于“摩托车”、“维修”等词,“禅”相对于它们更少出现在其他文章中,因此我们可以认为,“禅”是该篇文章中比较重要的关键词。

如上所述,判断一个词相对文章的重要程度,除了依据该词出现的频率外,还需要根据该词在其他文档中出现的频率进行判断,且其重要程度与之成反比。对这一与在其他文章中出现频率相关的重要程度进行具体化,即为逆文档频率(IDF)

在计算出词频TF逆文档频率(IDF)后,将这两个结果相乘TF*IDF,得到的结果即为TF-IDF。一个词的TF-IDF值越大,就说明这个词相对于该文章越重要,其作为关键词的重要程度越高。

综上所述,TF-IDF算法就是一个根据词在对应文章中出现的频率以及其在其他文章中出现频率来判断其在对应文章中重要程度的算法。其重要程度与在文章中出现频率成正比,与在其他文章中出现频率成反比。

算法步骤

计算词频

计算逆文档频率

此时我们需要一个语料库,计算该词相对于语料库中其他文章的逆文档频率。逆文档频率与词语出现在其他文档中的频率成反比。

计算TF-IDF

代码实现

def TF_IDF(sentence, docs):
    tf = dict()
    idf = dict()
    tf_idf = dict()
    stop_words = ["是", "的", "呢", "吧", "啊", "呢"]

    # 计算TF
    words_cnt = dict()
    for w in sentence:
        if w in stop_words:  # 过滤停词
            continue
        words_cnt[w] = words_cnt.get(w, 0) + 1
    for w in words_cnt:
        tf[w] = words_cnt[w] / sum(words_cnt.values())

    # 计算IDF
    words_cnt_in_docs = dict()
    for w in words_cnt:
        words_cnt_in_docs[w] = 0
        for doc in docs:
            if w in doc:
                words_cnt_in_docs[w] += 1
    for w in words_cnt_in_docs:
        idf[w] = math.log(len(docs)/(words_cnt_in_docs[w]+1))

    # 计算TF-IDF
    for w in words_cnt:
        tf_idf[w] = tf[w] * idf[w]

    return tf_idf
复制代码

参考文章

猜你喜欢

转载自juejin.im/post/7031052264038989831