如何从sklearn中的TF * IDF值获取字数

时间:2015-08-27 15:09:23

标签: python nlp scikit-learn tf-idf

我想仅使用一组句子的tf * idf矩阵来获取给定句子中单词的计数。我使用了sklearn.feature_extraction.text中的TfidfVectorizer。

示例:

from sklearn.feature_extraction.text import TfidfVectorizer

sentences = ("The sun is shiny i like the sun","I have been exposed to sun")
vect = TfidfVectorizer(stop_words="english",lowercase=False)
tfidf_matrix = vect.fit_transform(sentences).toarray()

我希望能够计算出这个词的次数" sun"仅使用tfidf_matrix [0]并且可能使用vect.idf_在第一个句子(即2)中出现。 我知道有无限的方法可以获得术语频率和字数,但我有一个特殊情况,我只有一个tf idf矩阵。 我已经尝试将单词" sun"的tf idf值除以在第一句中用它的idf值得到tf。然后我将tf乘以句子中的单词总数来得到单词count。不幸的是,我得到了错误的价值观。

1 个答案:

答案 0 :(得分:1)

直观的做法就是你所尝试的:将每个 tf 值乘以你正在检查的句子中的单词数。但是,我认为这里的关键观察是每一行都按其欧氏长度进行了标准化。因此,将每一行乘以该句子中的单词数最多近似非规范化行,这就是为什么你得到奇怪的值。 AFAIK,你不能在不知道每个原始行的规范的情况下对tf * idf矩阵进行非规范化。这主要是因为有无数个矢量可以映射到任何一个规范化矢量。因此,如果没有规范,您无法检索原始矢量的正确幅度。 See this answer了解我的意思。

话虽如此,我认为在我们的案例中有一个解决方法。我们至少可以检索每个句子中术语计数的标准化比率,即太阳出现的次数是闪亮的两倍。我发现规范化每一行使得tf值的总和为1而然后将这些值乘以禁用词过滤句子的长度似乎检索原始单词计数。

演示:

sentences = ("The sun is shiny i like the sun","I have been exposed to sun")
vect = TfidfVectorizer(stop_words="english",lowercase=False)
mat = vect.fit_transform(sentences).toarray()
q = mat / vect.idf_
sums = np.ones((q.shape[0], 1))
lens = np.ones((q.shape[0], 1))
for ix in xrange(q.shape[0]):
    sums[ix] = np.sum(q[ix,:])
    lens[ix] = len([x for x in sentences[ix].split() if unicode(x) in vect.get_feature_names()]) #have to filter out stopwords
sum_to_1 = q / sums
tf = sum_to_1 * lens
print tf

的产率:

[[ 1.  0.  1.  1.  2.]
 [ 0.  1.  0.  0.  1.]]

我尝试了一些更复杂的句子,似乎工作正常。如果我错过了什么,请告诉我。