2015-07-21 16 views
9

Tôi đang sử dụng mô-đun Gensim HDP trên một bộ tài liệu.Quy trình Dirichlet phân cấp Gensim số chủ đề độc lập với kích thước hình ảnh

>>> hdp = models.HdpModel(corpusB, id2word=dictionaryB) 
>>> topics = hdp.print_topics(topics=-1, topn=20) 
>>> len(topics) 
150 
>>> hdp = models.HdpModel(corpusA, id2word=dictionaryA) 
>>> topics = hdp.print_topics(topics=-1, topn=20) 
>>> len(topics) 
150 
>>> len(corpusA) 
1113 
>>> len(corpusB) 
17 

Tại sao số lượng chủ đề độc lập với chiều dài lục phân?

Trả lời

4

@ user3907335 là chính xác đúng ở đây: HDP sẽ tính toán như nhiều chủ đề như mức cắt ngắn được giao. Tuy nhiên, có thể là do nhiều chủ đề trong số này về cơ bản không xác suất xảy ra. Để giúp với điều này trong công việc của riêng tôi, tôi đã viết một chức năng nhỏ tiện dụng thực hiện một ước tính sơ bộ về trọng lượng xác suất liên quan đến mỗi chủ đề. Lưu ý rằng đây chỉ là số liệu thô: nó không tính đến xác suất được liên kết với mỗi từ. Mặc dù vậy, nó cung cấp chỉ số khá tốt cho các chủ đề có ý nghĩa và không phải là:

import pandas as pd 
import numpy as np 

def topic_prob_extractor(hdp=None, topn=None): 
    topic_list = hdp.show_topics(topics=-1, topn=topn) 
    topics = [int(x.split(':')[0].split(' ')[1]) for x in topic_list] 
    split_list = [x.split(' ') for x in topic_list] 
    weights = [] 
    for lst in split_list: 
     sub_list = [] 
     for entry in lst: 
      if '*' in entry: 
       sub_list.append(float(entry.split('*')[0])) 
     weights.append(np.asarray(sub_list)) 
    sums = [np.sum(x) for x in weights] 
    return pd.DataFrame({'topic_id' : topics, 'weight' : sums}) 

Tôi giả sử bạn đã biết cách tính toán mô hình HDP. Một khi bạn có một mô hình HDP tính bằng gensim bạn gọi hàm như sau:

topic_weights = topic_prob_extractor(hdp, 500) 
2

Tôi chưa sử dụng gensim cho HDP, nhưng có khả năng là hầu hết các chủ đề trong kho nhỏ hơn có xác xuất cực kỳ thấp không? Bạn có thể thử in xác suất chủ đề không? Có thể, độ dài của mảng chủ đề không nhất thiết có nghĩa là tất cả các chủ đề đó thực sự được tìm thấy trong kho văn bản.

+1

không phải tất cả đều nằm trong 'chủ đề' bất kể xác suất – user86895

2

Tôi nghĩ bạn đã hiểu lầm hoạt động được thực hiện bằng phương pháp được gọi. Trực tiếp từ tài liệu bạn có thể thấy:

Bí danh cho show_topics() in các từ có thể xảy ra nhiều nhất cho chủ đề số lượng chủ đề cần đăng nhập. Đặt chủ đề = -1 để in tất cả các chủ đề.

Bạn được đào tạo các mô hình mà không chỉ định mức cắt ngắn trên số chủ đề và mặc định một là 150. Gọi print_topics với topics=-1 bạn sẽ nhận được 20 từ đầu cho mỗi chủ đề, trong trường hợp của bạn 150 chủ đề.

tôi vẫn là một newbie của thư viện, vì vậy có lẽ tôi' sai

+4

Trong khi tôi nghi ngờ bạn đúng, điều này không có ý nghĩa. HDP nên phỏng đoán số lượng chủ đề. Nó không có ý nghĩa rằng nó luôn luôn đi đến mức tối đa nó có thể, đặc biệt là cho 2 corpuses với một sự khác biệt kích thước như vậy. Nếu nó luôn luôn đi đến mức tối đa, về cơ bản nó là vô ích cho những gì nó được cho là phải làm, tôi chỉ có thể sử dụng LDA với N = 150 –

5

@ đang Aaron trên bị phá vỡ do gensim thay đổi API. Tôi viết lại và đơn giản hóa nó như sau. Hoạt động như của tháng 6 năm 2017 với gensim v2.1.0

import pandas as pd 

def topic_prob_extractor(gensim_hdp): 
    shown_topics = gensim_hdp.show_topics(num_topics=-1, formatted=False) 
    topics_nos = [x[0] for x in shown_topics ] 
    weights = [ sum([item[1] for item in shown_topics[topicN][1]]) for topicN in topics_nos ] 

    return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}) 
0

@ Aron và @Roko Mijic của phương pháp tiếp cận bỏ bê thực tế là chức năng show_topics lợi nhuận theo mặc định top 20 từ chỉ mỗi chủ đề. Nếu một trả về tất cả các từ soạn một chủ đề, tất cả các xác suất chủ đề gần đúng trong trường hợp đó sẽ là 1 (hoặc 0,999999). Tôi đã thử nghiệm với đoạn mã sau, đó là một sự thích nghi của @Roko Mijic của:

def topic_prob_extractor(gensim_hdp, t=-1, w=25, isSorted=True): 
    """ 
    Input the gensim model to get the rough topics' probabilities 
    """ 
    shown_topics = gensim_hdp.show_topics(num_topics=t, num_words=w ,formatted=False) 
    topics_nos = [x[0] for x in shown_topics ] 
    weights = [ sum([item[1] for item in shown_topics[topicN][1]]) for topicN in topics_nos ] 
    if (isSorted): 
     return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}).sort_values(by = "weight", ascending=False); 
    else: 
     return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}); 

Một tốt hơn, nhưng tôi không chắc chắn nếu 100% hợp lệ, cách tiếp cận là một trong những đề cập here.Bạn có thể nhận được trọng lượng đúng (vector alpha) của mô hình HDP như:

alpha = hdpModel.hdp_to_lda()[0]; 

Kiểm tra các chủ đề các chủ đề giá trị alpha tương đương là hơn logic hơn kiểm đếm lên trọng lượng của 20 từ đầu tiên của mỗi chủ đề để xấp xỉ xác suất sử dụng của nó trong dữ liệu.

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