Các tham số đầu vào để sử dụng phân bổ Dirichlet tiềm ẩn


17

Khi sử dụng mô hình chủ đề (Phân bổ Dirichlet tiềm ẩn), số lượng chủ đề là một tham số đầu vào mà người dùng cần chỉ định.

Theo tôi, chúng ta cũng nên cung cấp một tập hợp các chủ đề ứng cử viên mà quy trình Dirichlet phải lấy mẫu? Tôi hiểu có đúng không? Trong thực tế, làm thế nào để thiết lập loại chủ đề ứng cử viên này?

Câu trả lời:


21

Theo tôi biết bạn chỉ cần cung cấp một số chủ đề và kho văn bản. Không cần chỉ định một bộ chủ đề ứng cử viên, mặc dù có thể sử dụng một chủ đề, như bạn có thể thấy trong ví dụ bắt đầu ở cuối trang 15 của Grun và Hornik (2011) .

Cập nhật ngày 28 tháng 1 14. Bây giờ tôi làm mọi thứ hơi khác với phương pháp bên dưới. Xem ở đây để biết cách tiếp cận hiện tại của tôi: /programming//a/21394092/1036500

Một cách tương đối đơn giản để tìm số lượng chủ đề tối ưu mà không cần dữ liệu đào tạo là lặp qua các mô hình với số lượng chủ đề khác nhau để tìm số lượng chủ đề với khả năng đăng nhập tối đa, được cung cấp dữ liệu. Xem xét ví dụ này vớiR

# download and install one of the two R packages for LDA, see a discussion
# of them here: http://stats.stackexchange.com/questions/24441
#
install.packages("topicmodels")
library(topicmodels)
#
# get some of the example data that's bundled with the package
#
data("AssociatedPress", package = "topicmodels")

Trước khi đi thẳng vào việc tạo mô hình chủ đề và phân tích đầu ra, chúng ta cần quyết định số lượng chủ đề mà mô hình nên sử dụng. Đây là một hàm để lặp qua các số chủ đề khác nhau, lấy thông tin đăng nhập của mô hình cho từng số chủ đề và vẽ biểu đồ để chúng tôi có thể chọn ra số tốt nhất. Số lượng chủ đề tốt nhất là chủ đề có giá trị khả năng đăng nhập cao nhất để lấy dữ liệu mẫu được tích hợp trong gói. Ở đây tôi đã chọn để đánh giá mọi mô hình bắt đầu với 2 chủ đề mặc dù đến 100 chủ đề (việc này sẽ mất một chút thời gian!).

best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})

Bây giờ chúng ta có thể trích xuất các giá trị khả năng ghi nhật ký cho từng mô hình đã được tạo và chuẩn bị để vẽ nó:

best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))

best.model.logLik.df <- data.frame(topics=c(2:100), LL=as.numeric(as.matrix(best.model.logLik)))

Và bây giờ hãy lập một âm mưu để xem số lượng chủ đề có khả năng đăng nhập cao nhất xuất hiện:

library(ggplot2)
ggplot(best.model.logLik.df, aes(x=topics, y=LL)) + 
  xlab("Number of topics") + ylab("Log likelihood of the model") + 
  geom_line() + 
  theme_bw()  + 
  opts(axis.title.x = theme_text(vjust = -0.25, size = 14)) + 
  opts(axis.title.y = theme_text(size = 14, angle=90))

nhập mô tả hình ảnh ở đây

Có vẻ như nó ở đâu đó giữa 10 và 20 chủ đề. Chúng tôi có thể kiểm tra dữ liệu để tìm ra số lượng chính xác của các chủ đề với khả năng đăng nhập cao nhất như vậy:

best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
       topics        LL
12     13           -8525.234

Vì vậy, kết quả là 13 chủ đề phù hợp nhất cho những dữ liệu này. Bây giờ chúng ta có thể tiếp tục với việc tạo mô hình LDA với 13 chủ đề và nghiên cứu mô hình:

lda_AP <- LDA(AssociatedPress[21:30,], 13)   # generate the model with 13 topics 
get_terms(lda_AP, 5)                         # gets 5 keywords for each topic, just for a quick look
get_topics(lda_AP, 5)                        # gets 5 topic numbers per document

Và như vậy để xác định các thuộc tính của mô hình.

Cách tiếp cận này dựa trên:

Griffiths, TL và M. Steyvers 2004. Tìm kiếm các chủ đề khoa học. Kỷ yếu của Viện Hàn lâm Khoa học Quốc gia Hoa Kỳ 101 (Cung 1): 5228 bồi5235.


Tôi đã cập nhật mã cho điều này và lưu dưới dạng ý chính. có phương thức cốt truyện in theo mặc định. devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k") +1 câu trả lời hay.
Tyler Rinker

Bằng cách tăng k trong LDA, bạn đang mở rộng không gian tham số và các mô hình có k nhỏ hơn về cơ bản được lồng bên trong các mô hình có k cao hơn. Vì vậy, LL nên được tăng lên với k. Những gì bạn xảy ra với một vết sưng nhỏ xung quanh k = 13 có lẽ là do thuật toán VEM không hội tụ đến mức tối đa toàn cầu cho các mô hình phức tạp. Bạn sẽ có nhiều may mắn hơn với AIC hoặc BIC.
VitoshKa

Xin chào @Ben, câu trả lời thực sự hữu ích. Tôi có một câu hỏi về nó, khi bạn đang đánh giá mô hình với 2 - 100 chủ đề : best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)}). Tại sao bạn chỉ chọn 21:30 dữ liệu?
economist_Ayahuasca

Vì cách đây vài năm tôi đã đăng câu trả lời đó, tôi không thể nhớ chính xác. Nhưng có lẽ chỉ để giữ thời gian tính toán ngắn!
Ben

1
Bây giờ có pkg tốt đẹp này để tính toán số lượng chủ đề tối ưu: cran.r-project.org/web/packages/ldatuning
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.