绘制文档的tf-idf二维图表

19

我想绘制一个2D图,其中x轴是词项,y轴是我句子列表中的TFIDF得分(或文档ID)。我使用Scikit Learn的fit_transform()函数获取了Scipy矩阵,但我不知道如何使用该矩阵来绘制图形。我正在尝试绘制一个图来查看我的句子可以使用kmeans算法进行多好分类。

这是fit_transform(sentence_list)的输出:(文档ID,词项编号) tfidf得分

(0, 1023)   0.209291711271
(0, 924)    0.174405532933
(0, 914)    0.174405532933
(0, 821)    0.15579574484
(0, 770)    0.174405532933
(0, 763)    0.159719994016
(0, 689)    0.135518787598

这是我的代码:

sentence_list=["Hi how are you", "Good morning" ...]
vectorizer=TfidfVectorizer(min_df=1, stop_words='english', decode_error='ignore')
vectorized=vectorizer.fit_transform(sentence_list)
num_samples, num_features=vectorized.shape
print "num_samples:  %d, num_features: %d" %(num_samples,num_features)
num_clusters=10
km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1)
km.fit(vectorized)
PRINT km.labels_   # Returns a list of clusters ranging 0 to 10 

谢谢,


以下代码对您是否有效?如果您只需要查看简单的二维图形,那么它应该是有效的。http://matplotlib.org/examples/pylab_examples/simple_plot.html - Aleksander Lidtke
3个回答

41

当你使用词袋模型时,每个句子都在一个长度等于词汇表的高维空间中表示。如果你想将其表示为2D,则需要降低维度,例如使用两个主成分的PCA:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt

newsgroups_train = fetch_20newsgroups(subset='train', 
                                      categories=['alt.atheism', 'sci.space'])
pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
])        
X = pipeline.fit_transform(newsgroups_train.data).todense()

pca = PCA(n_components=2).fit(X)
data2D = pca.transform(X)
plt.scatter(data2D[:,0], data2D[:,1], c=data.target)
plt.show()              #not required if using ipython notebook

data2d

现在,您可以例如计算并绘制此数据上的群集进入:

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=2).fit(X)
centers2D = pca.transform(kmeans.cluster_centers_)

plt.hold(True)
plt.scatter(centers2D[:,0], centers2D[:,1], 
            marker='x', s=200, linewidths=3, c='r')
plt.show()              #not required if using ipython notebook

这里输入图片描述


1
我可以直接使用TfidfVectorizer而不是先用CountVectorizer再用TfidfTransformer吗? 那么管道的代码会像这样:pipeline = Pipeline([('tfidf',TfidfVectorizer())])吗? - jxn
8
我在运行plt.scatter(data2D[:,0], data2D[:,1], c=data.target)时出现了错误,具体出错原因是c=data.target。如果我想让散点图的颜色与kmeans聚类后发现的簇的颜色相符,我应该在data.target的位置使用什么?是kmeans.labels_吗?#这将返回一个列表。 - jxn
管道(Pipeline)用于串行执行多个转换器。如果您只有一个转换器,则不需要使用管道,直接使用该转换器即可。 - elyase
@elyase,您能否请看一下这个问题 https://stackoverflow.com/q/50334915/2508414? - OnePunchMan
4
请使用 "newsgroups_train.target" 替换 "data.target"。 - Manuel

2
在上一个回答中存在一些问题。因此,我调整了这些问题并将代码推送到这里。
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

newsgroups_train = fetch_20newsgroups(subset='train', 
                                      categories=['alt.atheism', 'sci.space'])

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
])        
X = pipeline.fit_transform(newsgroups_train.data).todense()

pca = PCA(n_components=2).fit(X)
data2D = pca.transform(X)
plt.scatter(data2D[:,0], data2D[:,1], c=newsgroups_train.target)
plt.show()

enter image description here

## Nearest neighbour
kmeans = KMeans(n_clusters=2).fit(X)
centers2D = pca.transform(kmeans.cluster_centers_)

# plt.hold(True)
plt.scatter(data2D[:,0], data2D[:,1], c=newsgroups_train.target)
plt.scatter(centers2D[:,0], centers2D[:,1], 
            marker='x', s=200, linewidths=3, c='r')
plt.show()

enter image description here


2

只需将变量赋值给标签,然后使用它来表示颜色。例如:km = Kmeans().fit(X) clusters = km.labels_.tolist() 然后c=clusters


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接