首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建tf-idf值矩阵

创建tf-idf值矩阵
EN

Stack Overflow用户
提问于 2014-06-03 00:28:32
回答 2查看 6.3K关注 0票数 1

我有一组documents,比如:

代码语言:javascript
复制
D1 = "The sky is blue."
D2 = "The sun is bright."
D3 = "The sun in the sky is bright."

和一组words,如:

代码语言:javascript
复制
"sky","land","sea","water","sun","moon"

我想创建一个这样的矩阵:

代码语言:javascript
复制
   x        D1           D2         D3
sky         tf-idf       0          tf-idf
land        0            0          0
sea         0            0          0
water       0            0          0
sun         0            tf-idf     tf-idf
moon        0            0          0

类似于这里给出的示例表:http://www.cs.duke.edu/courses/spring14/compsci290/assignments/lab02.html。在给定的链接中,它使用与文档相同的单词,但我需要使用我提到的words集。

如果文档中存在特定的单词,则将tf-idf值放入矩阵中,否则将0放入矩阵中。

你知道我该怎么构建这样的矩阵吗?Python将是最好的,但R也很受欢迎。

我正在使用以下代码,但不确定我做的是不是正确的事情。我的代码是:

代码语言:javascript
复制
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords


train_set = "The sky is blue.", "The sun is bright.", "The sun in the sky is bright." #Documents
test_set = ["sky","land","sea","water","sun","moon"] #Query
stopWords = stopwords.words('english')

vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer

trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
#print 'Fit Vectorizer to train set', trainVectorizerArray
#print 'Transform Vectorizer to test set', testVectorizerArray

transformer.fit(trainVectorizerArray)
#print
#print transformer.transform(trainVectorizerArray).toarray()

transformer.fit(testVectorizerArray)
#print 
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()

我得到了非常荒谬的结果(值只有01,而我期望的值在0到1之间)。

代码语言:javascript
复制
[[ 0.  0.  1.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  1.]
 [ 0.  0.  0.  0.]
 [ 1.  0.  0.  0.]]   

我也可以使用其他的库来计算tf-idf。我只想要一个我上面提到的正确的矩阵。

EN

回答 2

Stack Overflow用户

发布于 2014-06-03 02:52:20

R解决方案可能如下所示:

代码语言:javascript
复制
library(tm)
docs <- c(D1 = "The sky is blue.",
          D2 = "The sun is bright.",
          D3 = "The sun in the sky is bright.")
dict <- c("sky","land","sea","water","sun","moon")
mat <- TermDocumentMatrix(Corpus(VectorSource(docs)), 
                          control=list(weighting =  weightTfIdf, 
                                       dictionary = dict))
as.matrix(mat)[dict, ]
#         Docs
# Terms          D1        D2        D3
#   sky   0.5849625 0.0000000 0.2924813
#   land  0.0000000 0.0000000 0.0000000
#   sea   0.0000000 0.0000000 0.0000000
#   water 0.0000000 0.0000000 0.0000000
#   sun   0.0000000 0.5849625 0.2924813
#   moon  0.0000000 0.0000000 0.0000000
票数 2
EN

Stack Overflow用户

发布于 2014-06-03 03:45:14

我相信你想要的是

代码语言:javascript
复制
vectorizer = TfidfVectorizer(stop_words=stopWords, vocabulary=test_set)
matrix = vectorizer.fit_transform(train_set)

(正如我前面所说的,这不是一个测试集,这是一个词汇表。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23999170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档