2014-06-26 22 views
7

EDIT: Tôi đã tìm thấy một vấn đề thú vị ở đây. This link cho thấy gensim sử dụng ngẫu nhiên trong cả hai bước đào tạo và suy luận. Vì vậy, những gì nó đề nghị ở đây là để thiết lập một hạt giống cố định để có được kết quả tương tự mỗi lần. Tại sao tôi nhận được cho mỗi chủ đề cùng một xác suất?Triển khai LDA gensim, khoảng cách giữa hai tài liệu khác nhau

Điều tôi muốn làm là tìm mọi người dùng twitter chủ đề của mình và tính toán sự giống nhau giữa người dùng twitter dựa trên những điểm tương đồng trong chủ đề. Có khả năng để tính toán các chủ đề tương tự cho mỗi người dùng trong gensim hoặc tôi có phải tính toán một từ điển của các chủ đề và cụm mỗi chủ đề người dùng?

Nói chung, đó là cách tốt nhất để so sánh hai người dùng twitter dựa trên khai thác mô hình chủ đề trong gensim? Mã của tôi là những điều sau đây:

def preprocess(id): #Returns user word list (or list of user tweet) 

     user_list = user_corpus(id, 'user_'+str(id)+'.txt') 
     documents = [] 
     for line in open('user_'+str(id)+'.txt'): 
       documents.append(line) 
     #remove stop words 
     lines = [line.rstrip() for line in open('stoplist.txt')] 
     stoplist= set(lines) 
     texts = [[word for word in document.lower().split() if word not in stoplist] 
        for document in documents] 
     # remove words that appear only once 
     all_tokens = sum(texts, []) 
     tokens_once = set(word for word in set(all_tokens) if all_tokens.count(word) < 3) 
     texts = [[word for word in text if word not in tokens_once] 
        for text in texts] 
     words = [] 
     for text in texts: 
      for word in text: 
       words.append(word) 

     return words 


    words1 = preprocess(14937173) 
    words2 = preprocess(15386966) 
    #Load the trained model 
    lda = ldamodel.LdaModel.load('tmp/fashion1.lda') 
    dictionary = corpora.Dictionary.load('tmp/fashion1.dict') #Load the trained dict 

    corpus = [dictionary.doc2bow(words1)] 
    tfidf = models.TfidfModel(corpus) 
    corpus_tfidf = tfidf[corpus] 
    corpus_lda = lda[corpus_tfidf] 

    list1 = [] 
    for item in corpus_lda: 
     list1.append(item) 

    print lda.show_topic(0) 
    corpus2 = [dictionary.doc2bow(words2)] 
    tfidf2 = models.TfidfModel(corpus2) 
    corpus_tfidf2 = tfidf2[corpus2] 
    corpus_lda2 = lda[corpus_tfidf2] 

    list2 = [] 
    for it in corpus_lda2: 
     list2.append(it) 

    print corpus_lda.show_topic(0) 

Returned xác suất chủ đề cho người dùng corpus (khi sử dụng như một corpus một danh sách các từ người dùng):

[(0, 0.10000000000000002), (1, 0.10000000000000002), (2, 0.10000000000000002), 
    (3, 0.10000000000000002), (4, 0.10000000000000002), (5, 0.10000000000000002), 
    (6, 0.10000000000000002), (7, 0.10000000000000002), (8, 0.10000000000000002), 
    (9, 0.10000000000000002)] 

Trong trường hợp tôi sử dụng một danh sách các tweets người dùng , Tôi lấy lại các chủ đề được tính toán cho mỗi tweet.

Câu hỏi 2: Có ý nghĩa nào sau đây: đào tạo mô hình LDA với một số người dùng twitter và tính toán chủ đề cho mọi người dùng (với mọi tập tin người dùng), sử dụng mô hình LDA được tính trước?

Trong ví dụ được cung cấp, list[0] trả về phân phối chủ đề có xác suất bằng nhau 0,1. Về cơ bản, mỗi dòng văn bản tương ứng với một tweet khác nhau. Nếu tôi tính toán kho văn bản với corpus = [dictionary.doc2bow(text) for text in texts], nó sẽ cho tôi xác suất cho mỗi tweet riêng biệt. Mặt khác, nếu tôi sử dụng corpus = [dictionary.doc2bow(words)] như ví dụ, tôi sẽ chỉ có tất cả các từ của người dùng dưới dạng văn bản. Trong trường hợp thứ hai, gensim trả về cùng xác suất cho tất cả các chủ đề. Vì vậy, đối với cả hai người dùng, tôi nhận được cùng một bản phân phối chủ đề.

Nếu văn bản người dùng văn bản là danh sách các từ hoặc danh sách câu (danh sách các tweet)?

Về việc triển khai Qi He và Jianshu Weng ở trang 264, nó nói rằng: chúng tôi tổng hợp các tweet được xuất bản bởi twitterer riêng lẻ thành một tài liệu lớn. Do đó, mỗi tài liệu tương ứng với một twitterer. Ok tôi bối rối, nếu tài liệu sẽ là tất cả các tweet của người dùng thì tập tin chứa nội dung gì?

Trả lời

2

Đã kiểm tra lại đề xuất sau here. Trước hết bạn phải tính toán mô hình LDA từ tất cả người dùng và sau đó với việc sử dụng các vector chiết xuất của doc rõ, được tính ở đây là

vec_bow = dictionary.doc2bow(doc.lower().split()) 
vec_lda = lda[vec_bow] 

Nếu bạn in như sau: print(vec_lda) bạn sẽ nhận được phân phối tài liệu vô hình cho các chủ đề mô hình lda.

+0

Có posibility trừ phân phối trên topivs để có được phân phối qua những lời ?? –

1

Theo tài liệu chính thức, Phân bổ Direntlet Latent, LDA là một sự chuyển đổi từ số lượng từ được tính vào một không gian chủ đề có chiều hướng thấp hơn.

Bạn có thể sử dụng LSI ở trên cùng của TFIDF, chứ không phải LDA. Nếu bạn sử dụng TFIDF trên LDA, thì nó sẽ tạo ra mỗi chủ đề gần như giống nhau, bạn có thể in và kiểm tra nó.

Đồng thời xem https://radimrehurek.com/gensim/tut2.html.

Các vấn đề liên quan