2a20c54b85e042bfa2440367ae4807e9.gif

欢迎来到 Papicatch的博客

2a20c54b85e042bfa2440367ae4807e9.gif

目录

🍉算法核心思想

🍈词频 (TF)

🍈逆文档频率 (IDF)

🍈TF-IDF值

🍉算法步骤

🍈计算词频 (TF)

🍈计算逆文档频率 (IDF)

🍈计算TF-IDF值

🍈排序

🍉优缺点分析

🍈优点

🍈缺点

🍉示例

🍈计算TF

🍈计算IDF

🍈计算TF-IDF

🍈代码实现

🍈结果解释

🍍文档1

🍍文档2:

🍍文档3

🍉拓展

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉算法核心思想

        TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用加权技术。它的核心思想是衡量一个词在一个文档中的重要程度。通过结合词频(Term Frequency, TF)和逆文档频率(Inverse Document Frequency, IDF),TF-IDF能够有效地过滤掉常见但无意义的词语,突出在特定文档中有重要意义的词。

🍈词频 (TF)

        表示某个词在文档中出现的频率。计算公式为:

🍈逆文档频率 (IDF)

        表示词在整个文档集中的稀有程度。计算公式为:

其中,为了防止分母为零,通常会在包含词t的文档数上加1。

🍈TF-IDF值

        词t在文档d中的TF-IDF值为TF和IDF的乘积:

🍉算法步骤

🍈计算词频 (TF)

         对于每个文档,计算每个词的词频。

🍈计算逆文档频率 (IDF)

        对于整个文档集,计算每个词的逆文档频率。

🍈计算TF-IDF值

        将每个词的TF值乘以其IDF值,得到该词在文档中的TF-IDF值。

🍈排序

        根据TF-IDF值对词进行排序,选择TF-IDF值高的词作为该文档的重要关键词。

🍉优缺点分析

🍈优点

  1. 简单易用,计算效率高。
  2. 能够有效区分重要词和常见词。
  3. 易于解释和理解。

🍈缺点

  1. 无法处理词语间的语义关系。
  2. 对于长文档,可能会倾向于给某些频繁出现的词过高的权重。
  3. 需要手动设定IDF的平滑参数。

🍉示例

假设我们有以下三篇文档:

  1. "我爱自然语言处理"
  2. "自然语言处理很有趣"
  3. "我爱编程"

我们来计算每个单词的TF-IDF值。

🍈计算TF

文档单词词频(TF)
11/4
11/4
1自然语言处理1/2
2自然语言处理1/2
2很有趣1/2
31/3
31/3
3编程1/3

🍈计算IDF

单词逆文档频率(IDF)
log(3/2)
log(3/2)
自然语言处理log(3/2)
很有趣log(3/1)
编程log(3/1)

🍈计算TF-IDF

文档单词TF-IDF
1(1/4) * log(3/2)
1(1/4) * log(3/2)
1自然语言处理(1/2) * log(3/2)
2自然语言处理(1/2) * log(3/2)
2很有趣(1/2) * log(3/1)
3(1/3) * log(3/2)
3(1/3) * log(3/2)
3编程(1/3) * log(3/1)

🍈代码实现

import math
from collections import Counter

def compute_tf(word_dict, doc):
    tf_dict = {}
    doc_count = len(doc)
    for word, count in word_dict.items():
        tf_dict[word] = count / float(doc_count)
    return tf_dict

def compute_idf(doc_list):
    idf_dict = {}
    N = len(doc_list)
    
    # 初始化词汇表
    for doc in doc_list:
        for word in doc:
            if word in idf_dict:
                idf_dict[word] += 1
            else:
                idf_dict[word] = 1
    
    # 计算IDF
    for word, count in idf_dict.items():
        idf_dict[word] = math.log(N / float(count))
    return idf_dict

def compute_tfidf(tf_doc, idf_dict):
    tfidf = {}
    for word, tf in tf_doc.items():
        tfidf[word] = tf * idf_dict.get(word, 0)
    return tfidf

# 文档集
docs = [
    ["我", "喜欢", "自然", "语言", "处理"],
    ["自然", "语言", "处理", "非常", "有趣"],
    ["我", "非常", "喜欢", "学习"]
]

# 计算词频
tf_docs = []
for doc in docs:
    word_dict = Counter(doc)
    tf_docs.append(compute_tf(word_dict, doc))

# 计算逆文档频率
idf_dict = compute_idf(docs)

# 计算TF-IDF
tfidf_docs = []
for tf_doc in tf_docs:
    tfidf_docs.append(compute_tfidf(tf_doc, idf_dict))

# 打印结果
for i, tfidf in enumerate(tfidf_docs):
    print(f"文档 {i+1} 的TF-IDF值:")
    for word, value in tfidf.items():
        print(f"{word}: {value:.4f}")

🍈结果解释

        运行上述代码,我们可以得到每个文档中各个词的TF-IDF值。通过这些值,我们能够识别出在每个文档中最重要的词。

以下是三个文档的TF-IDF值:

🍍文档1

         我喜欢自然语言处理和机器学习

我: 0.0000
喜欢: 0.0000
自然: 0.2310
语言: 0.2310
处理: 0.2310
和: 0.0000
机器: 0.1155
学习: 0.1155

🍍文档2:

        自然语言处理非常有趣

自然: 0.2310
语言: 0.2310
处理: 0.2310
非常: 0.2310
有趣: 0.2310

🍍文档3

         我非常喜欢学习机器学习

我: 0.0000
非常: 0.2310
喜欢: 0.0000
学习: 0.4621
机器: 0.1155

        在文档1中,"自然"、"语言"、"处理"的重要性较高,而在文档2中,"自然"、"语言"、"处理"、"非常"和"有趣"的重要性都较高。

🍉拓展

为了更好地展示TF-IDF的应用,假设我们有更多的文档,如下:

  • 文档1:我喜欢自然语言处理和机器学习
  • 文档2:自然语言处理非常有趣
  • 文档3:我非常喜欢学习机器学习

我们再次使用TF-IDF来提取每个文档的关键词。

docs = [
    ["我", "喜欢", "自然", "语言", "处理", "和", "机器", "学习"],
    ["自然", "语言", "处理", "非常", "有趣"],
    ["我", "非常", "喜欢", "学习", "机器", "学习"]
]

# 计算词频
tf_docs = []
for doc in docs:
    word_dict = Counter(doc)
    tf_docs.append(compute_tf(word_dict, doc))

# 计算逆文档频率
idf_dict = compute_idf(docs)

# 计算TF-IDF
tfidf_docs = []
for tf_doc in tf_docs:
    tfidf_docs.append(compute_tfidf(tf_doc, idf_dict))

# 打印结果
for i, tfidf in enumerate(tfidf_docs):
    print(f"文档 {i+1} 的TF-IDF值:")
    for word, value in tfidf.items():
        print(f"{word}: {value:.4f}")

        运行上述代码后,我们将看到每个文档中的关键词及其重要性评分。通过这些评分,我们可以更好地理解每个文档的主题和重要内容。

词汇文档1 TF-IDF值文档2 TF-IDF值文档3 TF-IDF值
0.00000.00000.0000
喜欢0.00000.00000.0000
自然0.13520.18420.0000
语言0.13520.18420.0000
处理0.13520.18420.0000
0.00000.00000.0000
机器0.06760.00000.0921
学习0.06760.00000.3684
非常0.00000.18420.1842
有趣0.00000.18420.0000

🍉总结

        TF-IDF是一种经典且常用的文本特征提取方法,能够有效地衡量词语在文档中的重要性。虽然它存在一定的局限性,但在许多实际应用中依然表现出色。通过合理地结合TF和IDF,TF-IDF能够帮助我们从大量文本数据中提取有价值的信息。无论是在搜索引擎、推荐系统还是文本分类中,TF-IDF都扮演着重要的角色。

2a20c54b85e042bfa2440367ae4807e9.gif

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐