- Gensim 教程
- Gensim - 首页
- Gensim - 简介
- Gensim - 入门
- Gensim - 文档和语料库
- Gensim - 向量和模型
- Gensim - 创建词典
- 创建词袋 (BoW) 语料库
- Gensim - 变换
- Gensim - 创建 TF-IDF 矩阵
- Gensim - 主题建模
- Gensim - 创建 LDA 主题模型
- Gensim - 使用 LDA 主题模型
- Gensim - 创建 LDA Mallet 模型
- Gensim - 文档和 LDA 模型
- Gensim - 创建 LSI 和 HDP 主题模型
- Gensim - 开发词嵌入
- Gensim - Doc2Vec 模型
- Gensim 有用资源
- Gensim - 快速指南
- Gensim - 有用资源
- Gensim - 讨论
Gensim - 创建 TF-IDF 矩阵
在这里,我们将学习如何借助 Gensim 创建词频-逆文档频率 (TF-IDF) 矩阵。
什么是 TF-IDF?
它是词频-逆文档频率模型,也是一种词袋模型。它与常规语料库不同,因为它会降低跨文档频繁出现的标记(即单词)的权重。在初始化期间,此 tf-idf 模型算法需要一个具有整数值的训练语料库(例如词袋模型)。
然后,在转换时,它获取向量表示并返回另一个向量表示。输出向量将具有相同的维度,但稀有特征(在训练时)的值将被增加。它基本上将整数值向量转换为实数值向量。
它是如何计算的?
TF-IDF 模型通过以下两个简单步骤计算 tfidf:
步骤 1:乘以局部和全局成分
在此第一步中,模型将把局部成分(如 TF(词频))与全局成分(如 IDF(逆文档频率))相乘。
步骤 2:标准化结果
完成乘法后,在下一步中,TFIDF 模型将结果标准化为单位长度。
由于以上两个步骤,跨文档频繁出现的单词的权重将降低。
如何获取 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) 应用于 **models.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”出现在两个文档中,并且权重降低了。同样,出现在所有文档中的单词“you”被完全删除了。