📜  Gensim-创建TF-IDF矩阵

📅  最后修改于: 2020-10-16 02:27:23             🧑  作者: Mango


在这里,我们将学习如何在Gensim的帮助下创建词频-反文档频度(TF-IDF)矩阵。

什么是TF-IDF?

这是术语频率-逆文档频率模型,它也是一个词袋模型。它与常规语料库不同,因为它降低了权标的权重,即在文档中频繁出现的单词。在初始化期间,此tf-idf模型算法期望训练整数具有整数值(例如词袋模型)。

然后,在转换时,它接受一个矢量表示并返回另一个矢量表示。输出向量将具有相同的维数,但稀有特征的值(在训练时)将增加。它基本上将整数值向量转换为实值向量。

如何计算?

TF-IDF模型通过以下两个简单步骤来计算tfidf-

步骤1:将本地和全局分量相乘

在第一步中,模型将把诸如TF(术语频率)之类的本地成分与诸如IDF(逆文档频率)之类的全局成分相乘。

步骤2:标准化结果

一旦完成乘法运算,下一步TTFDF模型会将结果标准化为单位长度。

由于以上两个步骤,文档中经常出现的单词将被加权。

如何获得TF-IDF权重?

在这里,我们将实现一个示例,以了解如何获取TF-IDF权重。基本上,为了获得TF-IDF权重,我们首先需要训练主体,然后在tfidf模型中应用该主体。

训练语料库

如上所述,要获得TF-IDF,我们首先需要训练我们的语料库。首先,我们需要导入所有必要的包,如下所示:

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

现在提供包含句子的列表。我们的清单中有三个句子-

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

接下来,对句子进行标记化,如下所示:

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

创建一个corpora.Dictionary()对象,如下所示:

dictionary = corpora.Dictionary()

现在将这些标记化的句子传递给dictionary.doc2bow()对象,如下所示:

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

接下来,我们将在文档中获取单词id及其频率。

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

输出

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

通过这种方式,我们已经训练了我们的语料库(单词袋语料库)。

接下来,我们需要在tfidf模型models.TfidfModel()中应用经过训练的语料库。

首先导入numpay包-

import numpy as np

现在在模型的方括号内应用我们训练有素的语料库(BoW_corpus).TfidfModel ()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

接下来,我们将在我们的tfidf建模语料库中获取单词id及其频率-

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

输出

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

从以上输出中,我们可以看到文档中单词出现频率的差异。

完整的实施实例

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

词重的差异

如上所述,在文档中更频繁出现的单词将具有较小的权重。让我们了解以上两个输出中单词权重的差异。 “ are”一词出现在两个文档中,并且已经过加权。同样,在所有文档中都出现“您”一词,并将其全部删除。