我想仅使用一组句子的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。不幸的是,我得到了错误的价值观。
答案 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.]]
我尝试了一些更复杂的句子,似乎工作正常。如果我错过了什么,请告诉我。