是否有必要/适当的计算tf-idf作为LDA(Gensim)的预处理?

时间:2016-02-19 09:57:59

标签: python tf-idf lda gensim

我是LDA的新手,我有三个问题。我想用LDA对我的文本(标签)进行分类。首先,我过滤仅由一个用户使用的单词,机器标签,仅包含频率小于3的数字和标签的标签。 然后,我使用Elbow方法计算主题数量,然后我得到内存错误(这将是第三个问题)。因此,Elbow方法建议的主题数量为8(我已经过滤了一些标签来克服内存问题,但我将来需要将它应用于更大的数据集)。

  1. 我应该使用tf-idf作为LDA的预处理步骤吗?或者,如果我过滤"无用的"标签在它没有意义之前?我想我不明白LDA究竟发生了什么。

    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]
    tfidf = models.TfidfModel(corpus)
    corpus_tfidf = tfidf[corpus]
    lda = ldamodel.LdaModel(corpus_tfidf, id2word=dictionary, alpha = 0.1, num_topics=8)
    corpus_lda = lda[corpus_tfidf]
    
  2. 使用LSI验证主题质量是否有意义?据我所知,LSI是一种减少维数的方法,因此我使用它来应用K-Means并查看主题的8个群集是否实际上看起来像群集。但说实话,我真的不明白我到底想象的是什么。

    lsi = models.LsiModel(corpus_lda, id2word=dictionary, num_topics=2)
    lsi_coord = "file.csv"
    fcoords = codecs.open(lsi_coord,'w','utf-8')
    for vector in lsi[corpus_lda]:
        if len(vector) != 2:
        continue
        fcoords.writelines("%6.12f\t%6.12f\n" % (vector[0][1],vector[1][1]))
    fcoords.close()
    num_topics = 8
    X = np.loadtxt(lsi_coord, delimiter="\t")
    my_kmeans = KMeans(num_topics).fit(X)
    k_means_labels = my_kmeans.labels_
    k_means_cluster_centers = my_kmeans.cluster_centers_
    colors = ['b','g','r','c','m','y','k','greenyellow']
    for k, col in zip(range(num_topics), colors):
    my_members = k_means_labels == k
    plt.scatter(X[my_members, 0], X[my_members, 1], s=30, c=colors[k], zorder=10)
    cluster_center = k_means_cluster_centers[k]
    plt.scatter(cluster_center[0], cluster_center[1], marker='x', s=30, linewidths=3, color='r', zorder=10)
    plt.title('K-means clustering')
    plt.show()
    
  3. 内存问题。我正在尝试创建一个矩阵,其中包含每个唯一术语的值。因此,如果该术语不在文档中,则它变为零。因此它是一个稀疏矩阵,因为我有大约1300个唯一的术语,每个文档大约有5.并且在转换为np.array时会出现内存问题。我想我必须以某种方式优化矩阵。

     # creating term-by-document matrix
    Y = []
    for z in corpus_lda:
        Y1=[]
        temp_dict={}
        for g in z:
            temp_dict.update({g[0]:g[1]})
         counter=0
         while counter < len(dictionary.keys()):
            if counter in temp_dict.keys():
                Y1.append(temp_dict[counter])
            else:
                Y1.append(0)
            counter+=1
        Y.append(Y1)
    Y = np.array(Y)
    
  4. 我从这里获取以下代码:Calculating the percentage of variance measure for k-means?

        K = range(1,30) # amount of clusters 
        KM = [kmeans(Y,k) for k in K] 
        KM = []
        for k in K:
            KM_result = kmeans(Y,k)
            KM.append(KM_result)
    
        centroids = [cent for (cent,var) in KM]
    
        scipy.spatial.distance import cdist
        D_k = [cdist(Y, cent, 'euclidean') for cent in centroids] 
        cIdx = [np.argmin(D,axis=1) for D in D_k]
        dist = [np.min(D,axis=1) for D in D_k]
        avgWithinSS = [sum(d)/Y.shape[0] for d in dist]  
        kIdx = 8
    
        # elbow curve
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.plot(K, avgWithinSS, 'b*-')
        ax.plot(K[kIdx], avgWithinSS[kIdx], marker='o', markersize=12, markeredgewidth=2, markeredgecolor='r', markerfacecolor='None')
        plt.grid(True)
        plt.xlabel('Number of clusters')
        plt.ylabel('Average within-cluster sum of squares')
        plt.title('Elbow for KMeans clustering')
    

    对任何问题的任何想法都非常感谢!

0 个答案:

没有答案