【问题标题】:A practical example of GSDMM in python?python中GSDMM的一个实际例子?
【发布时间】:2020-05-30 21:17:06
【问题描述】:

我想使用 GSDMM 将主题分配给我数据集中的一些推文。我发现的唯一示例(12)不够详细。我想知道您是否知道显示如何使用 python 实现 GSDMM 的来源(或足够关心制作一个小示例)。

【问题讨论】:

  • 只需要代码链接吗?
  • 有总比没有好。但至少对该过程进行简要说明是理想的。

标签: python lda topic-modeling tweets


【解决方案1】:

我终于为 GSDMM 编译了我的代码,并将它从头放在这里以供其他人使用。希望这可以帮助。我试图对重要部分发表评论:

# Imports
import random

import numpy as np
from gensim.models.phrases import Phraser, Phrases
from gensim.utils import simple_preprocess
from gsdmm import MovieGroupProcess


# data
data = ...

# stop words
stop_words = ...

# turning sentences into words
data_words =[]
for doc in data:
    doc = doc.split()
    data_words.append(doc)

# create vocabulary
vocabulary = ...

# Removing stop Words
stop_words.extend(['from', 'rt'])

def remove_stopwords(texts):
    return [
        [
            word
            for word in simple_preprocess(str(doc))
            if word not in stop_words
        ]
        for doc in texts
    ]

data_words_nostops = remove_stopwords(vocabulary)

# building bi-grams 
bigram = Phrases(vocabulary, min_count=5, threshold=100) 
bigram_mod = Phraser(bigram)
print('done!')

# Form Bigrams
data_words_bigrams = [bigram_mod[doc] for doc in data_words_nostops]

# lemmatization
pos_to_use = ['NOUN', 'ADJ', 'VERB', 'ADV']
data_lemmatized = []
for sent in data_words_bigrams:
    doc = nlp(" ".join(sent)) 
    data_lemmatized.append(
        [token.lemma_ for token in doc if token.pos_ in pos_to_use]
    )
      
docs = data_lemmatized
vocab = set(x for doc in docs for x in doc)

# Train a new model 
random.seed(1000)
# Init of the Gibbs Sampling Dirichlet Mixture Model algorithm
mgp = MovieGroupProcess(K=10, alpha=0.1, beta=0.1, n_iters=30)

vocab = set(x for doc in docs for x in doc)
n_terms = len(vocab)
n_docs = len(docs)

# Fit the model on the data given the chosen seeds
y = mgp.fit(docs, n_terms)

def top_words(cluster_word_distribution, top_cluster, values):
    for cluster in top_cluster:
        sort_dicts = sorted(
            mgp.cluster_word_distribution[cluster].items(),
            key=lambda k: k[1],
            reverse=True,
        )[:values]
        print('Cluster %s : %s'%(cluster,sort_dicts))
        print(' — — — — — — — — — ')

doc_count = np.array(mgp.cluster_doc_count)
print('Number of documents per topic :', doc_count)
print('*'*20)

# Topics sorted by the number of document they are allocated to
top_index = doc_count.argsort()[-10:][::-1]
print('Most important clusters (by number of docs inside):', top_index)
print('*'*20)


# Show the top 10 words in term frequency for each cluster 
top_words(mgp.cluster_word_distribution, top_index, 10)


希望这会有所帮助!

编辑:

链接

  1. gensim 模块
  2. Python library gsdmm

【讨论】:

    【解决方案2】:

    我也在试验 GSDMM 并遇到了同样的问题,就是网上没有多少(我找不到比你更多的东西,当然除了一些使用它的论文)。如果您查看 GSDMM GitHub 存储库的代码,您会发现它是一个非常小的存储库,只有几个功能。这些基本上都用于数据科学的教程中,所以我认为您不会错过任何东西。

    如果您有具体问题,请随时提问!

    编辑:如果您遵循有关数据科学的教程,您会意识到这是一个不一致且未完成的项目。缺少一些辅助函数,并且算法未正确使用。作者使用K=10 运行它,最终得到 10 个集群。如果你增加K(你应该)那么集群的数量会高于10,所以会有一点作弊发生。

    【讨论】:

    • 我在下面添加了对我有用的代码。现在,我正在寻找一种方法来找到每个文本属于一个集群的概率,以及一种数学度量来找到最佳集群数量(如连贯性分数)。你能想到什么吗?
    • 嗨@Pie-ton,我使用的 GSDMM python 实现(我想你也使用它)有一个内置函数mgp.score,你可以在其中看到算法的确定程度将输入文本分配给集群。我使用算法对所有输入文档的确定程度的平均值来比较不同的超参数。这是我自己想出的一个指标,因为我有和你一样的挣扎:)
    【解决方案3】:

    GSDMM (Gibbs Sampling Dirichlet Multinomial Mixture) 是一个简短的文本 聚类模型。它本质上是一个修改过的 LDA (Latent Drichlet 分配)假设一个文件,如推文或任何其他 文本包含一个主题。

    GSDMM

    LDA

    地址:github.com/da03/GSDMM

    import numpy as np
    from scipy.sparse import lil_matrix
    from scipy.sparse import find
    import math
    
    class GSDMM:
        def __init__(self, n_topics, n_iter, random_state=910820, alpha=0.1, beta=0.1):
            self.n_topics = n_topics
            self.n_iter = n_iter
            self.random_state = random_state
            np.random.seed(random_state)
            self.alpha = alpha
            self.beta = beta
        def fit(self, X):
            alpha = self.alpha
            beta = self.beta
    
            D, V = X.shape
            K = self.n_topics
    
            N_d = X.sum(axis=1)
            words_d = {}
            for d in range(D):
                words_d[d] = find(X[d,:])[1]
    
            # initialization
            N_k = np.zeros(K)
            M_k = np.zeros(K)
            N_k_w = lil_matrix((K, V), dtype=np.int32)
    
            K_d = np.zeros(D)
    
            for d in range(D):
                k = np.random.choice(K, 1, p=[1.0/K]*K)[0]
                K_d[d] = k
                M_k[k] = M_k[k]+1
                N_k[k] = N_k[k] + N_d[d]
                for w in words_d[d]:
                    N_k_w[k, w] = N_k_w[k,w]+X[d,w]
    
            for iter in range(self.n_iter):
                print 'iter ', iter
                for d in range(D):
                    k_old = K_d[d]
                    M_k[k_old] -= 1
                    N_k[k_old] -= N_d[d]
                    for w in words_d[d]:
                        N_k_w[k_old, w] -= X[d,w]
                    # sample k_new
                    log_probs = [0]*K
                    for k in range(K):
                        log_probs[k] += math.log(alpha+M_k[k])
                        for w in words_d[d]:
                            N_d_w = X[d,w]
                            for j in range(N_d_w):
                                log_probs[k] += math.log(N_k_w[k,w]+beta+j)
                        for i in range(N_d[d]):
                            log_probs[k] -= math.log(N_k[k]+beta*V+i)
                    log_probs = np.array(log_probs) - max(log_probs)
                    probs = np.exp(log_probs)
                    probs = probs/np.sum(probs)
                    k_new = np.random.choice(K, 1, p=probs)[0]
                    K_d[d] = k_new
                    M_k[k_new] += 1
                    N_k[k_new] += N_d[d]
                    for w in words_d[d]:
                        N_k_w[k_new, w] += X[d,w]
            self.topic_word_ = N_k_w.toarray()
    

    【讨论】:

    • 谢谢,但我更多的是寻找一些实际示例,例如您通常在媒体或数据科学中看到的示例。 LDA 有很多,但 GSDMM 很少
    • 我给你发了一个正确的链接,如果他们还不够,请告诉我。
    • 谢谢。我需要一个关于如何应用 GSDMM 使用 python 将主题分配给短文本的教程。例如,必须编写什么代码以及如何使用 GSDMM 包(如何调整 alpha 和 beta 值等)才能得出最终答案。
    • 我明白你想要什么,所以正如我提到的,有 LDA 它是 GSDMM 的母亲,所以让我们从 LDA 的许多样本开始: kaggle.com/search?q=Lda 你可以看到 alpha 和 beta 将如何在那里调整等等。
    【解决方案4】:

    据我了解,您拥有代码 https://github.com/rwalk/gsdmm,但您需要决定如何应用它。

    它是如何工作的?

    你可以下载论文A dirichlet multinomial mixture model-based approach for short text clustering,它说明聚类搜索相当于选桌游戏。图像有一群学生,并希望根据他们对电影的兴趣将他们分组在桌子上。每个学生(=item)在每一轮中都切换到一个桌子(=cluster),桌子上有类似电影的学生并且很受欢迎。 Alpha 控制一个因素,该因素决定了一个表在为空时删除的难易程度(低 alpha = 更少的表)。小 betas 表示根据与表的相似性而不是根据表的流行度来选择表。对于短文本聚类,您使用文字而不是电影。

    Alpha、Beta、迭代次数

    因此,低 alpha 会导致包含多个单词的集群,而高 alpha 会导致包含更多单词的更少集群。高 beta 会导致流行的集群,而低 beta 会导致相似的集群(人口密度不高)。您需要的参数取决于数据集。集群的数量主要由 beta 控制,但 alpha 也(如前所述)有影响。 迭代次数似乎在 20 次迭代后稳定,但 10 次也可以。

    数据准备过程

    在训练算法之前,您需要创建一个干净的数据集。为此,您将每个文本转换为小写,删除非 ASCII 字符和 stop-words,然后应用 stemminglemmatisation。在新样本上执行此过程时,您还需要应用此过程。

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 2010-10-13
      • 2016-10-27
      • 2011-04-13
      • 1970-01-01
      • 2023-03-26
      • 2011-02-01
      • 2019-06-04
      相关资源
      最近更新 更多