Estabilidade de tópicos em modelos de tópicos

23

Estou trabalhando em um projeto no qual desejo extrair algumas informações sobre o conteúdo de uma série de ensaios abertos. Nesse projeto em particular, 148 pessoas escreveram ensaios sobre uma organização hipotética de estudantes como parte de um experimento maior. Embora no meu campo (psicologia social), a maneira típica de analisar esses dados seja codificar os ensaios manualmente, eu gostaria de fazer isso quantitativamente, uma vez que a codificação manual é trabalhosa e um pouco subjetiva demais para o meu trabalho. gosto.

Durante minhas investigações sobre maneiras de analisar quantitativamente os dados de resposta livre, deparei-me com uma abordagem chamada modelagem de tópicos (ou Alocação de Dirichlet Latente, ou LDA). A modelagem de tópicos utiliza uma representação de palavras-chave de seus dados (uma matriz termo-documento) e usa informações sobre as co-ocorrências de palavras para extrair os tópicos latentes dos dados. Essa abordagem parece perfeita para minha aplicação.

Infelizmente, ao aplicar a modelagem de tópicos aos meus dados, descobri dois problemas:

  1. Os tópicos descobertos pela modelagem de tópicos às vezes são difíceis de interpretar
  2. Quando eu executo meus modelos de tópicos com uma semente aleatória diferente, os tópicos parecem mudar drasticamente

A edição 2, em particular, me preocupa. Portanto, tenho duas perguntas relacionadas:

  1. Existe algo que eu possa fazer no procedimento LDA para otimizar meu procedimento de ajuste de modelo para interpretabilidade e estabilidade? Pessoalmente, não me importo muito em encontrar o modelo com a menor perplexidade e / ou melhor ajuste do modelo - quero principalmente usar esse procedimento para me ajudar a entender e caracterizar o que os participantes deste estudo escreveram em seus ensaios. No entanto, certamente não quero que meus resultados sejam um artefato da semente aleatória!
  2. Relacionado à pergunta acima, existem padrões para a quantidade de dados que você precisa para fazer um LDA? A maioria dos artigos que vi que utilizaram esse método analisam grandes corpora (por exemplo, um arquivo de todos os artigos científicos dos últimos 20 anos), mas, como estou usando dados experimentais, meu corpus de documentos é muito menor.

Publiquei os dados do ensaio aqui para quem quer sujar as mãos e colei o código R que estou usando abaixo.

require(tm)
require(topicmodels)

# Create a corpus from the essay 
c <- Corpus(DataframeSource(essays))
inspect(c)

# Remove punctuation and put the words in lower case
c <- tm_map(c, removePunctuation)
c <- tm_map(c, tolower)

# Create a DocumentTermMatrix.  The stopwords are the LIWC function word categories
# I have a copy of the LIWC dictionary, but if you want to do a similar analysis,
# use the default stop words in tm
dtm <- DocumentTermMatrix(c, control = list(stopwords = 
  c(dict$funct, dict$pronoun, dict$ppron, dict$i, dict$we, dict$you, dict$shehe, 
    dict$they, dict$inpers, dict$article, dict$aux)))

# Term frequency inverse-document frequency to select the desired words
term_tfidf <- tapply(dtm$v/rowSums(as.matrix(dtm))[dtm$i], dtm$j, mean) * log2(nDocs(dtm)/colSums(as.matrix(dtm)))
summary(term_tfidf)

dtm <- dtm[, term_tfidf >= 0.04]

lda <- LDA(dtm, k = 5, seed = 532)
perplexity(lda)
(terms <- terms(lda, 10))
(topics <- topics(lda))

Editar:

Eu tentei modificar nstartcomo sugerido por Solha nos comentários. Infelizmente, como mostrado abaixo, até definir nstart1000 resultados em tópicos que variam bastante de semente aleatória para semente aleatória. Apenas para enfatizar novamente, a única coisa que estou mudando na estimativa dos dois modelos abaixo é a semente aleatória usada para iniciar a estimativa do modelo, e ainda assim os tópicos não parecem consistentes nessas duas execuções.

lda <- LDA(dtm, k = 5, seed = 535, control = list(nstart = 1000))
(terms <- terms(lda, 10))

      Topic 1         Topic 2      Topic 3      Topic 4       Topic 5      
 [1,] "international" "ethnicity"  "free"       "credit"      "kind"       
 [2,] "communicate"   "true"       "team"       "mandatory"   "bridge"     
 [3,] "gain"          "asians"     "cooperate"  "music"       "close"      
 [4,] "use"           "hand"       "order"      "seen"        "deal"       
 [5,] "big"           "hold"       "play"       "barrier"     "designed"   
 [6,] "communication" "effective"  "big"        "stereotypes" "effort"     
 [7,] "america"       "emphasis"   "beginning"  "asians"      "implemented"
 [8,] "chinese"       "halls"      "china"      "fantastic"   "websites"   
 [9,] "ethnicity"     "minorities" "difference" "focusing"    "planned"    
[10,] "networks"      "population" "easier"     "force"       "body"

lda <- LDA(dtm, k = 5, seed = 536, control = list(nstart = 1000))
(terms <- terms(lda, 10))

      Topic 1       Topic 2         Topic 3        Topic 4       Topic 5    
 [1,] "kind"        "international" "issue"        "willing"     "play"     
 [2,] "easier"      "ethnicity"     "close"        "use"         "trying"   
 [3,] "gain"        "communication" "currently"    "hand"        "unity"    
 [4,] "websites"    "communicate"   "implemented"  "networks"    "decision" 
 [5,] "credit"      "bridge"        "particularly" "stereotypes" "gap"      
 [6,] "effort"      "america"       "credit"       "communicate" "normally" 
 [7,] "barriers"    "connection"    "fulfill"      "came"        "asians"   
 [8,] "effects"     "kind"          "grew"         "asians"      "created"  
 [9,] "established" "order"         "perspectives" "big"         "effective"
[10,] "strangers"   "skills"        "big"          "budget"      "prejudice"
Patrick S. Forscher
fonte
2
Obrigado por compartilhar seus dados! Foi muito interessante olhar. Não tenho uma boa resposta para suas perguntas, mas quero sugerir algumas coisas. Para a pergunta 1, você pode tentar ajustar os parâmetros de controle na LDAfunção no topicmodelspacote. Em particular, você pode tentar nstartaumentar. Isso é garantido para tornar seus resultados mais estáveis, porque a função LDA será executada repetidamente com diferentes sementes aleatórias e retornará o melhor resultado. Infelizmente, aumentando nstartpara, digamos, 1000 vai fazer o algoritmo que 1000 vezes mais trabalho (continuação)
Flounderer
1
então será muito mais lento. E não há garantia de que seja suficientemente estável . Re: ambas as perguntas, parece-me que o LDA é realmente projetado para classificar documentos invisíveis quando há muitos dados para um ser humano processar. Para isso, não há problema se o algoritmo VEM fornecer apenas uma resposta "suficientemente boa", que pode variar de uma execução para outra. Mas para você, isso não é desejável e, portanto, o LDA pode não ser a melhor escolha. Há alguns excelentes alternativas nas primeiras palestras de Shalizi está claro aqui: stat.cmu.edu/~cshalizi/350 , por exemplo, você poderia converter cada (continuação)
Flounderer
2
ensaio para um vetor de palavras-chave e, em seguida, faça um PCA nos resultados e, em seguida, procure por clusters. Quanto a saber se o seu corpus é grande o suficiente, para ser honesto, não ficaria surpreso se for grande demais para o VEM fornecer resultados confiáveis. Talvez eu seja apenas amargo, mas gastei muito tempo tentando fazer com que esse método funcionasse para outro modelo por autores semelhantes, e era completamente inconsistente de uma corrida para outra, mesmo usando exemplos minúsculos. Não existem muitos artigos que discutam a escolha de pontos de partida para algoritmos como este, até onde eu sei.
Flounderer
Solha, muito obrigado pela sua contribuição! É um pouco decepcionante para mim ouvir que não há mais diretrizes sobre o LDA especificamente, mas suponho que isso venha com o território de um método não supervisionado. Vou tentar ajustar nstarte olhar o site do curso para ver se algum deles produz algo útil. (BTW, se você inserir seus comentários em uma resposta, vou votar. Gostaria de ver se mais alguém tem algum conselho antes de aceitar qualquer coisa, mas acho que seus comentários são mais que suficientes para contar como resposta).
Patrick S. Forscher
Sinto sua dor de grunhido nas ciências sociais, Patrick, mas acho que sua abordagem está errada para começar. Se você quiser usar testes estatísticos, precisará que os humanos codifiquem uma parte deles para obter taxas de erro de classificação, você (pessoalmente) fez isso? Nesse caso, você saberá quais recursos são mais importantes e poderá criar / escolher um algoritmo melhor.
Indolering 07/07

Respostas:

6

Para minha própria curiosidade, apliquei um algoritmo de clustering no qual estou trabalhando neste conjunto de dados.

Eu temporariamente colocar-se os resultados aqui (escolha o conjunto de dados de ensaios).

Parece que o problema não são os pontos de partida ou o algoritmo, mas os dados. Você pode "razoavelmente" (subjetivamente, na minha experiência limitada) obter bons clusters, mesmo com 147 instâncias, desde que haja alguns tópicos / conceitos / temas / clusters ocultos (como você gostaria de chamar).

Se os dados não tiverem tópicos bem separados, não importa qual seja o algoritmo usado, você poderá não obter boas respostas.

Siddharth Gopal
fonte
@ Siddharth.Gopal Muito obrigado pela resposta! É verdade que eu esperaria alguma sobreposição nos agrupamentos, uma vez que todos os participantes estão descrevendo uma organização hipotética de estudantes (que chamamos de "BadgerConnect"). Portanto, ao contrário de, por exemplo, uma aplicação de modelagem de tópicos em artigos da Science, onde alguns dos tópicos são muito diferentes de papel para papel, os tópicos são todos um pouco semelhantes. No entanto, é verdade que alguns dos ensaios são a favor do BadgerConnect e outros são escritos contra o BadgerConnect.
Patrick S. Forscher
Também é verdade que os ensaios variam amplamente no tipo de argumento que apresentam e como os argumentos são apresentados. Eu gostaria de capturar parte dessa variabilidade, se possível. Você tem alguma ideia de que é possível captar algumas dessas distinções (no mínimo, a diferença entre ensaios a favor e ensaios contra esse hipotético programa para estudantes)? Além disso, seus resultados de agrupamento foram estáveis ​​quando você usou sementes aleatórias diferentes?
Patrick S. Forscher
1
1. Se você está puramente preocupado com a estabilidade do algoritmo - tente executá-lo várias vezes e escolha o modelo com a maior probabilidade.
Siddharth Gopal
1
(embora a estabilidade pareça uma questão secundária aqui). 2. Dada a sua descrição do que você espera em termos de argumentos e opiniões, representar os ensaios como um saco de palavras não é uma boa ideia neste contexto. O modelo de tópico de fato pode não ser uma boa ferramenta para isso. Sugiro que você escolha algumas palavras-chave de seu interesse (como raça, comida, dormitório etc.) e tente analisar o sentimento da frase em que a palavra ocorre. Por exemplo, dê uma olhada aqui para uma demonstração.
Siddharth Gopal
1
O Python possui um excelente kit de ferramentas de PNL chamado nltk. Você pode querer dar uma olhada no que ele oferece. Em relação a tf-idf, 'tecnicamente', a entrada para LDA deve ser apenas contada por palavras, pois a distribuição multinomial não está definida para números reais arbitrários.
Siddharth Gopal
10
  1. A noção de "tópicos" nos chamados "modelos de tópicos" é enganosa. O modelo não sabe ou não foi projetado para conhecer "tópicos" semanticamente coerentes. Os "tópicos" são apenas distribuições sobre tokens (palavras). Em outras palavras, o modelo captura apenas a co-ocorrência de termos de alta ordem. Se essas estruturas significam algo ou não, não é o objetivo do modelo.

  2. O modelo "LDA" possui duas partes (essencialmente todos os modelos gráficos): a) definição do modelo eb) implementação de um algoritmo de inferência para inferir / parâmetros do modelo imobiliário. O que você mencionou pode ou não ser o problema do modelo "LDA", mas pode ser algum bug / erro / configuração incorreta da implementação específica que você usou (pacote R).

  3. Quase todas as implementações de "LDA" requerem alguma randomização. E pela natureza dos algoritmos de inferência (por exemplo, MCMC ou inferência variacional), você obterá soluções mínimas locais ou uma distribuição de muitas soluções. Então, resumindo, o que você observou é de alguma forma esperado.

Sugestões práticas:

  1. Experimente diferentes pacotes R: por exemplo, este pacote é feito pelo ex-aluno de David Blei. Ou tente outro ambiente, como este . Se você obtiver resultados semelhantes de todos esses pacotes estáveis, pelo menos, reduzirá um pouco o problema.

  2. Tente jogar um pouco sem remover palavras de parada. A lógica é que, essas palavras de paragem desempenham um papel importante na conexão de significados semânticos em um corpus tão pequeno (por exemplo, 100 ou mais artigos). Além disso, tente não filtrar as coisas.

  3. Tente jogar um pouco com hiper-parâmetros, como diferentes números de tópicos.

Artigos sobre coerências de tópicos:

  1. http://www.aclweb.org/anthology-new/D/D12/D12-1087.pdf

  2. http://people.cs.umass.edu/~wallach/publications/mimno11optimizing.pdf

Liangjie Hong
fonte
Obrigado pela sua resposta. Responderei aos seus comentários, um de cada vez. (1) Eu entendo que o modelo nada sobre temas sabe, mas a sua afirmação de que as estruturas descobertos por modelos tópico (e que se essas estruturas significa nada não é o propósito destes modelos) é diretamente contraditória com este artigo de revisão por David Blei, o criador de modelos de tópicos. Parece-me que o objetivo dos modelos de tópicos é exatamente ajudar a explorar / caracterizar dados textuais, que é exatamente o que eu quero fazer neste projeto.
Patrick S. Forscher
(2) Embora seja possível que meus resultados sejam devidos a um bug, acho que é mais provável que eles sejam causados ​​por algum tipo de erro no meu final (e se esse parece ser o caso, por favor, me diga!). Estou usando o topicmodelspacote no R, que é essencialmente uma interface R para o algoritmo original implementado por Blei e colegas.
Patrick S. Forscher
(3) Eu sei que o LDA exige alguma randomização, por isso não estou pedindo resultados exatos de execução a execução, mas acho razoável esperar tópicos semelhantes usando diferentes sementes aleatórias (de fato, acredito que essa é uma expectativa padrão quando as pessoas usam algoritmos baseados em randomização). O que eu quero saber é como alcançar a referida estabilidade nos resultados.
Patrick S. Forscher
@ PatrickS.Forscher Ao seu primeiro comentário: Não. É contraditório. O nome "tópicos" é o que nós, como seres humanos, colocamos rótulos nessas distribuições de palavras. Essa estrutura de cluster pode ou não estar relacionada a tópicos legíveis por humanos do mundo real. Existem vários artigos para introduzir coerência nos modelos de tópicos, a fim de atenuar o problema exato.
Liangjie Hong
@ PatrickS.Forscher Para seu segundo comentário: Tente alguma implementação diferente para ver se você obtém resultados semelhantes (resultados irracionais) ou não. Por exemplo, UMASS Mallet.
Liangjie Hong