机器学习-文本-基础算法tfidf

背景

之前对tfidf处于应用的层级,本博文将从原理和实战上来对其进行阐述。

原理

白话

tfidf的核心思想:

  • 一个单词在同一个文档中出现的次数越多,说明这个词越重要
  • 一个单词出现在不同的文档中次数越多,说明这个词越不重要

tfidf的输入和输出:

  • 输入:文档分词
  • 输出:词的重要性

举例输入:
文档1:我 爱 技术 人民。
文档2:我 爱 电脑。
文档3:我 爱 加班 的 人民。

重要程度输出:
技术 = 电脑 = 加班 > 人民 > 我 = 爱

数学过程

明确一下概念:

  • tf,每篇文档的词频,比如文档1,“我”的词频就是 1 ÷ 4 = 0.25
  • df,文档词频,“人民”在三篇文档中都出现了两次,所以df = 2 ÷ 3 = 0.6666
  • idf,逆文档词频,“人民” idf = 3 ÷ 2 = 1.5,idf的数据公式里面需要加log, 也就是log (3 ÷ 2) = 0.4054651081081644

tf-idf就是tf × idf的数值。
注意:

  • tf是针对每篇文档而言的
  • idf是针对总文档数而言的

实战

# coding: utf-8
import math

docs = [
    '我 爱 技术 人民',
    '我 爱 电脑',
    '我 爱 加班 的 人民'
]

# 每篇文档的词频
def tf(word, word_count):
    return word_count.get(word, 0) / sum(word_count.values())


# 词的文档频率
def idf(word, df_count):
    return math.log(len(docs) / df_count.get(word, 0))


# 词的所有文档计数
df_count = dict()
# 词的每篇文档计数
word_count_list = list()
for index, doc in enumerate(docs):
    word_count = dict()
    word_list = doc.split(" ")
    term_word_set = set()
    for word in word_list:
        word_count[word] = word_count.get(word, 0) + 1
        if word not in term_word_set:
            df_count[word] = df_count.get(word, 0) + 1
        term_word_set.add(word)
    else:
        word_count_list.append(word_count)

print("词频计数:")
print(word_count_list)
print('df:', df_count)
print()

# 每个词的idf数值(当全局文档确定以后,每个词的idf值只有一个)
idf_dict = dict()
for word in df_count.keys():
    idf_dict[word] = idf(word, df_count)

print("全局idf计算:")
print(idf_dict)
print()
print("每篇文档tf-idf:")
for word_count in word_count_list:
    tf_idf = list()
    for word in word_count.keys():
        # 利用全局的idf,计算当前文档的tfidf
        tf_idf.append((word, tf(word, word_count) * idf_dict.get(word)))
    print(tf_idf)

在这里插入图片描述

评价

tfidf是通过词的相对频率来体现单词的重要性,是文本机器学习中常用的基础指标,经常用于对每篇文档的特征量化(即把一篇文档,通过出现的词的tf-idf的值,来表示这个文档的特征)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 MATLAB 实现 k-means 算法的示例代码: 假设我们有一组文本数据,我们将使用 k-means 算法将其聚类为 k 个簇。 首先,我们需要将文本数据转换为数值特征向量表示。这里我们使用词袋模型,将每个文档表示为一个词频向量。 ```matlab % 假设我们有 N 个文档,每个文档包含 M 个词汇 % 词汇表大小为 V N = 100; M = 500; V = 1000; % 生成随机文本数据 data = randi([0, 10], N, M); words = randi([1, V], 1, M); % 将文本数据转换为词频向量表示 tfidf_data = tfidf(data); ``` 接下来,我们可以使用 k-means 算法进行聚类。这里我们使用 MATLAB 内置的 `kmeans` 函数。 ```matlab % 聚类数为 k k = 5; % 运行 k-means 算法 [idx, centers] = kmeans(tfidf_data, k); ``` 最后,我们可以对聚类结果进行可视化展示。 ```matlab % 可视化聚类结果 gscatter(tfidf_data(:,1), tfidf_data(:,2), idx); hold on; plot(centers(:,1), centers(:,2), 'k*', 'MarkerSize', 10); legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4', 'Cluster 5', 'Centroids'); ``` 完整的 k-means 算法示例代码: ```matlab % 假设我们有 N 个文档,每个文档包含 M 个词汇 % 词汇表大小为 V N = 100; M = 500; V = 1000; % 生成随机文本数据 data = randi([0, 10], N, M); words = randi([1, V], 1, M); % 将文本数据转换为词频向量表示 tfidf_data = tfidf(data); % 聚类数为 k k = 5; % 运行 k-means 算法 [idx, centers] = kmeans(tfidf_data, k); % 可视化聚类结果 gscatter(tfidf_data(:,1), tfidf_data(:,2), idx); hold on; plot(centers(:,1), centers(:,2), 'k*', 'MarkerSize', 10); legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4', 'Cluster 5', 'Centroids'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值