📜  理解TF-IDF(词频-逆文档频率)

📅  最后修改于: 2022-05-13 01:55:43.254000             🧑  作者: Mango

理解TF-IDF(词频-逆文档频率)

TF-IDF代表记录的词频逆文档频率。它可以定义为计算系列或语料库中的单词与文本的相关程度。含义与单词在文本中出现的次数成比例增加,但会通过语料库(数据集)中的词频进行补偿。

术语:

  • 术语频率:在文档 d 中,频率表示给定单词 t 的实例数。因此,我们可以看到,当一个词出现在文本中时,它变得更加相关,这是合理的。由于术语的顺序并不重要,我们可以使用向量来描述术语模型包中的文本。对于论文中的每个特定术语,都有一个条目,其值为术语频率。

出现在文档中的术语的权重与术语频率成正比。

tf(t,d) = count of t in d / number of words in d
  • 文档频率:测试文本在整个语料库中的含义,与TF非常相似。唯一的区别是在文档 d 中,TF 是词条 t 的频率计数器,而 df 是词条 t 在文档集 N 中出现的次数。换句话说,出现该词的论文数量为 DF。
df(t) = occurrence of t in documents
  • 逆文档频率:主要是测试单词的相关性。搜索的主要目的是找到符合需求的适当记录。由于 tf 认为所有术语都同等重要,因此不仅可以使用术语频率来衡量论文中术语的权重。首先,通过计算包含术语 t 的文档数量来找到术语 t 的文档频率:
df(t) = N(t)
where
df(t) = Document frequency of a term t
N(t) = Number of documents containing the term t

术语频率仅是单个文档中术语的实例数;虽然文档的频率是该词出现的单独文档的数量,但它取决于整个语料库。现在我们来看看逆纸的频率定义。词的IDF是语料库中由文本出现的频率分隔的文档数。

idf(t) = N/ df(t) = N/N(t)

更常见的词应该被认为不太重要,但元素(最确定的整数)似乎太苛刻了。然后我们取论文的逆频率的对数(以 2 为底)。所以 t 项的 if 变为:

idf(t) = log(N/ df(t))
  • 计算: Tf-idf 是确定术语对系列或语料库中的文本的重要性的最佳指标之一。 tf-idf 是一种权重系统,它根据词频 (tf) 和互惠文档频率 (tf) (idf) 为文档中的每个词分配权重。权重得分较高的词被认为更重要。

通常,tf-idf 权重由两个项组成 -

  1. 归一化词频 (tf)
  2. 逆向文档频率 (idf)
tf-idf(t, d) = tf(t, d) * idf(t)

在Python中,tf-idf 值可以使用sklearn模块中的TfidfVectorizer()方法计算。  

句法:

循序渐进的方法:

  • 导入模块。
Python3
# import required module
from sklearn.feature_extraction.text import TfidfVectorizer


Python3
# assign documents
d0 = 'Geeks for geeks'
d1 = 'Geeks'
d2 = 'r2j'
  
# merge documents into a single corpus
string = [d0, d1, d2]


Python3
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)


Python3
# get idf values
print('\nidf values:')
for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):
    print(ele1, ':', ele2)


Python3
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf value:')
print(result)
  
# in matrix form
print('\ntf-idf values in matrix form:')
print(result.toarray())


Python3
# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'Geeks for geeks'
d1 = 'Geeks'
d2 = 'r2j'
  
# merge documents into a single corpus
string = [d0, d1, d2]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get idf values
print('\nidf values:')
for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):
    print(ele1, ':', ele2)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf value:')
print(result)
  
# in matrix form
print('\ntf-idf values in matrix form:')
print(result.toarray())


Python3
# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'geek1'
d1 = 'geek2'
d2 = 'geek3'
d3 = 'geek4'
  
# merge documents into a single corpus
string = [d0, d1, d2, d3]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)


Python3
# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'Geeks for geeks!'
d1 = 'Geeks for geeks!'
  
  
# merge documents into a single corpus
string = [d0, d1]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)


Python3
# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign corpus
string = ['Geeks geeks']*5
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)


  • 从文档中收集字符串并创建一个包含来自文档d0、d1d2的字符串集合的语料库。

蟒蛇3

# assign documents
d0 = 'Geeks for geeks'
d1 = 'Geeks'
d2 = 'r2j'
  
# merge documents into a single corpus
string = [d0, d1, d2]
  • fit_transform()方法获取 tf-idf 值。

蟒蛇3

# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  • 显示语料库中存在的单词的 idf 值。

蟒蛇3

# get idf values
print('\nidf values:')
for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):
    print(ele1, ':', ele2)

输出:


  • 显示 tf-idf 值以及索引。

蟒蛇3

# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf value:')
print(result)
  
# in matrix form
print('\ntf-idf values in matrix form:')
print(result.toarray())

输出:


结果变量由唯一词和 tf-if 值组成。可以使用下图详细说明:


从上图可以生成下表:

DocumentWordDocument IndexWord Indextf-idf value
d0for000.549
d0geeks010.549
d1geeks111.000
d2r2j221.000

下面是一些描述如何从语料库计算单词的 tf-idf 值的示例:

示例 1:以下是基于上述方法的完整程序:

蟒蛇3

# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'Geeks for geeks'
d1 = 'Geeks'
d2 = 'r2j'
  
# merge documents into a single corpus
string = [d0, d1, d2]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get idf values
print('\nidf values:')
for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):
    print(ele1, ':', ele2)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf value:')
print(result)
  
# in matrix form
print('\ntf-idf values in matrix form:')
print(result.toarray())

输出:


示例 2:这里,tf-idf 值是从具有唯一值的语料库中计算出来的。  

蟒蛇3

# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'geek1'
d1 = 'geek2'
d2 = 'geek3'
d3 = 'geek4'
  
# merge documents into a single corpus
string = [d0, d1, d2, d3]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)

输出:


示例 3:在这个程序中,tf-idf 值是从具有相似文档的语料库中计算出来的。

蟒蛇3

# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign documents
d0 = 'Geeks for geeks!'
d1 = 'Geeks for geeks!'
  
  
# merge documents into a single corpus
string = [d0, d1]
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)

输出:


示例 4:下面是我们尝试计算单个单词的 tf-idf 值的程序, geeks在多个文档中重复多次。

蟒蛇3

# import required module
from sklearn.feature_extraction.text import TfidfVectorizer
  
# assign corpus
string = ['Geeks geeks']*5
  
# create object
tfidf = TfidfVectorizer()
  
# get tf-df values
result = tfidf.fit_transform(string)
  
# get indexing
print('\nWord indexes:')
print(tfidf.vocabulary_)
  
# display tf-idf values
print('\ntf-idf values:')
print(result)

输出: