📅  最后修改于: 2020-10-16 02:27:23             🧑  作者: Mango
在这里,我们将学习如何在Gensim的帮助下创建词频-反文档频度(TF-IDF)矩阵。
这是术语频率-逆文档频率模型,它也是一个词袋模型。它与常规语料库不同,因为它降低了权标的权重,即在文档中频繁出现的单词。在初始化期间,此tf-idf模型算法期望训练整数具有整数值(例如词袋模型)。
然后,在转换时,它接受一个矢量表示并返回另一个矢量表示。输出向量将具有相同的维数,但稀有特征的值(在训练时)将增加。它基本上将整数值向量转换为实值向量。
TF-IDF模型通过以下两个简单步骤来计算tfidf-
在第一步中,模型将把诸如TF(术语频率)之类的本地成分与诸如IDF(逆文档频率)之类的全局成分相乘。
一旦完成乘法运算,下一步TTFDF模型会将结果标准化为单位长度。
由于以上两个步骤,文档中经常出现的单词将被加权。
在这里,我们将实现一个示例,以了解如何获取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”一词出现在两个文档中,并且已经过加权。同样,在所有文档中都出现“您”一词,并将其全部删除。