(2-2)基于内容的推荐:TF-IDF(词频-逆文档频率)

2.2  TF-IDF(词频-逆文档频率)

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于评估文本中词语重要性的统计算法,它结合了词频(TF)和逆文档频率(IDF)两个指标,用于衡量一个词语在文档集中的重要程度。

  1. 词频(TF):指的是一个词语在文档中出现的频率。通常,一个词语在文档中出现的次数越多,它对文档的重要性就越高。词频可以通过简单地计算一个词语在文档中出现的次数来获取。
  2. 逆文档频率(IDF):指的是一个词语在整个文档集中的稀有程度。它是通过文档集中包含该词语的文档数目的倒数来计算的。逆文档频率可以用来衡量一个词语是否具有区分度,即它在整个文档集中的普遍程度。

TF-IDF的计算公式如下:

TF-IDF = TF * IDF

其中,TF是词频,IDF是逆文档频率。

通过计算一个词语的TF-IDF值,我们可以确定该词语在文档中的重要性。当一个词语的词频较高且在整个文档集中出现的次数较少时,它的TF-IDF值将更高,表示它在该文档中具有更高的重要性。

TF-IDF常用于信息检索、文本挖掘和推荐系统等任务中,用于计算文档之间的相似度或衡量词语的重要性,以便于进行文本分析和自动化处理。

2.2.1  词频计算

在推荐系统中,词频计算是一种基础的文本特征计算方法,用于评估文本中词语的重要性和频率。词频(简称TF)是指一个词语在文本中出现的频率,用于衡量一个词语在给定文本中的重要程度。词频可以通过简单地计算一个词语在文本中出现的次数来获取。

在Python中,可以使用各种库和方法来计算词频,例如下面的实例演示了使用库nltk来计算词频的过程。

源码路径:daima/2/cipin.py

import nltk
from nltk import FreqDist

# 推荐系统的用户评价数据
reviews = [
    "This movie is great!",
    "I love this movie so much.",
    "The acting in this film is superb.",
    "The plot of this movie is confusing.",
    "I didn't enjoy this film."
]

# 将所有评价合并为一个字符串
text = ' '.join(reviews)

# 分词
tokens = nltk.word_tokenize(text)

# 计算词频
freq_dist = FreqDist(tokens)

# 输出词频统计结果
for word, frequency in freq_dist.items():
    print(f"Word: {word}, Frequency: {frequency}")

在上述代码中,有一些用户对电影的评价数据存储在reviews列表中。首先,将所有评价合并为一个字符串,然后使用nltk.word_tokenize()方法对字符串进行分词,得到一个词语列表。接下来,我们使用FreqDist类计算词频,生成一个词频分布对象。最后,通过遍历词频分布对象,打印输出每个词语及其对应的词频。执行后会输出:

Word: This, Frequency: 1
Word: movie, Frequency: 3
Word: is, Frequency: 3
Word: great, Frequency: 1
Word: !, Frequency: 1
Word: I, Frequency: 2
Word: love, Frequency: 1
Word: this, Frequency: 4
Word: so, Frequency: 1
Word: much, Frequency: 1
Word: ., Frequency: 4
Word: The, Frequency: 2
Word: acting, Frequency: 1
Word: in, Frequency: 1
Word: film, Frequency: 2
Word: superb, Frequency: 1
Word: plot, Frequency: 1
Word: of, Frequency: 1
Word: confusing, Frequency: 1
Word: did, Frequency: 1
Word: n't, Frequency: 1
Word: enjoy, Frequency: 1

本实例展示了如何使用词频计算来分析用户评价数据。通过统计词语的频率,我们可以了解哪些词语在用户评价中出现得更频繁,从而帮助推荐系统更好地理解用户的喜好和偏好。基于词频的分析结果,推荐系统可以提供与用户评价相关的电影推荐或者进一步进行文本情感分析等任务。

2.2.2  逆文档频率计算

逆文档频率(Inverse Document Frequency,简称IDF)是推荐系统中常用的一种特征权重计算方法。它衡量了一个词语在文本集合中的重要程度。在推荐系统中,逆文档频率通常与词频(Term Frequency,简称TF)结合使用,形成TF-IDF(Term Frequency-Inverse Document Frequency)特征表示。TF-IDF综合考虑了一个词语在当前文本中的重要程度(通过TF),以及它在整个文本集合中的普遍性和独特性(通过IDF)。

下面是一个使用Python计算逆文档频率的例子,假设有一个文本集合存储在列表documents中。

源码路径:daima/2/niwen.py

import math
from collections import Counter

# 文本集合
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# 分词并去重
word_sets = [set(document.lower().split()) for document in documents]

# 计算逆文档频率
idf = {}
num_documents = len(documents)
for word in set(word for word_set in word_sets for word in word_set):
    count = sum(1 for word_set in word_sets if word in word_set)
    idf[word] = math.log(num_documents / (count + 1))

# 输出逆文档频率
for word, idf_value in idf.items():
    print(f"Word: {word}, IDF: {idf_value}")

在上述代码中,首先对每个文本进行分词,并去除重复的词语,得到一个词语集合。然后,我们遍历所有词语的集合,计算每个词语的逆文档频率。逆文档频率的计算公式是log(N / (n + 1)),其中N表示文本集合中的文档数,n表示包含当前词语的文档数。最后,打印输出每个词语及其对应的逆文档频率。执行后会输出:

Word: this, IDF: -0.2231435513142097
Word: third, IDF: 0.6931471805599453
Word: second, IDF: 0.6931471805599453
Word: document?, IDF: 0.6931471805599453
Word: first, IDF: 0.28768207245178085
Word: is, IDF: -0.2231435513142097
Word: one., IDF: 0.6931471805599453
Word: document, IDF: 0.6931471805599453
Word: and, IDF: 0.6931471805599453
Word: document., IDF: 0.28768207245178085
Word: the, IDF: -0.2231435513142097

注意:通过逆文档频率的计算,可以帮助推荐系统识别那些在整个文本集合中相对不常见但在当前文本中出现较多的词语。这些词语通常具有一定的独特性和重要性,因此在推荐系统中起到一定的权重作用。通过将逆文档频率与词频结合,可以构建出更具表达力的特征表示,用于推荐系统的任务,例如文本相似度计算、文本分类等。

2.2.3  TF-IDF权重计算

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的特征权重计算方法,通过将词频与逆文档频率相乘得到的特征权重,用于衡量一个词语在文本中的重要性。TF-IDF能够突出在当前文本中频繁出现但在整个文本集合中相对稀缺的词语,因此可以捕捉到具有区分度和重要性的特征。在推荐系统中,TF-IDF常用于文本特征表示和相似度计算。例如下面是一个在Python程序中计算TF-IDF权重的例子。

源码路径:daima/2/quan.py

from sklearn.feature_extraction.text import TfidfVectorizer

# 文本集合
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# 创建TF-IDF向量化器
vectorizer = TfidfVectorizer()

# 对文本集合进行向量化
tfidf_matrix = vectorizer.fit_transform(documents)

# 输出词语和对应的TF-IDF权重
feature_names = vectorizer.get_feature_names()
for i in range(len(documents)):
    doc = documents[i]
    feature_index = tfidf_matrix[i, :].nonzero()[1]
    tfidf_scores = zip(feature_index, [tfidf_matrix[i, x] for x in feature_index])
    for word_index, score in tfidf_scores:
        print(f"Document: {doc}, Word: {feature_names[word_index]}, TF-IDF Score: {score}")

在上述代码中,使用了库scikit-learn中的类TfidfVectorizer来计算TF-IDF权重。首先,创建了一个TF-IDF向量化器对象vectorizer。然后,将文本集合documents传入向量化器的fit_transform方法,得到TF-IDF矩阵tfidf_matrix。最后,遍历每个文本和对应的TF-IDF向量,打印输出词语和对应的TF-IDF权重。执行后会输出:

Document: This is the first document., Word: document, TF-IDF Score: 0.46979138557992045
Document: This is the first document., Word: first, TF-IDF Score: 0.5802858236844359
Document: This is the first document., Word: the, TF-IDF Score: 0.38408524091481483
Document: This is the first document., Word: is, TF-IDF Score: 0.38408524091481483
Document: This is the first document., Word: this, TF-IDF Score: 0.38408524091481483
Document: This document is the second document., Word: second, TF-IDF Score: 0.5386476208856763
Document: This document is the second document., Word: document, TF-IDF Score: 0.6876235979836938
Document: This document is the second document., Word: the, TF-IDF Score: 0.281088674033753
Document: This document is the second document., Word: is, TF-IDF Score: 0.281088674033753
Document: This document is the second document., Word: this, TF-IDF Score: 0.281088674033753
Document: And this is the third one., Word: one, TF-IDF Score: 0.511848512707169
Document: And this is the third one., Word: third, TF-IDF Score: 0.511848512707169
Document: And this is the third one., Word: and, TF-IDF Score: 0.511848512707169
Document: And this is the third one., Word: the, TF-IDF Score: 0.267103787642168
Document: And this is the third one., Word: is, TF-IDF Score: 0.267103787642168
Document: And this is the third one., Word: this, TF-IDF Score: 0.267103787642168
Document: Is this the first document?, Word: document, TF-IDF Score: 0.46979138557992045
Document: Is this the first document?, Word: first, TF-IDF Score: 0.5802858236844359
Document: Is this the first document?, Word: the, TF-IDF Score: 0.38408524091481483
Document: Is this the first document?, Word: is, TF-IDF Score: 0.38408524091481483
Document: Is this the first document?, Word: this, TF-IDF Score: 0.38408524091481483

TF-IDF权重的计算可以帮助推荐系统识别那些在当前文本中频繁出现但在整个文本集合中相对稀缺的词语,从而突出文本的特征和重要性。这种特征权重计算方法常用于推荐系统的文本表示、相似度计算和内容过滤等任务。

未完待续

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值